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。