MD5 (Message Digest Algorithm 5)、メッセージ ダイジェスト アルゴリズムの第 5 版として翻訳されると、慣習に従って、MD2 や MD3 のような名前を持つ歴史的なバージョンも存在する可能性があると考えられます...
たとえそうでなかったとしても。このアルゴリズムの原理はまったく理解できません。名前からいくつかのヒントが得られます。いわゆる要約は、私が書いた卒業論文と同様に、短くて強力な要約です。実際、MD5 の役割は次のようになります。 MD5 アルゴリズムの機能を説明するテキストを見てみましょう。
MD5 の機能は、大容量の情報を保存できるようにすることです。機密形式に「圧縮」されます (つまり、デジタル署名ソフトウェアで秘密鍵に署名する前に)。これは主に整合性とセキュリティを確保するために使用されます。データ送信の一貫性
A が遠くにいる B に 100 万ワードのテキスト ファイルを送信したいとします。誰かがファイルの内容を途中で傍受して改ざんしても、ファイルがどれほど大きくても、MD5 によって暗号化された後は固定長の文字列 (通常は 32 ビット) が得られます。今回は、A が最初にファイルを MD5 で暗号化し、取得した暗号文の文字列も B に渡します。B がファイルを受信すると、ファイルも MD5 で暗号化し、取得した暗号文が A が送信した暗号文と一致するかどうかを確認します。一貫性がある場合は、ファイルが安全であることを意味します。これにより、データ送信の整合性が保証されます。実際、ファイルをダウンロードするときに、ダウンロードされたファイルの背後に MD5 暗号文が存在することがあります。 MD5 (e8027a87676ea48b3a3c9b0a4d8d87a0) などのファイル。この関数は、上で示した例と似ています (そう思います...)
MD5 は、暗号文を直接解読して取得する方法がないことを意味します。 MD5 は任意のサイズのファイルを暗号化し、一意の 32 ビット文字列を取得できます。
MD5 関数を簡単に理解すると、MD5 暗号化を実装するコードを直接確認できます。
コードをコピーします。パッケージ com.wang.encryption;
インポート com.sun.org.apache.xerces.internal.impl.dv.util.Base64;インポート java.security.MessageDigest; 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); }
MD5 実装の原理と応用
オンラインでいくつか読んだのですが、私の友人が自分で md5 暗号化コードを実装しました。彼はそれを少し理解しているとだけ言っておきます。ここに投稿して、インターネット上でいくつかの実装手順を紹介します (ちょっと見てください)
1。 ) 埋め込み: まず、512 の余りが 448 になるように入力情報の長さ (ビット) を埋めます。充填方法は、1 と n 個の 0 を充填することです。
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) となります。
extends MessageDigestSpi 此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。 MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。 对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。 实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:
md.update(toChapter1); MessageDigest tc1 = md.clone(); byte[] toChapter1Digest = tc1.digest(); md.update(toChapter2); ...etc.
throw new DigestException("couldn't make digest of partial content");
MD5 は不可逆的なアルゴリズムですが、解読できないというわけではありません。ほとんどのユーザーはパスワードを設定するときに、誕生日や略称などの特別な意味を持つフィールドを使用します。関連する情報を入力すると、パスワードを推測します。を使用して、MD5 で暗号化して大量の暗号文を取得し、パスワードの暗号文を取得して、私の暗号文ライブラリと 1 つずつ比較します。暗号文が一致する場合、パスワード自体は自滅します。