2016-08-28 11 views
1

私はC++でMD5ハッシュ関数を実装しようとしており、いくつかの16進値であるいくつかのウェブサイトからオンラインで見つかった入力値に対して正しい結果を得ようとしています。この時点まで、私はそれが正しく機能するようになった。しかし、私はASCII文字列で同じことをしようとすると、私は運がないと本当に私が他に何をすべきかを理解することができません。MD5ハッシング中の文字列の埋め込み

私がやった最初のことは、ASCII文字列を16進数に変換し、最後に0x00を1つ追加した後に0x00の束を、最後の8バイトに16進数の付加されていないメッセージの長さを付加することです。

たとえば、「test123」は16進数で「0x74,0x65,0x73,0x74,0x31,0x32,0x33」と表され、バイトの長さは7です。次に、ハッシュ関数への入力として使用されるバイト配列私は、それは以下の通りである

const uint8_t test123Array[64] = { 
    0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07 
}; 

を得る限りであると私はハッシュ関数を適用したとき、私が得る結果は、私がオンラインハッシュジェネレータのウェブサイトを介して取得結果に対し、

e7 54 fa ea 1e d7 69 ba 85 59 62 bf 16 e9 98 48 

あるものですlike

cc 03 e7 47 a6 af bb cb f8 be 76 68 ac fe be e5 
+0

最後に '0x07'とは何ですか?これは、パディングの仕様の一部ではありません。 –

+0

既存の**パブリックドメイン**のMD5実装が大量に存在する場合、なぜホイールを再構築するのですか? ([example](http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5)) – rustyx

+0

私はリンクhttps://www.ietf.orgで仕様を見つけました/rfc/rfc1321.txtとパッディングについては、どこが間違っているのか分かりません。 –

答えて

1

データの長さはバイト数ではなく、ビット数でカウントされます。したがって、長さは7ではなく、56(0x38)です。この長さは、次に、Little-Endianバイト順で64ビットに符号化される。

準備入力は次のようになります。

const uint8_t test123Array[64] = { 
    0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
}; 

あなたはそれについて知っておく必要があるすべてが含まれているためにリンクされspecification of MD5を。 「3.2 Step 2. Append Length」セクションと「A.3 md5c.c」セクションのEncode関数を詳しく見てください。

+0

ありがとう、私は長い間苦労していました。 –

+0

@Artjom B.リトルエンディアンではないですか? 0x38は最下位バイトです。これは、上位バイトよりも前の例(配列のインデックスが低くなります)にあります。 – BarbaraKwarc

+1

@BarbaraKwarcどういうわけか、私は間違ってしまった。ありがとう! –

関連する問題