2016-09-24 2 views
2

C++에서 SHA-1 구현을 작성하려고합니다. 웬일인지 내가 예상하고있는 결과와 다른 결과를 얻고있다.SHA-1의 C++ 구현에서 잘못된 해시가 발생했습니다.

입력 testa94a8fe5ccb19ba61c4c0873d391e987982fbbd3이됩니다.

대신 출력이 e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98입니다.

나는 다음과 같은 기능을 가지고

난 당신이에서 here을 볼 수 I이 올바른지 압축 기능의 끝이 다섯 개 가지 변수를 (이
// msg = original input 
// org_len = original length of input 
// output = uint8_t output[20]; 
sha1((uint8_t *)msg.c_str(), org_len, output); 

처럼 전화
void sha1(const uint8_t *org_msg, size_t org_len, uint8_t *digest) 

페이지 하단)

h0 = 10101001010010101000111111100101 
h1 = 11001100101100011001101110100110 
h2 = 00011100010011000000100001110011 
h3 = 11010011100100011110100110000111 
h4 = 10011000001011111011101111010011 

변수의 형식은 모두입니다.. 지금은 내가 위해 다음과 같은 기능을 가지고 uint8_t로 변환 할 :

void to_bytes(uint32_t val, uint8_t *bytes) { 
    bytes[0] = (uint8_t)val; 
    bytes[1] = (uint8_t)(val >> 8); 
    bytes[2] = (uint8_t)(val >> 16); 
    bytes[3] = (uint8_t)(val >> 24); 
} 

그리고 나는 마침내 출력과 같이 다음

to_bytes(h0, digest); 
to_bytes(h1, digest + 4); 
to_bytes(h2, digest + 8); 
to_bytes(h3, digest + 12); 
to_bytes(h4, digest + 16); 

과 같이 호출 :

for (size_t i = 0; i < 20; i++) { 
    printf("%2.2x", output[i]); 
} 

결과는 e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98입니다.

+1

'to_bytes'는 역순으로 출력됩니다. 'bytes [0]'는 처음 8 비트를 원할 때 입력의 마지막 8 비트를 가져옵니다. –

+0

감사합니다. 그것을 보지 못한 나를위한 어리 석음. 당신은 그것을 대답하고 그것을 똑딱 거릴 것입니다. – Cartman123

+0

도와 드리겠습니다 :) –

답변

3

to_bytes은 역 출력을 생성합니다. bytes[0]은 처음 8 비트를 원하는 동안 입력의 마지막 8 비트를 가져옵니다.

관련 문제