IDEA加密与实现

背景

IDEA全称International Data Encryption Algorithm,即国际数据加密算法。也是一种强大的加密算法,原本目的是取代DES,但是由于专利的存在,IDEA并没有DES使用广泛,但是如PGP加密程序就是用的IDEA。

IDEA和DES一样,都是可逆的,加解密算法相同,也利用了扩展和混淆思想

基本原理

加密前明文进行分块,每块64位,秘钥位128位。加密时,首先将明文分为4组,每组16位,作为第一轮的输入,总共需要8轮。在每一轮中,从128位的秘钥中产生6组子秘钥,每组16位,用这6组子秘钥对输入的4组明文进行一系列操作,产生一轮的输出,并作为下一轮输入。8轮结束后进行一次变换,这次变换需要4个子秘钥,组合起来得到64位密文。

轮次

每一轮有14步,基本流程如下(我们将4组输入定义为P1-P4,6组秘钥定义为k1-K6):

  1. P1与K1相乘
  2. P2与K2相加
  3. P3与K3相加
  4. P4与K4相乘
  5. 第1步结果与第2步结果异或
  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分别为输出的第1-4组,示意图如下(图中红圈代表相乘运算,篮圈代表异或运算,绿圈代表相加运算:

注意步骤中的加或乘并不是简单的加与乘。对于加法,加之后用2^16(即65536)求模。对于乘法,乘之后用2^16 + 1(即65537)求模。求模主要是为了保证输出为16位。

子秘钥生成

总体来看,前8轮每轮需要8个子秘钥,最后一个输出变换需要4个子秘钥

第一轮

第一轮开始前我们有一组128位的原始秘钥,第一轮用前96位,每16位一组,公6组

第二轮

第二轮先使用没有用的32位,共两组,还差4组64位秘钥。然后将原始秘钥循环左移25位,再取前64位,作为后四组秘钥。

第三轮

上一轮还剩64位,作为该轮的前四组秘钥,然后再左移25位,选前32位作为剩下两组子秘钥。

后面几轮一次类推,每次都先使用上一轮未使用的,对于不够的先循环左移,再取秘钥

输出变换

第8轮之后,有四组输出,然后进行输出变换,具体过程如下(将4组输出定义为R1-R4,4组秘钥定义为K1-K4):

  1. R1与K1相乘
  2. R2与K2相加
  3. R3与K3相加
  4. R4与K4相乘

注意,相加相乘还是和之前8轮里的加和乘一样操作。对于子秘钥,第8轮是刚好把128位的后96位用完。这一次,依旧先左移25位,然后取前64位作为4组秘钥

解密

解密算法和加密算法是一样的,只是秘钥有所不同。

  • 第i(1-9)轮的解密秘钥的前4四个子秘钥由加密过程中第10-i轮的前四个子秘钥得出
  • 其中第1与第4个子秘钥为对应子秘钥关于2^16 + 1的乘法逆元
  • 第 2 个和第 3 个子密钥的取法为:1.当轮数为 2,…,8 时,取相应的第 3 个和第 2 个的子密钥的2^16加法逆元 2.当轮数为 1 或 9 时,取相应的第 2 个和第 3 个子密钥对应的2^16加法逆元
  • 第 5 和第 6 个密钥不变

简单实现

java代码见这里

题图来自unsplash:https://unsplash.com/photos/WDOJ5256Cvk