2014-08-26 8 views
0
#define BASE32_ONIONLEN 16 
#define BASE32_ALPHABET "abcdefghijklmnopqrstuvwxyz234567" 

void base32_onion(char *dst, unsigned char *src) { // base32-encode hash 
    uint8_t byte = 0, // dst location 
    offset = 0; // bit offset 
    for(; byte < BASE32_ONIONLEN; offset += 5) { 
     if(offset > 7) { 
      offset -= 8; 
      src++; 
     } 
     dst[byte++] = BASE32_ALPHABET[(htobe16(*(uint16_t*)src) >> (11-offset)) 
             & (uint16_t)0x001F]; 
    } 
    dst[byte] = '\0'; 
} 

dst[byte++]으로 시작하는 부분을 이해하는 데 문제가 있습니다. 저는 파이썬 프로그래머입니다. 모든 타입 변환이 어떻게 작동하는지 정확히 모르겠습니다. src은 1 바이트를 가리 킵니까? (uint16_t*)은이를 2 바이트 값의 포인터로 변환합니까? 그래서 그게 바이트를 src에 두 바이트 값의 시작, 또는 끝을합니까? >> (11-offset)은 무엇인가요? N 비트만큼 오른쪽으로 시프트 값이 C 함수는 어떻게 작동합니까?

+0

BASE32_ALPHABET은 'abcdefghijklmnopqrstuvwxyz234567' BASE32_ONION 16 – Broseph

+0

가 아닌 주석에 해당하는 정보를 포함하십시오입니다. –

+0

기본적으로'BASE32_ALPHABET'의 새로운 문자열'dst'를 논리에 따라 뒤죽박죽으로 만듭니다. 첫 번째 경우 'offset = 0''byte = 0'을 가져 와서 논리를 살펴보십시오. (당신은'htobe16'의 반환이 필요합니다), 매번 패스 할 때'BASE32_ALPHABET'의 문자/숫자를 선택할 것입니다. –

답변

0
uint16_t t1, t2, t3; 
uint8_t t4, t5, t6; 

t1 = *(uint16_t*)src;  // Whatever src is pointing to, treat the next 
          // 16 bits as an unsigned number 
          // Safer would be memcpy(&t1, src, sizeof(t1)); 
t2 = htobe(t1);    // Guessing this changes the value to have big-endian 
          // byte order 
t3 = t2 >> (11-offset);  // Shift t2 to the right by (11-offset) bits 
t4 = t3 & (uint16_t)0x001F; // t4 contains the lower 5 bits of t3 
t5 = BASE32_ALPHABET[t4]; // t5 gets the t4-th byte of the base32 alphabet 
t6 = byte++;    // t6 gets the value of byte, byte's value is then 
          // incremented, so t6 + 1 == byte 
dest[t6] = t5;    // t5 is assigned to dest[t6] 

비트 2 N하여 값을 나눈 동일하다. 바람직하게는 BASE32_ALPHABET`와`BASE32_ONION``의 선언을 보여 -

+0

나는 비트 시프 팅이 무엇인지 알기 때문에 왜 코드가'(11-offset)'을하고 나서't2 >> (11-offset)'의 처음 5 비트만을 보는 지 모르겠습니다. 고마워, 고마워. – Broseph

+2

이것은 base32 양파 해시 알고리즘의 본질 일뿐입니다. 리버스 엔지니어링에 시간을 할애 할 수는 있지만 월급을 내지는 못합니다. 바라기를 바 쳤을 때 나머지 부분을 알아 내려고 동기 부여하는 데 충분합니다. – jxh

관련 문제