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按相反顺序使用。