📄 新建 文本文档.txt
字号:
IDEA是一种由8个相似圈(Round)和一个输出变换(Output Transformation)组成的迭代算法。IDEA的每个圈都由三种函数:模(216+1)乘法、模216加法和按位XOR组成。
在加密之前,IDEA通过密钥扩展(Key Expansion)将128bit的密钥扩展为52Byte的加密密钥EK(Encryption Key),然后由EK计算出解密密钥DK(Decryption Key)。EK和DK分为8组半密钥,每组长度为6Byte,前8组密钥用于8圈加密,最后半组密钥(4Byte)用于输出变换。IDEA的加密过程和解密过程是一样的,只不过使用不同的密钥(加密时用EK,解密时用DK)。
密钥扩展的过程如下:
1. 将128bit的密钥作为EK的前8byte;
2. 将前8byte循环左移25bit,得到下一8byte,将这个过程循环7次;
3. 在第7次循环时,取前4byte作为EK的最后4byte;
4. 至此52byte的EK生成完毕。
IDEA是一个迭代分组密码,分组长度为64比特,密钥长度为128比特。
IDEA密码中使用了以下三种不同的运算:
逐位异或运算;
模216加运算;
模216+1乘运算,0与216对应。
IDEA算法是由8轮迭代和随后的一个输出变换组成。它将64比特的数据分成4个子块,每个16比特,令这四个子块作为迭代第一轮的输出,全部共8轮迭代。每轮迭代都是4个子块彼此间以及16比特的子密钥进行异或,模216加运算,模216+1乘运算。除最后一轮外把每轮迭代输出的四个子块的第二和第三子块互换。该算法所需要的"混淆"可通过连续使用三个"不相容"的群运算于两个16比特子块来获得,并且该算法所选择使用的MA-(乘加)结构可提供必要的"扩散"。
3.IDEA算法的具体描述
3.1密钥生成
用户输入128位长密钥
Key = k1k2k3…k127k128
IDEA总共进行8轮迭代操作,每轮需要6个子密钥,另外还需要4个额外子密钥,所以总共需要52个子密钥,这个52个子密钥都是从用户输入的128位密钥中扩展出来的.
首先把输入的Key分成8个16位的子密钥, 1~6号子密钥供第一轮加密使用,7~8号子密钥供第二轮使用,然后把这个128位密钥循环左移25位,这样Key = k26k27k28…k24k25
把新生成的Key在分成8个16位的子密钥,1~4号子密钥供第二轮加密使用(前面已经提供了两个)5~8号子密钥供第三轮加密使用 ,到此我们已经得到了16个子密钥,如此继续,当循环左移了5次之后已经生成了48个子密钥,还有四个额外的子密钥需要生成,再次把Key循环左移25位,选取划分出来的8个16位子密钥的前4个作为那4个额外的加密密钥.供加密使用的52个子密钥生成完毕.
3.2加密明文
64-位数据分组被分成4个16-位子分组:D0,D1,D2,D3。这4个子分组成为算法的第一轮的输入,总共有8轮。
在第i轮中,假定输入的为:
明文(4组):D0,D1,D2,D3
密钥(6组) K1, K2, K3, K4, K5,K6
执行的顺序如下:
D0和第一个子密钥(K1) 模216+1乘。
D1和第二个子密钥(K2) 模216加。
D2和第三个子密钥(K3) 模216加。
D4和第四个子密钥(K4) 模216+1乘。
第(1)步和第(3)步的结果相异或。
将第(2)步和第(4)步的结果相异或。
将第(5)步的结果与第五个子密钥(K5) 模216+1乘。
将第(6)步和第(7)步的结果模216加。
将第(8)步的结果与第六个子密钥(K6) 模216+1乘。
将第(7)步和第(9)步的结果模216加。
将第(1)步和第(9)步的结果相异或。
将第(3)步和第(9)步的结果相异或。
将第(2)步和第(10)步的结果相异或。
将第(4)步和第(10)步的结果相异或。
将第(11)、(12)、(13)和(14) 步的结果形成的4个子分组D0,D1,D2,D3作为输出,然后将中间两个分组(D1,D2)交换(最后一轮除外)后,作为为下一轮的输入。
经过8轮运算之后,有一个最终的输出D0,D1,D2,D3,对这4个输出子分组进行如下操作:
(1) D0和第一个额外子密钥模216+1乘。
(2) D1和第二个额外子密钥模216加。
(3) D2和第三个额外子密钥模216加。
(4) D3和第四个额外子密钥模216+1乘。
最后,这4个子分组重新连接到一起产生密文。
首先从用户输入的128位密钥扩展出52个子密钥,存放在ULONG16 Key[52]数组中,然后对这个52个子密钥进行换位操作,
由于在IDEA中采用了乘法运算,这就要考虑到两个乘数是否为0 的情况,如果两个乘数都为0,那么乘法运算结果为0,如果仅有一个乘数为0,那么用65536替换那个为0的乘数,取乘法运算结果的低16位作为输出结果.
INT32 MUL( ULONG16 a, ULONG16 b)/*(a*b)*/
{
ULONG32 p;
if ( a == 0 && b == 0 )
{
p = 0 ;
}
else if ( a == 0 )
{
p = 65536*(ULONG32)b;
}
else if ( b == 0)
{
p = 65536*(ULONG32)a;
}
else
{
p = (ULONG32)a*(ULONG32)b;
}
return (ULONG16 )(p%65537);
}
下面介绍有关x逆元的计算方法.
X模216加法逆比较简单: x -1 = 65536 – x ;
X模216+1乘法法逆和X的关系如下:
(X*X-1 ) %65537 = 1
求解X-1需要一定的计算量,具体的算法实现代码如下:
#define LOW16(x) ((x)&0xffff)
ULONG16 mulInv( ULONG16 x)
{
ULONG16 t0,t1;
ULONG16 q,y;
if ( x<=1)
{
return x;
}
t1 = 0x10001L/x;
y = 0x10001L%x;
if(y == 1)
{
return LOW16(1-t1);
}
t0 = 1 ;
do
{
q = x/y;
x %= y;
t0 += q*t1;
if( x == 1)
{
return t0;
}
q = y/x;
y %=x;
t1 += q*t0;
}while( y != 1);
return LOW16(1-t1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -