這段時(shí)間剛好正在做軟件安全的實(shí)驗和課設,學(xué)習了各種加密算法,比如對稱(chēng)加密算法的DES,AES;非對稱(chēng)加密算法的RSA;再如今天要講的主角-單向加密算法的MD5。為什么這么多算法,MD5成為了今天的豬腳呢?,這是因為個(gè)人感覺(jué)在目前Android開(kāi)發(fā)中MD5算是比較常用的,所以很值得一講。所以今天讓我帶你們來(lái)全面認識我們的主角MD5。
一、基本概念
1. 單向加密算法
在介紹MD5算法前,很有必要解釋一下單向加密算法。單向加密,人如其名,就是只能單向對明文進(jìn)行加密,而不能逆向通過(guò)密文得到明文。該算法在加密過(guò)程中,在得到明文后,經(jīng)過(guò)加密算法得到密文,不需要使用密鑰。因為沒(méi)有密鑰,所以就無(wú)法通過(guò)密文得到明文。
2. MD5算法
MD5,全稱(chēng)Message Digest Algorithm 5,翻譯過(guò)來(lái)就是消息摘要算法第5版,是計算機安全領(lǐng)域廣泛使用的一種散列函數,用于確保信息傳輸的完整性。MD5算法是由MD2、MD3、MD4演變而來(lái),是一種單向加密算法,一種不可逆的加密方式。
二、特點(diǎn)
1.長(cháng)度固定
不過(guò)多長(cháng)的數據,經(jīng)過(guò)MD5加密后其MD5值長(cháng)度都是固定的。MD5值長(cháng)度固定為128位,而最后的值一般都用16進(jìn)制數字表示,一個(gè)16進(jìn)制數字占4位,所以最后的MD5值都是用32個(gè)16進(jìn)制數字表示。
2.計算簡(jiǎn)單
MD5算法說(shuō)到底還是散列算法,或者叫做哈希算法,所以計算一個(gè)數據的MD5值是比較容易的,同時(shí)加密速度也是很快的。
3.抗修改性
對原數據進(jìn)行任何改動(dòng),哪怕只是修改1個(gè)字節,所得到的MD5值都有很大的區別。
4.強抗碰撞性
已知原數據和其MD5值,很難找到具有相同MD5值的數據,即很難偽造數據。這里的碰撞在后面的安全性中會(huì )提到,在這里我們簡(jiǎn)單理解為一種破解手段。
三、原理
1.填充數據
首先計算數據長(cháng)度(bit)對512求余的結果,如果不等于448,就需要填充數據使得數據長(cháng)度對512求余的結果為448,其填充方式為第一位填充1,其余位填充0.填充后數據長(cháng)度為512*N 448。
2.記錄數據長(cháng)度
用64位來(lái)存儲填充前數據的長(cháng)度,這64位將加在填充后數據的后面,這樣最終的數據長(cháng)度為512*N 448 64=(N 1)*512
3.裝入標準幻數
標準幻數其實(shí)就是4個(gè)整數,我們知道最終的MD5值長(cháng)度為128位,按32位分成一組的話(huà)可以分成4組,而這4組結果就是由這4個(gè)標準幻數A,B,C,D經(jīng)過(guò)不斷演變得到。在MD5官方的實(shí)現中,四個(gè)幻數為(16進(jìn)制):
A=01234567
B=89ABCDEF
C=FEDCBA98
D=76543210
其實(shí)上面是大端字節序的幻數,而在正常程序中,我們實(shí)現的是小端字節序,所以在程序中我們定義的幻數應該是:
A=0X67452301
B=0XEFCDAB89
C=0X98BADCFE
D=0X10325476
4.四輪循環(huán)運算
在上面對數據處理后,數據長(cháng)度將是(N 1)/512,我們將每512位(64字節)作為一塊,總共要循環(huán)N 1次,并將塊細分為16個(gè)小組,每組的長(cháng)度為32位(4字節),這16個(gè)小組即為一輪,總共得循環(huán)4輪,即64次循環(huán)??偟膩?lái)說(shuō)我們需要(N 1)個(gè)主循環(huán),每個(gè)主循環(huán)包含了64次子循環(huán),來(lái)不斷的改變幻數A,B,C,D才能最終得到數據的MD5值。
4.1 相關(guān)系數說(shuō)明
1)4個(gè)非線(xiàn)性函數
F(x,y,z)=(x