MD5アルゴリズムの原則と一般的な実装

定義

MDの完全名はMessage-Digest、つまりメッセージダイジェストであるため、MDファミリのアルゴリズムはメッセージダイジェストアルゴリズムとも呼ばれます
。MDファミリには、世代よりも強力なMD2、MD3、MD4、およびMD5があります。
したがって、MD5は、MDアルゴリズムファミリで最も一般的に使用される暗号化アルゴリズムです。

MD5アルゴリズムで情報を計算して16バイト(128ビット)のハッシュ値を生成できますが、16バイトのハッシュ値を使用して暗号化前の情報を取得することはできません。
通常、16個のハッシュ値は、長さが32の16進数文字列で表されます。
これはMD5の最も重要な機能の1つです。暗号化は元に戻せません。

MD5の機能

暗号化は元に戻すことができません。つまり、元のテキストは暗号化テキストから取得できません。
不変性、つまり、元のテキストは同じで、MD5アルゴリズムによって取得される暗号文は常に同じです。
ハッシュ可能性、つまり元のテキストへのわずかな変更により、最終的な暗号文が完全に変更される可能性があります。

一般的なアプリケーションシナリオ

1.ファイルの整合性を確認します

Zhang SanがLi Siにファイルを送信する場合、ファイルがLi Siに完全であることをどのように確認しますか?
Zhang Sanがファイルを転送する前に、ファイルでMD5暗号化を実行してから、MD5暗号化暗号文をLi
SiおよびLi Siに渡します。ファイルを受信すると、ファイルもMD5暗号化されます。取得した暗号文がZhang Sanから提供された暗号文と同じ場合は、ファイルが完全であることを意味します。

2.ユーザーのパスワードを保存する

理論的には、ユーザーパスワードをプレーンテキストでデータベースに直接格納することはできません。データベースがクラックされると、すべてのユーザーパスワードが失われる
ため、ユーザーパスワードのMD5暗号化を実行してから、暗号化テキストをデータベースに格納できます。
ユーザーがログインすると、次のことができます。MD5はユーザーのパスワードを暗号化し、暗号テキストをデータベース内の暗号テキストと比較して、ユーザーのフロントデスクに入力されたパスワードが正しいかどうかを判断します。
これは単なる考え方であり、一般的にそれほど単純ではありません。一般的な本番環境では、ユーザーパスワードとソルト暗号化などが処理されます。ユーザー情報はより重要であり、より複雑な計算ロジックが必要です。

原理

MD5の全体的な暗号化プロセスは、最初に4つの値を定義してから、これらの4つの値を使用して元のテキスト情報を計算し、新しい4つの値を取得してから、元のテキストを計算して新しい4つの値を取得します。値なので、特定の回数ループし、最後に最後の4つの値の単純な文字列連結を実行して、最終的な暗号文を取得します。
主な3つの手順は次のとおりです。

1.情報を入力します

元のテキストの長さを使用して、残りの512を見つけます。結果が448でない場合は、448ビットに入力します。パディングでは、最初のビットに1を入力し、その後に0を続けます。512-448= 64、残りの64ビットを使用して元のテキストの長さを記録します。
最後に、メッセージが入力されます(全長=元のテキストの長さ+ 512ビット)

2.初期値を取得する

MD5アルゴリズムによって事前に定義されている4つの初期値は、正確に128ビットである4つの32ビット値です。
ABCDという名前を付けます
。A= 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210

3.実際の計算

計算は複数のサイクルに分割されます。各サイクルには、最初のステップでABCDと元のテキストが入力された情報が入力されます。計算が実行され、最後に新しいABCDが取得されます。最後に、最後のABCDが文字列にスペルされます。これが最終的な暗号文です。
ループは最初にメインループに分割され、各メインループはサブループで設定されます。
メインループの数=元のテキストの長さ/ 512。
サブサイクルの数= 64回。

単一のサブループで何が行われるかを見てみましょう。

以下は、単一のサブループの実際の計算ロジックです(この実装はネチズンから取得されます)。
ここに画像の説明を挿入
図では、A、B、C、およびDはハッシュ値の4つのグループです。各サイクルで、古いABCDが新しいABCDを生成します。合計でいくつのサイクルがありますか?処理されたテキストの長さによって決定されます。

処理後の元のテキストの長さは、
メインループのM 倍= M / 512 であると想定されてい
ます。各メインループには、512/ 32 * 4 = 64のサブループが含まれています。

上の図は、単一のサブサイクルのフローを示しています。

次に、図の他の要素を1つずつ説明します。

1.緑のF
グラフの緑のFは、非線形関数を表します。公式MD5が使用する4つの関数があります。

F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z
I(X, Y, Z)=Y^(X|(~Z))

メインループの下の64サブサイクルでは、F、G、H、Iが交互に使用され、最初の16はFを使用し、2番目の16はGを使用し、3番目の16はHを使用し、4番目の16は使用します私は

2.
赤字の「天」はとてもシンプルな言葉で、赤字の「天」は加算の意味です。

3.
Mi Miは、最初のステップの後の元のテキストです。最初のステップでは、処理後の元のテキストの長さは512の整数倍です。元のテキストの各512ビットは、M0〜M15という名前の16の等しい部分に分割され、各等しい部分の長さは32です。64サブサイクルでは、M1〜M16のいずれかが16サイクルごとに交互に使用されます。

4.Kiは
定数、64サブサイクルでは、毎回使用される定数が異なります。

