MD5アルゴリズムの暗号化プロセス

MD5アルゴリズムの暗号化プロセス

MD5とは何か

MD5 はアルゴリズムです。MD5 の MD はMessage Digest の略です。

5 については、以前の MD4 アルゴリズムが改良されたため、MD5 と名付けられています。

MD5 はメッセージ ダイジェスト アルゴリズムの 5 番目のバージョンです。

メッセージダイジェストアルゴリズムとは何ですか?

では、メッセージ ダイジェスト アルゴリズムとは何でしょうか? 本質的にはハッシュ関数です。

ハッシュ関数とも呼ばれます。

では、ハッシュ関数とは何でしょうか? ハッシュ関数とは、任意のサイズのデータ​​を固定サイズの値にマッピングできる関数を指します。

ハッシュ関数は、任意のサイズのデータ​​を固定サイズの値にマッピングするために使用できる関数です。

ハッシュ関数によって返される値は、ハッシュ値ハッシュ コード、または単にハッシュとも呼ばれます。

具体例

このように単純に話すと少し抽象的なので、具体的な例を挙げて説明します。Java を例にとると、MD5 は次のように計算できます。

  1. パブリックvoid rawMd5() は NoSuchAlgorithmException をスローします {
  2. byte[] バイト = "hello" .getBytes(StandardCharsets.UTF_8);
  3. メッセージダイジェスト md = MessageDigest.getInstance( "MD5" );
  4. byte[] md5 = md.digest(バイト);
  5. }

注: ダイジェスト計算の入力はバイト配列であるため、文字列のダイジェスト値を計算する場合は、何らかのエンコードのバイト配列に変換する必要があります。一貫性を保つために、常に utf-8 などの同じエンコードを明示的に使用する必要があります。

上記のコードから、MD5 関数の入力と出力は両方ともバイト配列 byte[] であることがわかります。

コードに直接反映されていない点の 1 つは、入力は任意のサイズのバイト配列にすることができますが、出力は固定サイズのバイト配列であるということです。

MD5 アルゴリズムの場合、出力値は固定サイズの 16 バイト配列です。各バイトは 8 ビットなので、最終的な出力値は 16 × 8 = 128 ビットの 2 進数になります。MD5 の値は 128 ビットの 2 進整数です。

たとえば、次の MD5 値は、元の 128 ビット バイナリ形式で表現されます。10001000100100011001000111110000100011111000000111010010110010101000101111010100001100110111110000111011111011001111110110011011111110110011011111110

この MD5 値は、実際には私の Web サイトのドメイン名 xiaogd.net を解析した結果です。

この値の 2 進形式は非常に長いため、通常は 16 個のグループ (88 91 91 f0 8f 81 d2 ca c5 ea 19 bc 3b f7 d9 be) を持つ 16 進形式に変換されます。それでも非常に長いですが、2 進数よりははるかに優れています。

ちなみに、IPv6 アドレスも 128 ビットなので、これも異常に長いです。16 進数で書いても、非常に長くて覚えにくいです...

最後に、通常はスペースが削除され、コンパクトな 32 文字の文字列 (889191f08f81d2cac5ea19bc3bf7d9be) に書き込まれます。これが最も一般的な MD5 値形式です。

ただし、誤解しないでください。MD5 値は文字列ではなく、すべての文字が含まれるわけではありません。

用語とコンプライアンス

この記事では、「ワード」は 32 ビット、「バイト」は 8 ビットです。

x_i は「x マイナス I」を表すものとして定義します。減数が式である場合は、x_{i+1} のように括弧で囲みます。同様に、指数を表すために ^ を使用します。つまり、x^i は x の i 乗を表します。 「+」は「ワード」の加算を表し、X<<< sはXをsビット左にシフトしたことを表し、not(X)はXのビット補数演算を表し、X v YはビットOR演算を表します。 X xor Y はビット単位の排他的論理和を意味し、XY はビット単位の論理積を意味します。

MD5アルゴリズムの説明

入力として b ビット長のメッセージがあると仮定し、その要約情報を計算します。 b は負でない整数です。b は 0 の場合もあります。8 の倍数である必要はなく、非常に大きい値でもかまいません。入力情報については以下のように説明します。

m_0 m_1 .. m_{b-1}

次の 5 つのステップでその要約を計算します。

1.充填

入力を 448 を法として 512 の長さにパディングします。入力メッセージの長さに関係なく、長さが 512 から 448 までの条件を満たす場合でも、パディングは常に発生します。

プロセスは次のとおりです。

入力情報の後に「1」ビットが追加され、入力情報の長さが 448 を法として 512 を満たすように、残りの部分に「0」ビットが追加されます。一般的には、少なくとも 1 ビットが追加され、最大 512 ビットが追加されます。

例: 66

2.補足データ長

入力情報 b は 64 ビットで表され、パディングされたデータに追加されます。b が 2^64 より大きい場合は、下位 64 ビットのみが取得されます。

この時点で、処理結果はちょうど 512 の倍数で、16 語の倍数に相当します。この結果を表すには M[0...N-1] を使用します。ここで、N は 16 の倍数です。

3. MDバッファを初期化する

