加密算法說明(Base64、MD5、DES)
A). Base64
Base64編碼的思想是是采用64個基本的ASCII碼字符對數據進行重新編碼。它將需要編碼的數據拆分成字節數組。 以3個字節為一組。按順序排列24位數據,再把這24位數據分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個字節。這樣就把一個3字節為一組 的數據重新編碼成了4個字節。當所要編碼的數據的字節數不是3的整倍數,也就是說在分組時最后一組不夠3個字節。這時在最后一組填充1到2個0字節。并在 最后編碼完成后在結尾添加1到2個“=”。例:將對ABC進行BASE64編碼首先取ABC對應的ASCII碼值。A(65)B(66)C(67)。再取 二進制值A(01000001)B(01000010)C(01000011),然后把這三個字節的二進制碼接起來 (010000010100001001000011),再以6位為單位分成4個數據塊并在最高位填充兩個0后形成4個字節的編碼后的值 (00010000)(00010100)(00001001)(00000011)。藍色部分為真實數據。再把這四個字節數據轉化成10進制數得 (16)(20)(19)(3)。最后根據BASE64給出的64個基本字符表,查出對應的ASCII碼字符(Q)(U)(J)(D)。這里的值實際就是 數據在字符表中的索引。注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
解碼過程就是把4個字節再還原成3個字節再根據不同的數據形式把字節數組重新整理成數據。
B). DES
DES是Data Encryption Standard(數據加密標準)的縮寫。DES是一個分組加密算法,他以64位為分組對數據加密。同時DES也是一個對稱算法:加密和解密用的是同一個 算法。它的密匙長度是56位(因為每個第8位都用作奇偶校驗),密匙可以是任意的56位的數,而且可以任意時候改變。其中有極少量的數被認為是弱密匙,但 是很容易避開他們。所以保密性依賴于密鑰。
DES對64(bit)位的明文分組M進行操作,M經過一個初始置換IP置換成m0,將m0明文分成左半部分和右半部分 m0=(L0,R0),各32位長。然后進行16輪完全相同的運算,這些運算被稱為函數f,在運算過程中數據與密匙結合。經過16輪后,左,右半部分合在 一起經過一個末置換,這樣就完成了。在每一輪中,密匙位移位,然后再從密匙的56位中選出48位。通過一個擴展置換將數據的右半部分擴展成48位,并通過 一個異或操作替代成新的32位數據,在將其置換換一次。這四步運算構成了函數f。然后,通過另一個異或運算,函數f的輸出與左半部分結合,其結果成為新的 右半部分,原來的右半部分成為新的左半部分。將該操作重復16次,就實現了。
解密過程:在經過所有的代替、置換、異或盒循環之后,你也許認為解密算法與加密算法完全不同。恰恰相反,經過精心選擇的各種操作,獲得了一 個非常有用的性質:加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果各輪加密密匙分別是K1,K2,K3….K16那么解密 密匙就是K16,K15,K14…K1。
C). MD5
MD5的全稱是Message-DigestAlgorithm 5,Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。請注意我使用了"字節 串"而不是"字符串"這個詞,是因為這種變換只與字節的值有關,與字符集或編碼方式無關。 MD5將任意長度的"字節串"變換成一個128bit的大整數,并且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法 將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被"篡改"。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內 容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的"抵賴",這就是所謂的數字簽名應用。
MD5還廣泛用于加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然后再去和系統中保存的MD5值進行比較,而系統并不"知道"用戶的密碼是什么。
一些黑客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成 的,先用MD5程序計算出這些字典項的MD5值,然后再用目標的MD5值在這個字典中檢索。即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共 26+26+10=62個字符,排列組合出的字典的項數則是P(62,1)+P(62,2)....+P(62,8),那也已經是一個很天文的數字了,存 儲這個字典就需要TB級的磁盤組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。