phpでsha1ハッシュ値を自力計算できた! やっている事はmd5と基本的に同じだったので、九割方コピペで行けるな…。

phpでsha1ハッシュ値を自力計算できた! やっている事はmd5と基本的に同じだったので、九割方コピペで行けるな…。

いいものじゃないわよ。md5ハッシュ値の自力演算なんて…。phpは論理シフトも出来ないし、unsigned intも使えないし、大変だよ。(今回は、任意の文字列)  まさかメッセージの長さだけビッグエンディアンだったとは…。日本語サイトも英語サイトも分かったふうな解説ばかりで、キモの部分の説明がない!

md5とsha1の違い
1, ハッシュ値のサイズが違う
MD5: 128bit(16byte)=32文字
SHA1: 160bit(20byte)=40文字
※初期値となるWORDも、1WORD増えている

2, 1block = 64byteなのは同じ

3, メッセージの長さ(ビット数)を、最後の8バイトに入れるのは同じ
MD5: 下位WORD(4byte)+上位WORD(4byte)
SHA1: 上位WORD(4byte)+下位WORD(4byte) 通常のビッグエンディアン

4, bit演算の回数が違う
MD5: 1ブロックにつき64回(16*4種類のビット演算)
SHA1: 1ブロックにつき80回(20*4種類のビット演算)

5, kテーブル(ビット演算に使うkeyを格納するテーブル)が違う
MD5: abs(sin(1radから64rad)) * 0xffffffffで、0から2^32の間の4byteワードを64個も生成する
SHA1: 以下の4種類だけ
0x5A827999, /* 0~19回目の演算で使用 */
0x6ED9EBA1, /* 20~39回目の演算で使用 */
0x8F1BBCDC, /* 40~59回目の演算で使用 */
0xCA62C1D6 /* 60~79回目の演算で使用 */

6, バイトオーダーが違う
MD5: リトルエンディアン(メッセージのビット数だけビッグエンディアン)
SHA1: ビッグエンディアン(ハッシュの初期値となる5WORDだけは、リトルエンディアン)

7, ビット演算が、それなりに違う。
最初に各ブロックの64byteを配列に格納して、ひたすらビット演算を繰り返す感じ。
後から作られただけあって、それなりにシンプルに仕上がっている気がする!(表などの数列が少なくなっている)

コメントを残す

メールアドレスが公開されることはありません。