- 密碼算法應用實踐
- 文仲慧等
- 929字
- 2020-04-03 12:46:59
1.8 BLOWFISH加密算法
BLOWFISH加密算法是由美國的Bruce Schneier于1993年提出的,屬于分組密碼,它采用平衡Feistel結構,分組長度、迭代層數和DES加密算法完全相同,結構框架和DES加密算法也很相似,只是其密鑰長度可變,變化范圍為1~448比特。
整個加密算法由密鑰擴展和數據加密兩個獨立的部分組成。密鑰擴展是由輸入密鑰生成1042個32比特的字的子密鑰過程(下文所指的字均為32比特)。該過程工程量大,需要預先完成,將大批的子密鑰存放在緩沖存儲器中,以備數據加密時調用。在這1042個字的子密鑰中,前18個字組成P數組{P1, P2, …, P18},后面的1024個字按順序組成4個S盒,每個S盒由256個字組成,記為Sij(i=1,2,3,4; j=0,1, …,255)。
數據加密采用一個16層的平衡Feistel結構,每層由一次加亂、一個P置換和一個S盒代替組成,層內也只有簡單的xor和模232加運算。
輸入的64比特明文平分成32比特的左右兩部分,記為XL和XR。16層加密過程可用下面的偽代碼表示。
for i=1 to 16 do { XL=XL⊕Pi XR=XR⊕F(XL) 交換XL和XR } XL=XR⊕P17 XR=XL⊕P18
XL‖XR即密文。
層函數F如下:將XL從左到右按字節分成4個值(a、b、c和d),然后分別在4個S盒(S1、S2、S3、S4)中進行代替,得到4個字S1a、S2b、S3c、S4d,按下式對這4個字進行結合,可得到F函數的輸出。
F(XL)={[(S1a+S2b)mod 232]⊕S3c}+S4d mod 232
從上面可以看出,BLOWFISH加密算法的數據加密非常簡潔,操作也非常簡單,如果子密鑰預先存儲在高速緩沖存儲器中,則BLOWFISH加密算法的實現要比DES加密算法快得多。
BLOWFISH的脫密過程和加密過程完全一樣,只需將P數組逆序使用即可。
子密鑰的生產也使用了BLOWFISH加密算法,具體生成方法如下:
(1)用一個隨機序列(可以固定不變)初始化P數組和4個S盒。
(2)對密鑰K進行擴展,使擴展后的密鑰不小于18×32比特,將擴展后的密鑰與P數組進行模2加得到新的數組。
(3)采用BLOWFISH加密算法對64比特的全0串進行加密,用最后輸出的XL和XR替代P1和P2;然后將XL和XR作為明文,用更新后的子密鑰和BLOWFISH加密算法進行加密,用最后輸出的XL和XR替代P3和P4;重復此過程521次,更新1042個的子密鑰。
和DES加密算法相比,BLOWFISH加密算法減少了S盒的數量,但是它的S盒不是固定不變的,而是隨密鑰數據變化的,結構是未知的。4個S盒的輸出經過模2加和模232加結合后才作為層函數F的輸出,各層所加亂數各不相關,因此BLOWFISH加密算法能有效抵制線性攻擊和差分分析攻擊,具有極高的安全性。