メッセージ ダイジェスト アルゴリズムの第 5 版と訳される MD5 (Message Digest Algorithm 5) は、慣例によれば、MD2 や MD3 のような名前を持つ歴史的なバージョンも存在する可能性があると考えられます...
そうでなくても。このアルゴリズムの原理はまったく理解できません。名前からいくつかのヒントが得られます。いわゆる要約は、私が書いた卒業論文と同様に、短くて強力な要約です。実際、MD5 の役割は次のようになります。 MD5 アルゴリズムの機能を説明するテキストを見てみましょう:
MD5 の機能は、大容量の情報を保存できるようにすることです。これは、主に整合性と一貫性を確保するために使用されます。
A が遠くにいる B に 100 万ワードのテキスト ファイルを送信したいとします。B がそのファイルを受信したとき、そのファイルが送信中に改ざんされたかどうかをどうやって知ることができるでしょうか。誰かがファイルの内容を途中で傍受して改ざんしても、ファイルのサイズに関係なく、MD5 が役に立ちます。現時点では、MD5 暗号化後に固定長の文字列が取得されます。 , Aは最初にファイルをMD5で暗号化し、取得した暗号文の文字列もBに渡します。Bがそれを受信すると、ファイルもMD5を使用してファイルを暗号化し、取得した暗号文がAが送信した暗号文と一致するかどうかを確認します。一貫性がある場合は、ファイルが安全であることを意味します。これにより、データ送信の整合性が保証されます。実際、インターネットからファイルをダウンロードする場合、ダウンロードしたファイルの背後に MD5 ( e8027a87676ea48b3a3c9b0a4d8d87a0) は、上で示した例と同様の機能を持っています (そう思います...)。
MD5 は公開された不可逆アルゴリズムです。つまり、暗号文を直接解読してソース データ情報を取得する方法はありません。 . MD5 は、任意のサイズのファイルを暗号化し、一意の 32 ビット文字列を取得できます。
MD5 の機能を簡単に理解した後、コードを直接確認できます
Java コードは MD5 暗号化を実装しています
package com.wang.encryption; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import java.security.MessageDigest; /** * @author yogo.wang * @date 2016/11/04-下午1:02. */ public class MD5Test { public static String md5Encode(String msg) throws Exception{ byte[] msgBytes = msg.getBytes("utf-8"); /** * 声明使用Md5算法,获得MessaDigest对象 */ MessageDigest md5 = MessageDigest.getInstance("MD5"); /** * 使用指定的字节更新摘要 */ md5.update(msgBytes); /** * 完成哈希计算,获得密文 */ byte[] digest = md5.digest(); /** * 以上两行代码等同于 byte[] digest = md5.digest(msgBytes); */ return bytesToHexString(digest); } /** * 将byte数组转化为16进制字符串形式 * @param bys * @return */ public static String byteArr2hexString(byte[] bys){ StringBuffer hexVal=new StringBuffer(); int val=0; for (int i = 0; i < bys.length; i++) { //将byte转化为int 如果byte是一个负数就必须要和16进制的0xff做一次与运算 val=((int)bys[i]) & 0xff; if(val<16){ hexVal.append("0"); } hexVal.append(Integer.toHexString(val)); } return hexVal.toString(); } public static void main(String[] args) throws Exception { String msg="helloworld"; String result=md5Encode(msg); String result1=md5Encode(msg); System.out.println(result); System.out.println(result1); } }
コードと出力結果は次のとおりです:
fc5e038d38a570320 85441e7fe7010b0
同じフィールドが Encryption であることがわかり、取得された暗号文は常に一貫しています。 MD5実装の原理と応用を見てみる
2) レコード情報長: 埋める前の情報長を格納するために 64 ビットを使用します。この 64 ビットは最初のステップの結果の後に追加されるため、情報長は N*512+448+64=(N+1)*512 ビットになります。
3) 標準マジックナンバーをロードする: 標準マジックナンバーは (A=(01234567)16, B=(89ABCDEF)16, C=(FEDCBA98)16, D=(76543210)16) です。プログラムで定義する場合は、(A=0X67452301L、B=0XEFCDAB89L、C=0X98BADCFEL、D=0X10325476L) となります。
4) 4回のループ操作: ループ数はグループ数(N+1)です。
ここでは主に Java の MessageDigest クラスを紹介します。jdk 開発ドキュメントを確認すると、このクラスは java.security パッケージの下にあることがわかります。
public abstract class MessageDigest extends MessageDigestSpi
ダイジェスト メソッドは、一定量の更新データに対して 1 回だけ呼び出すことができます。ダイジェストが呼び出された後、MessageDigest オブジェクトは初期状態にリセットされます。
MessageDigest md = MessageDigest.getInstance("SHA"); try { md.update(toChapter1); MessageDigest tc1 = md.clone(); byte[] toChapter1Digest = tc1.digest(); md.update(toChapter2); ...etc. } catch (CloneNotSupportedException cnse) { throw new DigestException("couldn't make digest of partial content"); }
。 1. 改ざんの防止 (ファイルの完全性検証)。たとえば、ファイルのダウンロードを提供する場合、犯罪者がインストール プログラムにトロイの木馬を追加するのを防ぐために、インストール ファイルから取得した MD5 出力結果を Web サイトで公開できます。
2. プレーンテキストの直接閲覧を防止します (パスワード暗号化)。 現在、多くの Web サイトでは、ユーザーのパスワードを保存するときに、ユーザーのパスワードの MD5 値がデータベースに保存されています。このようにして、犯罪者がデータベース内のユーザー パスワードの MD5 値を取得したとしても、ユーザーのパスワードを知ることはできません。
3. 否認の防止 (デジタル署名) たとえば、A がファイルを書き込み、認証局が MD5 アルゴリズムを使用してファイルの概要情報を生成し、記録を保持します。これにより、今後Aが事実を認めないことによるトラブルを防ぐことができます。
MD5 は不可逆的なアルゴリズムですが、解読できないというわけではありません。ほとんどのユーザーはパスワードを設定するときに、誕生日や略称などの特別な意味を持つフィールドを使用します。関連する情報を入力すると、次のようになります。使用できるパスワードをすべて MD5 で暗号化して大量の暗号文を取得し、パスワードの暗号文を取得して、私の暗号文ライブラリと 1 つずつ比較します。暗号文が一致する場合、パスワード自体が暗号化されます。同様に、多くの Web サイトでは、MD5 パスワード値を入力した後、その値がデータベースに存在する場合、同じ原理が適用されます。たとえば、上記のコードでは、文字列「helloworld」を MD5 で暗号化しました。理論的には、暗号文だけを知っていて、元のデータを解読することは不可能ですが、実際にはそうなのか見てみましょう。 Web サイト http://pmd5.com/
上記のコードで生成された暗号文を入力すると、Web サイトはすぐに解読されました。原理は非常に簡単です。
MD5 の詳細 詳細なテキスト情報については、 Baidu Encyclopedia にアクセスしてください。紹介は非常に詳細であり、読む価値があります