Blowfish算法的操作是什么?


Blowfish是一种对称分组密码算法,它一次加密64位的数据块。它遵循Feistel网络,其工作过程分为两个部分。

  • 子密钥生成 - 此过程将长度最长为448位的密钥转换为子密钥,总共添加4168位。

  • 数据加密 - 在数据加密过程中,它将迭代16次网络。每一轮都包括密钥相关的置换和密钥和数据相关的替换。算法中的运算是在32位字上进行的异或或加法运算。唯一的额外运算是在每一轮中进行四次索引数组信息查找。

让我们讨论这两个部分:

  • 子密钥生成 - Blowfish密码算法使用大量的子密钥。这些密钥在任何数据加密或解密之前都会生成。

    P数组包含18个32位子密钥:

    P1,P2,………….,P18。

    有四个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数组和四个S盒,该字符串还包含π的十六进制数字。

      P1=0x243f6a88, P2=0x85a308d3, P3=0x13198a2e, P4=0x3707344,等等。

    • 将P1与密钥的前32位进行异或运算,将P2与密钥的第二32位进行异或运算,依此类推,直到密钥的所有位(最多可达P14)。重复此过程,直到整个P数组都与密钥位进行了异或运算。(对于每个短密钥,都存在部分等效的长密钥。例如,如果A是64位密钥,则AA、AAA等都是相同的密钥。)

    • 可以使用步骤1和步骤2中定义的子密钥,使用Blowfish算法加密全零字符串。

    • 可以使用步骤(3)的64位输出恢复P1和P2。

    • 可以使用修改后的子密钥,使用该算法加密步骤(3)的输出。

    • 可以使用步骤(5)的输出恢复P3和P4。

    • 可以使用此过程继续,使用不断变化的算法的输出恢复P数组的所有条目,然后按顺序恢复所有四个S盒。

    • 总共需要521次迭代才能生成所有所需的子密钥。应用程序可以保存子密钥,而不是多次执行此推导过程。

  • 数据加密 - Blowfish是一个包含16轮的Feistel网络。

    输入是64位数据元素x。

    将x分成两个32位半部分:xL, xR

    然后,对于i = 1到16;

    xL = xL XOR Pi

    xR = F(xL) XOR xR

    交换xL和xR

    第16轮之后,再次交换xL和xR以撤消最后一次交换。

    然后,密文 = xL和xR的连接,xR = xR XOR P17 和 xL = xL XOR P18

    最后,重新组合xL和xR以获得密文。解密与加密相同,只是P1、P2……P18按相反顺序使用。

更新于:2022年3月15日

5K+浏览量

启动您的职业生涯

完成课程获得认证

开始
广告