Blowfish加密算法及其安全性分析

Blowfish加密算法是一種常用的強(qiáng)對(duì)稱加密算法,由于它的高效、容易實(shí)現(xiàn)等優(yōu)良性能,正越來越多地運(yùn)用于電子商務(wù)、軍事、安全通信等諸多領(lǐng)域,逐步取代了DES的地位。16輪Blowfish加密算法可以抗差分攻擊。

BLOWFISH-64(以下簡記為BLOWFISH)是可變長密鑰64位塊加密系統(tǒng)。算法可分為兩部分(密鑰擴(kuò)展部分和數(shù)據(jù)加密或解密部分):

密鑰擴(kuò)展部分把密鑰(至多448位)轉(zhuǎn)換為一些字密鑰序列(共4168位)。

數(shù)據(jù)加密或解密部分包括16輪位操作,每一輪由密鑰變換和數(shù)據(jù)變換組成。所有的操作都為32位與運(yùn)算。每輪唯一的附加操作是四次數(shù)據(jù)查詢。

算法描述

子密鑰生成

Blowfish加密算法要使用很多字密鑰,這些字密鑰都在數(shù)據(jù)加密或數(shù)據(jù)解密前被計(jì)算出來。

(1)P數(shù)組由18個(gè)32位字密鑰組成:P1,P2,……,P18

(2)還有4個(gè)具有256個(gè)入口的32位S盒:

S(1,0),S(1,1),……,S(1,255)

S(2,0),S(2,1),……,S(2,255)

S(3,0),S(3,1),……,S(3,255)

S(4,0),S(4,1),……,S(4,255)

生成算法
(1)用固定字符串順序初始化P數(shù)組和S盒,字符串由16進(jìn)制值組成。例如:
P1=0x243f6a88

P2=0x85a308d3

P3=0x13198a2e

P4=0x03707344

(2)用P1和密鑰的前32位進(jìn)行與運(yùn)算,P2和后32位進(jìn)行與運(yùn)算,依此類推直到密鑰的所有位(可能到P14),重復(fù)循環(huán)直到P數(shù)組與密鑰進(jìn)行與操作(有重復(fù)字符的短密鑰將有相同的結(jié)果,例如:A,AA,AAA等等)。

(3)當(dāng)Blowfish加密算法加密全零字符串時(shí),用第(1),(2)步所描述子鑰。

(4)用第(3)步的輸出代替p1,p2。

(5)用修改后的BLOWFISH子鑰加密第(3)步的輸出。

(6)用第(5)步輸出替換p3,p4。

(7)繼續(xù)操作,用動(dòng)態(tài)改變的BLOWFISH算法按順序替換所有的P數(shù)組和S盒。

總共需要521次重復(fù)計(jì)算產(chǎn)生所有子鑰。把子鑰存在緩沖區(qū)中要比在加密過程中重復(fù)計(jì)算好得多(這也是BLOWFISH比DES快的關(guān)鍵所在)。

數(shù)據(jù)加密

Blowfish加密算法由16輪變換組成(設(shè)x為64位輸入數(shù)據(jù)):

(1)把x平分為部分:xL,xR(32位)

(2)For i=1to16

xL=xL XOR Pi

xR=F(xL)XOR xR

交換xL,xR

(3)交換xL,xR(恢復(fù)最后一輪交換)

(4)xR=xR XOR P17

(5)xL=xLXOR P18

(6)合并xL,xR

函數(shù)F():

平分xL為4個(gè)8位子塊:a、b、c、d

F(xL)={[S(1,a)+S(2,b)mod232]XOR S(3,c)}+S(4,d)mod232

數(shù)據(jù)解密

解密與加密類似,但P1,P2,……,P18順序相反。

安全性分析

據(jù)密碼分析人士研究,目前對(duì)于16輪的Blowfish加密算法還沒有破解的方法,但是對(duì)于少于16輪的blowfish則可以通過某些手段加以破解。

Blowfish加密算法存在弱密鑰,但生成弱密鑰的機(jī)率是很低的。Blowfish的提出者B.Schneier則認(rèn)為,雖然對(duì)于弱密鑰的分析是非常重要的,但尋找blowfish的弱密鑰是不必要的。但是從實(shí)際應(yīng)用中可以看出,該算法的強(qiáng)度還是相當(dāng)高的。