📜  简化的国际数据加密算法(IDEA)

📅  最后修改于: 2021-05-07 08:24:11             🧑  作者: Mango

在密码学中,块密码在许多密码算法的设计中非常重要,并且被广泛用于对大块数据进行加密。分块表示,密码在加密过程中采用固定大小的明文,并使用固定长度的密钥生成固定大小的密文。算法的强度取决于其密钥长度。

简化的国际数据加密算法(IDEA)是一个对称密钥块密码,它:

  • 使用16位固定长度的明文,并且
  • 将它们加密成4个块,每个块4位
  • 产生16位密文
  • 使用的密钥长度为32位
  • 密钥也分为8个块,每个块4位。

此算法涉及4个相同的完整回合和1个半回合的序列。每个完整回合涉及一系列14个步骤,其中包括以下操作:

  • 按位异或
  • 加法模(2^4)
  • 模乘(2^4) +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 (2^4)+1
+ Addition modulo (2^4)
^ 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。涉及的步骤如下:

  1. X1 * K1
  2. X2 + K2
  3. X3 + K3
  4. X4 * K4
  5. 步骤1 ^步骤3
  6. 步骤2 ^步骤4
  7. 步骤5 * K5
  8. 步骤6 +步骤7
  9. 步骤8 * K6
  10. 步骤7 +步骤9
  11. 步骤1 ^步骤9
  12. 步骤3 ^步骤9
  13. 步骤2 ^步骤10
  14. 步骤4 ^步骤10

下一轮的输入是步骤11 ||。步骤13 ||步骤12 ||步骤14,变为X1 || X2 || X3 || X4 12至13之间的交换发生在每个完整回合之后,最后一个完整回合(第4个回合除外),最后半个回合的输入为步骤11 ||。步骤12 ||步骤13 ||步骤14。

在上一轮完整的回合之后,半回合如下:

  1. X1 * K1
  2. X2 + K2
  3. X3 + K3
  4. 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