Blowfish加密算法是一种常用的强对称加密算法,由于它的高效、容易实现等优良性能,正越来越多地运用于电子商务、军事、安全通信等诸多领域,逐步取代了DES的地位。16轮Blowfish加密算法可以抗差分攻击。
BLOWFISH-64(以下简记为BLOWFISH)是可变长密钥64位块加密系统。算法可分为两部分(密钥扩展部分和数据加密或解密部分):
密钥扩展部分把密钥(至多448位)转换为一些字密钥序列(共4168位)。
数据加密或解密部分包括16轮位操作,每一轮由密钥变换和数据变换组成。所有的操作都为32位与运算。每轮唯一的附加操作是四次数据查询。
算法描述
子密钥生成
Blowfish加密算法要使用很多字密钥,这些字密钥都在数据加密或数据解密前被计算出来。
(1)P数组由18个32位字密钥组成:P1,P2,……,P18
(2)还有4个具有256个入口的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数组和S盒,字符串由16进制值组成。例如:
P1=0x243f6a88
P2=0x85a308d3
P3=0x13198a2e
P4=0x03707344
(2)用P1和密钥的前32位进行与运算,P2和后32位进行与运算,依此类推直到密钥的所有位(可能到P14),重复循环直到P数组与密钥进行与操作(有重复字符的短密钥将有相同的结果,例如:A,AA,AAA等等)。
(3)当Blowfish加密算法加密全零字符串时,用第(1),(2)步所描述子钥。
(4)用第(3)步的输出代替p1,p2。
(5)用修改后的BLOWFISH子钥加密第(3)步的输出。
(6)用第(5)步输出替换p3,p4。
(7)继续操作,用动态改变的BLOWFISH算法按顺序替换所有的P数组和S盒。
总共需要521次重复计算产生所有子钥。把子钥存在缓冲区中要比在加密过程中重复计算好得多(这也是BLOWFISH比DES快的关键所在)。
数据加密
Blowfish加密算法由16轮变换组成(设x为64位输入数据):
(1)把x平分为部分:xL,xR(32位)
(2)For i=1to16
xL=xL XOR Pi
xR=F(xL)XOR xR
交换xL,xR
(3)交换xL,xR(恢复最后一轮交换)
(4)xR=xR XOR P17
(5)xL=xLXOR P18
(6)合并xL,xR
函数F():
平分xL为4个8位子块:a、b、c、d
F(xL)={[S(1,a)+S(2,b)mod232]XOR S(3,c)}+S(4,d)mod232
数据解密
解密与加密类似,但P1,P2,……,P18顺序相反。
安全性分析
据密码分析人士研究,目前对于16轮的Blowfish加密算法还没有破解的方法,但是对于少于16轮的blowfish则可以通过某些手段加以破解。
Blowfish加密算法存在弱密钥,但生成弱密钥的机率是很低的。Blowfish的提出者B.Schneier则认为,虽然对于弱密钥的分析是非常重要的,但寻找blowfish的弱密钥是不必要的。但是从实际应用中可以看出,该算法的强度还是相当高的。