日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MD5算法原理与常用实现

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MD5算法原理与常用实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 定義
  • MD5特點
  • 常見應用場景
      • 1、校驗文件的完整性
      • 2、存儲用戶密碼
  • 原理
      • 1、填補信息
      • 2、拿到初始值
      • 3、真正的計算
  • MD5為什么不可逆
  • java實現和使用

定義

MD全稱Message-Digest,即信息摘要,所以MD家族的算法也叫信息摘要算法
MD家族有MD2、MD3、MD4、MD5,一代比一代強。
所以MD5是MD算法家族中,目前最常用的一種加密算法。

任何信息,都可以通過MD5算法運算生成一個16字節(128位)的散列值,但卻無法通過這16個字節的散列值獲得加密前的信息。
最終這16個散列值,通常用一個長度為32的十六進制字符串來表示。
這就是MD5最重要的一個特性:加密不可逆。

MD5特點

加密不可逆,即無法通過密文得到原文。
不變性,即相同的原文,通過MD5算法得到的密文總是相同的。
散列性,即對原文作輕微的改動,都可導致最終的密文完全改變。

常見應用場景

1、校驗文件的完整性

如果張三給李四傳了一個文件,如何確認這個文件傳給李四是完整的呢
張三傳文件前,先對文件做一個MD5加密,同時把MD5加密的密文傳給李四
李四收到文件,也對該文件做MD5加密,如果得到的密文和張三給的密文一樣,就說明文件是完整的。

2、存儲用戶密碼

用戶密碼,理論上也不能直接明文存儲在數據庫中,因為一旦數據庫被破解,用戶的密碼就全部丟失了
所以可以將用戶密碼做一個MD5加密,然后將密文存在數據庫中
用戶登錄的時候,可以將用戶的密碼進行MD5加密,然后比對密文和數據庫中的密文是否一致,來判斷用戶前臺填的密碼是否正確。
這只是一個思路,一般不會這么簡單,一般生產環境會對用戶密碼加鹽加密等等的處理,用戶信息更加重要的,則需要更加復雜的計算邏輯。

原理

MD5的加密過程,整體來看,就是先定義四個值,然后用這四個值,對原文信息進行計算,并得到新的四個值,然后再對原文進行計算,再得到新的四個值,如此循環一定次數,最終對最后的這四個值進行簡單的字符串拼接,就得到了最終的密文。
主要就是下面這3步:

1、填補信息

用原文長度位數對512求余,如果結果不為448,就填充到448位。填充是第一位填1,后面填0。512-448=64,用這剩余的64位,記錄原文長度。
最終得到一個填補完的信息(總長=原文長度+512位)

2、拿到初始值

四個初始值,是MD5這個算法提前定義好的,分別是4個32位的值,總共剛好128位。
我們用ABCD命名:
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210

3、真正的計算

計算分為多次循環,每次循環,都是用ABCD和原文在第一步填補完的信息,進行計算,最終得到新的ABCD。最后將最后一次ABCD拼成字符串,就是最終的密文。
循環先分為主循環,每個主循環中又套有子循環。
主循環次數 = 原文長度/512。
子循環次數 = 64次。

我們看看單次子循環都做了什么:

下面是單次子循環真正的計算邏輯(這段實現摘自網友):

圖中,A,B,C,D就是哈希值的四個分組。每一次循環都會讓舊的ABCD產生新的ABCD。一共進行多少次循環呢?由處理后的原文長度決定。

假設處理后的原文長度是M
主循環次數 = M / 512
每個主循環中包含 512 / 32 * 4 = 64 次 子循環。

上面這張圖所表達的就是單次子循環的流程。

下面對圖中其他元素一一解釋:

1.綠色F
圖中的綠色F,代表非線性函數。官方MD5所用到的函數有四種:

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,第二個16次使用G,第三個16次使用H,第四個16次使用I。

2.紅色“田”字
很簡單,紅色的田字代表相加的意思。

3.Mi
Mi是第一步處理后的原文。在第一步中,處理后原文的長度是512的整數倍。把原文的每512位再分成16等份,命名為M0 ~ M15,每一等份長度32。在64次子循環中,每16次循環,都會交替用到M1 ~ M16之一。

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不可逆的原因,從原理上來看,
第一是他使用了散列函數,即上面的FGHI函數。
第二是他在里面用了大量的移位操作,即<<<,這些是不可逆的
比如有10110011,我們左移三位,變成了10011000,高三位的101被頂了,低三位用0代替了,那此時就絕對不可能用10011000再逆向得到10110011了。

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 "";}}

總結

以上是生活随笔為你收集整理的MD5算法原理与常用实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。