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的弱密钥是不必要的。但是从实际应用中可以看出,该算法的强度还是相当高的。