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):
- P1与K1相乘
- P2与K2相加
- P3与K3相加
- P4与K4相乘
- 第1步结果与第2步结果异或
- 第2步结果与第4步结果异或
- 第5步结果与K5相乘
- 第6步结果和第7步结果相乘
- 第8步与K6相乘
- 第7步与第9步相加
- 第1步结果与第9步结果异或
- 第3步结果与第9步结果异或
- 第2步结果与第10步结果异或
- 第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):
- R1与K1相乘
- R2与K2相加
- R3与K3相加
- 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