md5のアルゴリズム

Post on 04-Jun-2015

568 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

md5 のアルゴリズム2011/09/01aomoriringo

Message Digest Algorithm 5 ハッシュ関数の一種 リトルエンディアン

入力◦任意の長さのメッセージ

出力◦ 128 ビットの値

( ハッシュ値、メッセージダイジェストなどと呼ばれる )

MD5

エンディアン (endianness)多バイトのデータをメモリ上に配置する方式の種類のこと

ビッグエンディアン◦ 0x1234ABCD -> 12 34 AB CD◦人間にわかりやすい

リトルエンディアン◦ 0x1234ABCD -> CD AB 34 12◦コンピュータが処理しやすい

リトルエンディアン , ビッグエンディアン

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

メッセージ長を 512 ビットの整数倍にするため、パディング ( 拡張 ) を行う

1. 元のメッセージをビット列に直す2. ビット 1 を加える3. メッセージ長が (512 の倍数 – 64) ビットになる

まで0 を加える

パディングビットの付加

メッセージが abc の場合

abc↓01100001 01100010 01100011↓01100001 01100010 01100011 1↓01100001 01100010 01100011 1 000000……00000000

(448 bit)

パディングビットの追加

01100001 01100010 01100011 1 0000000……….00 6 1 6 2 6 3 8 0…........0

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

パディングする前のメッセージ長の下位 64 ビットを付加する( この時、下位 32 ビットを先に付加する )

メッセージ長を 64 ビットで表す 下位 32 ビットを Step.1 の結果に加える 上位 32 ビットをさらに加える

長さの付加

abc↓61626380........0(448 bit)

abc -> 24 bit -> 24 -> 0x18 -> 00000000 00000018 (64 bit)↓

61626380........0 00000018 00000000 (512 bit)

長さの付加

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

メッセージダイジェストを計算するために4 つの 8 バイト (32bit) バッファを用意する (A, B, C, D とする )

A 0x67452301 B 0xefcdab89 C 0x98badcfe D 0x10325476

※ バッファデータを一時的に保存しておく記憶領域のこと

MD バッファの初期化

メッセージダイジェストを計算するために4 つの 8 バイト (32bit) バッファを用意する (A, B, C, D とする )

A 0x67452301 B 0xefcdab89 C 0x98badcfe D 0x10325476

※ バッファデータを一時的に保存しておく記憶領域のこと

MD バッファの初期化

01 23 45 6789 ab cd efFe dc ba 9876 54 32 10

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

Step2 で作ったパディング済メッセージを 64 バイトずつ処理

ワードブロックごとのメッセージ処理

61626380........0 00000018 00000000 (128 文字 )

配列に Step2 の文字列を格納

0x18000000]15[

0x00000000]14[

0x00000000]1[

0x80636261]0[

150 ][

X

X

X

X

jjX

(A, B, C, D) に入っているものを(AA, BB, CC, DD) にコピー

A 0x67452301 B 0xefcdab89 C 0x98badcfe D 0x10325476

F(X,Y,Z) = ( X and Y ) or ( notX and Z )

G(X,Y,Z) = ( X and Z ) or ( Y and notZ )

H(X,Y,Z) = X xor Y xor Z

I(X,Y,Z) = Y xor ( X or notZ )

補助関数を定義

補助配列を定義

)641( sin2int][ 32 iiiT

[abcd k s i] で以下の計算を表すa = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s

計算 (1/4)

[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

[abcd k s i] で以下の計算を表すa = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s

計算 (2/4)

[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

[abcd k s i] で以下の計算を表すa = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s

計算 (3/4)

[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

[abcd k s i] で以下の計算を表すa = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s

計算 (4/4)

[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

(AA, BB, CC, DD) を(A, B, C, D) に加える

1. パディングビットの付加2. 長さの付加3. MD バッファの初期化4. ワードブロックごとのメッセージ処理5. 出力

A = 0x98500190 B = 0xb04fd23c C = 0x7d3f96c6 D = 0x727fe128

MD5(“abc”) = 900150983cd24fb0d6963f7d28e17f72

出力

top related