Blowfish算法中子密钥是如何生成的?


Blowfish是一种对称分组密码算法,由布鲁斯·施奈尔于1993年12月发明。Blowfish是DES或IDEA的替代方案。Blowfish是最流行的Feistel网络密码之一。Blowfish算法具有64位块大小和可变密钥长度(从42位到448位)。该算法包括密钥扩展部分和数据加密部分。

Blowfish将最多448位的密钥创建为多个子密钥数组,总共1042个32位值或4168字节。它是一个16轮Feistel系统,支持非常高的密钥相关S盒并启用16次迭代。

每一轮都使用密钥和数据相关的替换以及密钥相关的置换进行调整。32位字和XOR运算通过加法实现。有一个P数组和四个32位的S盒。

P数组包含18个32位的子密钥,而每个S盒包含256个条目。输入是一个64位数据元素。子密钥生成的流程如下:

  • Blowfish使用了大量的子密钥。这些密钥必须在加密和解密出现之前准备好。密钥大小字段从32位到448位。换句话说,密钥大小范围从1到14个字,每个字包含一个32位的字。这些密钥按如下方式保存在数组中:

    K1、K2、…、Kn,其中1 ≤ n ≤ 14

  • 包含18个32位子密钥的P数组的概念:

    P1、P2、……、P18。

    P数组的创建将在后面描述。

  • 有四个32位S盒,每个包含256个条目:

    S1, 0、S1, 1… S1, 255

    S2, 0、S2, 1… S2, 255

    S3, 0、S3, 1… S3, 255

    S4, 0、S4, 1… S4, 255

    P数组的创建将在后面定义。

  • 可以先初始化P数组,然后初始化四个S盒,使用一个固定的字符串。

  • P数组和四个S盒表示为Pi的十六进制数字。

  • 可以实现P数组和K数组的按位XOR运算,重复使用密钥位所需的K数组中的字(即,P1 XOR(密钥的32位),P2 XOR(密钥的32位)。

  • 可以加密64位块,并使用以下加密过程来使用通用的P和S数组加密全零数据。

  • 可以使用加密的输出替换p1和p2,新的输出称为p1和p2。

  • 可以使用当前的P盒和S盒加密步骤3的输出,并使用加密后的文本替换p3和p4,新的输出称为p3和p4。

  • 可以重复以下步骤,直到获取P数组的所有元素,即P1、P2。

更新于:2022年3月15日

1K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告