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个字组成,记为Siji=1,2,3,4; j=0,1, …,255)。

数据加密采用一个16层的平衡Feistel结构,每层由一次加乱、一个P置换和一个S盒代替组成,层内也只有简单的xor和模232加运算。

输入的64比特明文平分成32比特的左右两部分,记为XLXR。16层加密过程可用下面的伪代码表示。

for i=1 to 16 do
{
    XL=XLPi
    XR=XRF(XL)
    交换XLXR
}
XL=XRP17
XR=XLP18

XLXR即密文。

层函数F如下:将XL从左到右按字节分成4个值(abcd),然后分别在4个S盒(S1S2S3S4)中进行代替,得到4个字S1aS2bS3cS4d,按下式对这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串进行加密,用最后输出的XLXR替代P1P2;然后将XLXR作为明文,用更新后的子密钥和BLOWFISH加密算法进行加密,用最后输出的XLXR替代P3P4;重复此过程521次,更新1042个的子密钥。

和DES加密算法相比,BLOWFISH加密算法减少了S盒的数量,但是它的S盒不是固定不变的,而是随密钥数据变化的,结构是未知的。4个S盒的输出经过模2加和模232加结合后才作为层函数F的输出,各层所加乱数各不相关,因此BLOWFISH加密算法能有效抵制线性攻击和差分分析攻击,具有极高的安全性。