5.黄色の<<
FF(a、b、c、d、Mj、s、ti)は、a = b +((a + F(b、c、d)+ Mj + ti)<<< s)
<<を意味します<sは、sビット左に回転することを意味します

第一轮
 a=FF(a,b,c,d,M0,7,0xd76aa478)
 b=FF(d,a,b,c,M1,12,0xe8c7b756)
 c=FF(c,d,a,b,M2,17,0x242070db)
 d=FF(b,c,d,a,M3,22,0xc1bdceee)
 a=FF(a,b,c,d,M4,7,0xf57c0faf)
 b=FF(d,a,b,c,M5,12,0x4787c62a)
 c=FF(c,d,a,b,M6,17,0xa8304613)
 d=FF(b,c,d,a,M7,22,0xfd469501)
 a=FF(a,b,c,d,M8,7,0x698098d8)
 b=FF(d,a,b,c,M9,12,0x8b44f7af)
 c=FF(c,d,a,b,M10,17,0xffff5bb1)
 d=FF(b,c,d,a,M11,22,0x895cd7be)
 a=FF(a,b,c,d,M12,7,0x6b901122)
 b=FF(d,a,b,c,M13,12,0xfd987193)
 c=FF(c,d,a,b,M14,17,0xa679438e)
 d=FF(b,c,d,a,M15,22,0x49b40821)
 
第二轮
 a=GG(a,b,c,d,M1,5,0xf61e2562)
 b=GG(d,a,b,c,M6,9,0xc040b340)
 c=GG(c,d,a,b,M11,14,0x265e5a51)
 d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
 a=GG(a,b,c,d,M5,5,0xd62f105d)
 b=GG(d,a,b,c,M10,9,0x02441453)
 c=GG(c,d,a,b,M15,14,0xd8a1e681)
 d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
 a=GG(a,b,c,d,M9,5,0x21e1cde6)
 b=GG(d,a,b,c,M14,9,0xc33707d6)
 c=GG(c,d,a,b,M3,14,0xf4d50d87)
 d=GG(b,c,d,a,M8,20,0x455a14ed)
 a=GG(a,b,c,d,M13,5,0xa9e3e905)
 b=GG(d,a,b,c,M2,9,0xfcefa3f8)
 c=GG(c,d,a,b,M7,14,0x676f02d9)
 d=GG(b,c,d,a,M12,20,0x8d2a4c8a)
 
第三轮
 a=HH(a,b,c,d,M5,4,0xfffa3942)
 b=HH(d,a,b,c,M8,11,0x8771f681)
 c=HH(c,d,a,b,M11,16,0x6d9d6122)
 d=HH(b,c,d,a,M14,23,0xfde5380c)
 a=HH(a,b,c,d,M1,4,0xa4beea44)
 b=HH(d,a,b,c,M4,11,0x4bdecfa9)
 c=HH(c,d,a,b,M7,16,0xf6bb4b60)
 d=HH(b,c,d,a,M10,23,0xbebfbc70)
 a=HH(a,b,c,d,M13,4,0x289b7ec6)
 b=HH(d,a,b,c,M0,11,0xeaa127fa)
 c=HH(c,d,a,b,M3,16,0xd4ef3085)
 d=HH(b,c,d,a,M6,23,0x04881d05)
 a=HH(a,b,c,d,M9,4,0xd9d4d039)
 b=HH(d,a,b,c,M12,11,0xe6db99e5)
 c=HH(c,d,a,b,M15,16,0x1fa27cf8)
 d=HH(b,c,d,a,M2,23,0xc4ac5665)
 
第四轮
 a=II(a,b,c,d,M0,6,0xf4292244)
 b=II(d,a,b,c,M7,10,0x432aff97)
 c=II(c,d,a,b,M14,15,0xab9423a7)
 d=II(b,c,d,a,M5,21,0xfc93a039)
 a=II(a,b,c,d,M12,6,0x655b59c3)
 b=II(d,a,b,c,M3,10,0x8f0ccc92)
 c=II(c,d,a,b,M10,15,0xffeff47d)
 d=II(b,c,d,a,M1,21,0x85845dd1)
 a=II(a,b,c,d,M8,6,0x6fa87e4f)
 b=II(d,a,b,c,M15,10,0xfe2ce6e0)
 c=II(c,d,a,b,M6,15,0xa3014314)
 d=II(b,c,d,a,M13,21,0x4e0811a1)
 a=II(a,b,c,d,M4,6,0xf7537e82)
 b=II(d,a,b,c,M11,10,0xbd3af235)
 c=II(c,d,a,b,M2,15,0x2ad7d2bb)
 d=II(b,c,d,a,M9,21,0xeb86d391)

MD5が元に戻せない理由

MD5が元に戻せない理由は、原則として、
1つ目はハッシュ関数、つまり上記のFGHI関数を使用することです。
2つ目は、多くのシフト演算を使用していること、つまり<<<であり、これら
は元に戻すことができません。たとえば、10110011があり、左に3桁シフトして10011000になります。 0が置き換えられた場合、10011000を使用して10110111を取得することは不可能です。

Javaの実装と使用

public class MD5Util {
    public static void main(String[] args) throws IOException {
        System.out.println(encodeString("123"));
    }

    public static String encodeString(String plainText) throws UnsupportedEncodingException {
        return encodeBytes(plainText.getBytes("UTF-8"));
    }

    public static String encodeBytes(byte[] bytes) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}
元の記事203件を公開 賞賛された186件 210,000回

おすすめ

転載: blog.csdn.net/java_zhangshuai/article/details/105568316