1.算法原理

BlowFish算法基于Feistel网络,加密函数迭代执行16轮,分组长度为64位,密钥长度可以从32位到448位。算法由两部分组成,密钥扩展部分和数据加密部分,密钥扩展部分将最长最长为448位的密钥转化成共4168字节长度的子密钥数组,其中,数据加密由一个16轮的Feistel网络完成,每轮由一个密钥相关置换和一个密钥与数据相关的替换组成。

(1)子密钥

BlowFish算法子密钥在加密前预计算产生。

P数组由18个32位字的子密钥组成。P1,P2”””.P18

4个8X32的包含总共1024个32位字的S-box.

子密钥扩展算法如下:

    按顺序使用常数π的小数部分初始化P数组和S-box
    对P数组和密钥进行逐位异或,需要时重用密钥。
    使用当前的P数组和S-box,对全0和64位分组使用BlowFish算法进行加密,用输出替代P1,p2,
    使用当前的P和S对第3步的输出进行加密,并输出替代P3,P4
    继续上面的过程,直到按顺序替代所用的P数组和S-Box中的元素。

2.加密代码实现

BlowFish由16轮的Fistel网络组成,输入是一个64位的数据元素X,将X分成两个32位部分,XL,XR,加密如下:

void Blowfish_encipher(unsigned long *xl, unsigned long *xr)
{
   unsigned long  Xl;
   unsigned long  Xr;
   unsigned long  temp;
   short          i;
 
   Xl = *xl;
   Xr = *xr;
 
   for (i = 0; i < 16; ++i) {   //16轮的
      Xl = Xl ^ P[i];
      Xr = F(Xl) ^ Xr;
 
      temp = Xl;
      Xl = Xr;
      Xr = temp;
   }
 
   temp = Xl;
   Xl = Xr;
   Xr = temp;
 
   Xr = Xr ^ P[N];
   Xl = Xl ^ P[N + 1];
  
   *xl = Xl;
   *xr = Xr;
}

ANALYZER通过检测4个8X32的包含总共1024个32位字的S-box.但通过动态读取方式时,较难识别。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。