md5加密是常見的一種加密,今天對其加密過程及原理來進行深入理解與總結
什么是MD5
MD5是一種密碼散列函數,由md4,md3,md2改進而來,因其普遍,快速,穩定的特點廣泛應用於普通數據的加密保護領域,MD5算法會對原始的消息進行有損的壓縮計算,無論要加密的字節長度有多長,都會生成一個固定長度的消息摘要(密文),所以MD5算法具有不可逆性,但MD5算法還是無法提供絕對的安全性,無法避免碰撞攻擊,所以安全性沒有那么高,一般用於普通數據的加密。
原理
MD5加密的原理簡要敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被划分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
流程圖如下圖所示,每次的運算都有前一輪的128位結果值和當前的512bit值進行運算。
具體過程
具體過程如下:
1.首先對輸入的原文進行處理,按位對數據進行補充。
為啥要按位對數據進行補充呢?我們要讓原文長度(bit)對512求余的結果等於448,如果不等的話,就要對原文進行填充,首先在數據后補一個1bit,接着在后面補上一堆0bit,直到整個數據的位數對512求模的結果正好是448,就算這個數據的位數對512求模的結果正好是448也必須進行補位,意思是至少需要補一位,最多可能補512位。
2.對處理后的數據進行擴展長度。
在完成補位工作后,將一個表示數據原始長度的64 bit數(這是對原始數據沒有補位前長度的描述,用二進制來表示)補在最后。當完成補位及補充數據的描述后,得到的結果數據長度正好是512的整數倍。也就是說長度正好是16個(32bit) 字的整數倍 。
3.初始化md存儲器
MD5運算要用到一個128位的MD5緩存器,用來保存中間變量和最終結果。該緩存器又可看成是4個32位的寄存器A、B、C、D(被稱為鏈接變量),初始化為 :
A : 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
4.循環處理分組數據段
首先定義4個非線性函數F、G、H、I,對輸入的報文運算以512位數據段為單位進行處理。對每個數據段都要進行4輪的邏輯處理,在4輪中分別使用4個不同的函數F、G、H、I。每一輪以ABCD和當前的512位的塊為輸入,處理后送入ABCD(128位)
處理過程中用到的參數及函數
1.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))
(&是與,|是或,~是非,^是異或)
這些函數是這樣設計的:如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。
函數F是按逐位方式操作:如果X,那么Y,否則Z。函數H是逐位奇偶操作符。
在主循環下面 64 次子循環中,F、G、H、I 交替使用,第一輪 16 次使用 F,第二輪 16 次使用 G,第三輪 16 次使用 H,第四輪 16 次使用 I。
2.Mj
Mj是第一步處理后的原文。在第一步中,處理后原文的長度是 512 的整數倍。把原文的每 512 位再分成 16 等份,命名為 M0~M15,每一等份長度 32。在 64 次子循環中,每 16 次循環,都會交替用到 M1~M16 之一。
3.ti
一個常量,在 64 次子循環中,每一次用到的常量都是不同的。
常數ti可以如下t選擇:
在第i步中,ti是4294967296(2的32次方)*abs(sin(i))的整數部分,i的單位是弧度。
4.<<<S
左移 S 位,S 的值也是常量。
命名規則(s+方法名+第N個數)
SFF1=7; SFF2=12, SFF3=17; SFF4=22;
SGG1=5; SGG2=9, SGG3=14; SGG4=20;
SHH1=4; SHH2=11, SHH3=16; SHH4=23;
SⅡ1=6; SⅡ2=10, SⅡ3=15; SⅡ4=21;
設Mj表示消息的第j個子分組(從0到15),<<<s表示循環左移s位,則四種操作為:
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)
總結一下主循環中的 64 次子循環,可以歸納為下面的四輪:
這四輪(64步)是:
第一輪:
FF(a,b,c,d,M0,7,0xd76aa478) s[0]=7, K[0] = 0xd76aa478
FF(a,b,c,d,M1,12,0xe8c7b756) s[1]=12, K[1] = 0xe8c7b756
FF(a,b,c,d,M2,17,0x242070db)
FF(a,b,c,d,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(a,b,c,d,M5,12,0x4787c62a)
FF(a,b,c,d,M6,17,0xa8304613)
FF(a,b,c,d,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(a,b,c,d,M9,12,0x8b44f7af)
FF(a,b,c,d,M10,17,0xffff5bb1)
FF(a,b,c,d,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(a,b,c,d,M13,12,0xfd987193)
FF(a,b,c,d,M14,17, 0xa679438e)
FF(a,b,c,d,M15,22,0x49b40821)
第二輪:
GG(a,b,c,d,M1,5,0xf61e2562)
GG(a,b,c,d,M6,9,0xc040b340)
GG(a,b,c,d,M11,14,0x265e5a51)
GG(a,b,c,d,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(a,b,c,d,M10,9,0×02441453)
GG(a,b,c,d,M15,14,0xd8a1e681)
GG(a,b,c,d,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(a,b,c,d,M14,9,0xc33707d6)
GG(a,b,c,d,M3,14,0xf4d50d87)
GG(a,b,c,d,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(a,b,c,d,M2,9,0xfcefa3f8)
GG(a,b,c,d,M7,14,0x676f02d9)
GG(a,b,c,d,M12,20,0x8d2a4c8a)
第三輪:
HH(a,b,c,d,M5,4,0xfffa3942)
HH(a,b,c,d,M8,11,0x8771f681)
HH(a,b,c,d,M11,16,0x6d9d6122)
HH(a,b,c,d,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(a,b,c,d,M4,11,0x4bdecfa9)
HH(a,b,c,d,M7,16,0xf6bb4b60)
HH(a,b,c,d,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(a,b,c,d,M0,11,0xeaa127fa)
HH(a,b,c,d,M3,16,0xd4ef3085)
HH(a,b,c,d,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(a,b,c,d,M12,11,0xe6db99e5)
HH(a,b,c,d,M15,16,0x1fa27cf8)
HH(a,b,c,d,M2,23,0xc4ac5665)
第四輪:
Ⅱ(a,b,c,d,M0,6,0xf4292244)
Ⅱ(a,b,c,d,M7,10,0x432aff97)
Ⅱ(a,b,c,d,M14,15,0xab9423a7)
Ⅱ(a,b,c,d,M5,21,0xfc93a039)
Ⅱ(a,b,c,d,M12,6,0x655b59c3)
Ⅱ(a,b,c,d,M3,10,0x8f0ccc92)
Ⅱ(a,b,c,d,M10,15,0xffeff47d)
Ⅱ(a,b,c,d,M1,21,0x85845dd1)
Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)
Ⅱ(a,b,c,d,M15,10,0xfe2ce6e0)
Ⅱ(a,b,c,d,M6,15,0xa3014314)
Ⅱ(a,b,c,d,M13,21,0x4e0811a1)
Ⅱ(a,b,c,d,M4,6,0xf7537e82)
Ⅱ(a,b,c,d,M11,10,0xbd3af235)
Ⅱ(a,b,c,d,M2,15,0x2ad7d2bb)
Ⅱ(a,b,c,d,M9,21,0xeb86d391)
5.將結果進行拼接
最后將A,B,C,D分別加上a,b,c,d。然后用下一分組數據繼續運行算法,最后的輸出是A,B,C和D的級聯。
MD5在應用方面是非常廣的,經常用於密碼管理,電子簽名等方面。