メッセージ ダイジェストを計算するには、4 ワード バッファー (A、B、C、D) を使用します。ここで、A、B、C、D はそれぞれ 32 ビット レジスタです。これらのレジスタの初期値は、下位バイトを先頭として 16 進数で表すと次のようになります。

  1. 単語A: 01 23 45 67
  2. 単語B: 89 ab dc ed
  3. 単語C: fe dc ba 98
  4. 単語D: 76 54 32 10

4.メッセージの処理

まず 4 つのヘルパー関数を定義する必要があります。

  1. F(X,Y,Z) = XY 対(X) Zではない
  2. G(X,Y,Z) = XZ v Y ではなく(Z)
  3. H(X,Y,Z) = X xor Y xor Z
  4. I(X,Y,Z) = Y xor (X 対(Z)ではない)

関数 F の場合、各ビットにおいて、関数 F はセレクターのようになります。つまり、X の場合は Y、それ以外の場合は Z です。

このステップでは、sin関数から構築された長さ64のテーブルT[1...64]が必要です。 T[i]はabs(sin(i))を4294967296回実行した結果です。

処理が必要です

  1. /* 元のデータを処理します。 */
  2. i = 0からN/16-1までの場合
  3. /* Xにデータを割り当てます。 */
  4. j = 0から15までの場合
  5. X[j]をM[i*16+j]設定します
  6. end /* jのループを終了します */
  7. /* A を AA、B を BB、C を CC、D を DD として保存します */
  8. AA = あ
  9. BB = B
  10. CC = C
  11. DD = D
  12. /* 最初の操作ラウンド */
  13. /* [abcd k s i]は次の操作を示します
  14. a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
  15. [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
  16. [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
  17. [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
  18. [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
  19. /* 2回目の操作 */
  20. /* [abcd k s i]は次の操作を示します
  21. a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
  22. [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
  23. [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
  24. [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
  25. [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
  26. /* 3回目の操作 */
  27. /* [abcd k s t]は次の操作を示します
  28. a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
  29. [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
  30. [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
  31. [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
  32. [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
  33. /* 4回目の操作 */
  34. /* [abcd k s t]は次の操作を示します
  35. a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
  36. [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
  37. [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
  38. [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
  39. [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
  40. A = A + A A です
  41. B = B + B = ...
  42. C = C + C C
  43. D = D + D D
  44. end /* i のループを終了します */

5.出力

前のステップでは、最終結果 A、B、C、D が出力されます。 A の下位バイトから始まり、D の上位バイトで終わります。各バイトは 32 ビットで、最終的な連結結果は 4*32 = 128 ビットとなり、これが MD5 解決の結果です。

<<:  AI軍はすでに門を叩いているが、失業はどのくらい先にあるのだろうか?

>>:  推奨される 5 つのオープンソースオンライン機械学習環境

ブログ    
ブログ    

推薦する

人工知能をより人間らしくする 高齢者向けにAIをもっとデジタル化すべき

人工知能は新たなインフラの一つとして、人々の社会生活のあらゆる分野に統合され、あらゆるものがつながり...

携帯電話に搭載された3D姿勢推定は、モデルサイズが類似モデルの1/7しかないが、誤差はわずか5cmである。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

賢い負荷分散アルゴリズム: 頭を使って

負荷分散技術は現在ではどこにでもありますが、基本的にはまだ使用段階であり、その核心は十分に理解されて...

人工知能の6つの主要概念とAIプロジェクトを実装するための7つの考慮事項を1つの記事で理解する

AI はすべての問題を解決できるわけではありませんが、正しく適用すれば短期間で大きな変化をもたらすこ...

トヨタがAIを活用して融資判断をスピードアップする方法

[[431125]]自動車金融サービスの分野では、ディーラーと顧客が意思決定のスピードを追求していま...

...

...

ウォルマートのAIを活用したイノベーションの実践経験

ウォルマートの創業者サム・ウォルトンはよく「私たちの人材が違いを生み出す」と言っていましたが、この言...

指紋、顔、虹彩: 適切な生体認証技術を選択するには?

[[351445]]最近、クレジットカード会社からデータ漏洩に関する連絡がありましたか? あるいは...

中関村科学技術の張傑氏との対話:大規模モデルを実装するには従うべき「テクニック」がある

ゲスト | 張潔インタビュー | 張小南編集者 | 徐潔成制作:51CTO テクノロジースタック(W...

Nature Sub-Journal | NUS と ByteDance が初めて AI メタ学習を脳画像に導入

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

機械学習の人気のトレンドの概要

Google トレンドを使ったことがありますか? かなり便利です。キーワードをいくつか入力すると、G...

2021年4月の自動運転分野における重要な進展の概要

2021年に入ってから、自動運転分野の開発は着実に進展しており、4月には自動運転関連のさまざまな動き...

Google の新しい AI が話題に!世界で最も長い単語を描くことができる

友達、この英語の単語が何だか知っていますか?超微細珪火山性肺炎。これは45文字からなる世界最長の単語...

過去20年間、Huilianは政府サービスにおけるグローバルインテリジェンスを実現してきました。

農業、工業、情報、知能、社会は常に進歩しています。長い発展の過程で、生産手段と生産ツールは常に変化し...