在密码学中,块密码在许多密码算法的设计中非常重要,并且被广泛用于对大块数据进行加密。分块表示,密码在加密过程中采用固定大小的明文,并使用固定长度的密钥生成固定大小的密文。算法的强度取决于其密钥长度。
简化的国际数据加密算法(IDEA)是一个对称密钥块密码,它:
- 使用16位固定长度的明文,并且
- 将它们加密成4个块,每个块4位
- 产生16位密文。
- 使用的密钥长度为32位。
- 密钥也分为8个块,每个块4位。
此算法涉及4个相同的完整回合和1个半回合的序列。每个完整回合涉及一系列14个步骤,其中包括以下操作:
- 按位异或
- 加法模
- 模乘 +1
经过4个完整回合后,最后的“半回合”仅包含先前在完整回合中使用的14个步骤中的前4个。要执行这些回合,必须将每个二进制符号转换为其等效的十进制符号,执行该操作,并将获得的结果转换回该特定步骤的最终结果的二进制表示形式。
密钥计划:在每个完整回合中使用8个子项中的6个4位子项,而在半回合中使用4个子项。因此,4.5回合需要28个子项。给定的键“ K”直接给出前8个子键。通过在每组8个子键之间向左旋转主键6位,可以创建另外的8个子键组,这意味着该键每轮少于一圈(3圈)。
K1 | K2 | K3 | K4 | K5 | K6 | |
---|---|---|---|---|---|---|
Round 1 | 1101 | 1100 | 0110 | 1111 | 0011 | 1111 |
Round 2 | 0101 | 1001* | 0001 | 1011 | 1100 | 1111 |
Round 3 | 1101 | 0110 | 0111 | 0111* | 1111 | 0011 |
Round 4 | 1111 | 0101 | 1001 | 1101 | 1100 | 0110* |
Round 4.5 | 1111 | 1101 | 0110 | 0111 |
*表示位移
在14个步骤中使用的符号:
Symbol | Operation |
---|---|
* | Multiplication modulo +1 |
+ | Addition modulo |
^ | Bitwise XOR |
16位纯文本可以表示为X1 ||。 X2 || X3 || X4 ,每个大小为4位。 32位密钥分为8个子密钥,表示为K1 ||。 K2 || K3 || K4 || K5 || K6 || K7 || K8,每个大小又为4位。每轮14个步骤使用三个代数运算-加法模(2 ^ 4),乘法模(2 ^ 4)+1和按位XOR。涉及的步骤如下:
- X1 * K1
- X2 + K2
- X3 + K3
- X4 * K4
- 步骤1 ^步骤3
- 步骤2 ^步骤4
- 步骤5 * K5
- 步骤6 +步骤7
- 步骤8 * K6
- 步骤7 +步骤9
- 步骤1 ^步骤9
- 步骤3 ^步骤9
- 步骤2 ^步骤10
- 步骤4 ^步骤10
下一轮的输入是步骤11 ||。步骤13 ||步骤12 ||步骤14,变为X1 || X2 || X3 || X4 12至13之间的交换发生在每个完整回合之后,最后一个完整回合(第4个回合除外),最后半个回合的输入为步骤11 ||。步骤12 ||步骤13 ||步骤14。
在上一轮完整的回合之后,半回合如下:
- X1 * K1
- X2 + K2
- X3 + K3
- X4 * K4
通过连接块获得最终输出。
例子:
Key: 1101 1100 0110 1111 0011 1111 0101 1001
Plaintext: 1001 1100 1010 1100
Ciphertext: 1011 1011 0100 1011
解释:
解释仅适用于第一个完整回合(可以类似地实现)和最后一个半回合。
- 第1轮:
- 从明文来看: X1 – 1001,X2 – 1100,X3 – 1010,X4 – 1100
- 从上表中可以看出: K1-1110,K2-1100,K3-0110,K4-1-11,K5-0011,K6-1-11
-
(1001(9) * 1101(13))(mod 17) = 1111(15) (1100(12) + 1100(12))(mod 16) = 1000(8) (1010(10) + 0110(6))(mod 16) = 0000(0) (1100(12) * 1111(15))(mod 17) = 1010(10) (1111(15) ^ 0000(0)) = 1111(15) (1000(8) ^ 1010(10)) = 0010(2) (1111(15) * 0011(3))(mod 17) = 1011(11) (0010(2) + 1011(11))(mod 16) = 1101(13) (1101(13) * 1111(15))(mod 17) = 1000(8) (1011(11) + 1000(8))(mod 16) = 0011(3) (1000(8) ^ 1111(15)) = 0111(7) (1000(8) ^ 0000(0)) = 1000(8) (0011(3) ^ 1000(8)) = 1011(11) (0011(3) ^ 1010(10)) = 1001(9)
- 第一轮输出:0111 1011 1000 1001(步骤12和步骤13的结果互换)
- 第二回合
- 从第1轮输出: X1-0111,X2-1011,X3-1000,X4-1001
- 根据上表: K1-0101,K2-1001,K3-0001,K4-1011,K5-1100,K6-1111
- 第二轮输出:0110 0110 1110 1100
- 第三回合
- 从第二回合输出: X1-0110,X2-0110,X3-1110,X4-1100
- 从上表中可以看到: K1-1110,K2-0110,K3-011,K4-101,K5-1-11,K6-1011
- 第三回合输出:0100 1110 1011 0010
- 第四回合:
- 从第3轮输出: X1 – 0100,X2 – 1110,X3 – 1011,X4 – 0010
- 从上表开始: K1-1111,K2-0101,K3-1001,K4-1101,K5-1100,K6-0110
- 第4轮输出:0011 1110 1110 0100(步骤12和步骤13的结果不互换)
- 回合4.5:
- 从第4轮输出: X1-0011,X2-1110,X3-1110,X4-0100
- 根据上表: K1 – 1111,K2 – 1101,K3 – 0110,K4 – 0111
-
(0011(3) * 1111(15))(mod 17) = 1011(11) (1110(14) + 1101(13))(mod 16) = 1011(11) (1110(14) + 0110(6))(mod 16) = 0100(4) (0100(4) * 0111(7))(mod 17) = 1011(11)
- 最终的密文是1011 1011 0100 1011 。