2016-09-24 10 views
2

私はSHA-1の実装をC++で記述しようとしています。何らかの理由で私は期待していたものとは異なる出力を得ています。SHA-1のC++実装で間違ったハッシュ

入力testa94a8fe5ccb19ba61c4c0873d391e987982fbbd3になります。

代わりに私は出力e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98を得ています。

私はあなたがでhereを見ることができるように私が正しい圧縮機能(の終わりにこれらの5つの変数を持って

// 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ビットが必要です。

関連する問題