1.11 ICE加密算法
ICE(Information Concealment Engine)是由澳大利亚的Matthew Kwan于1997年提出的一个标准的Feistel分组密码。ICE加密算法的结构和DES加密算法完全相同。DES加密算法自1977年问世以来,已经被广泛用于国际标准,许多专家对它进行了专门攻击研究,它的许多弱点已经逐渐暴露出来,如可以被差分攻击和线性攻击等。ICE加密算法在层函数F的设计中采取了一些新的手段来克服DES加密算法的不足,并在运行速度和安全两方面进行了折中考虑。
ICE加密算法的分组长度为64比特,密钥长度为64比特,迭代层数为16。64比特的输入被平分成32比特的左右两部分,右半部分和60比特的层密钥作为F函数的输入,层函数F的输出同左半部分进行模2加,然后交换左、右两部分,重复该过程至第16层,最后一层左、右两部分不交换。同DES加密算法相比,ICE加密算法只是缺少输入和输出的变换。
ICE加密算法的F函数结构同DES加密算法的层函数F的结构非常相似。
1.E扩展
将输入的32比特从左到右依次记为p31、p30、…、p1、p0,按下列规律将32比特扩展成40比特,从左到右记为4个10比特的字,即E1、E2、E3、E4。
E1=p1p0p31p30p29p28p27p26p25p24
E2=p25p24p23p22p21p20p19p18p17p16
E3=p17p16p15p14p13p12p11p10p9p8
E4=p9p8p7p6p5p4p3p2p1p0
2.由密钥控制的置换和加乱
层密钥为60比特,记为3个20比特的字SK1、SK2、SK3;记tl=(E1<<10)|E2, tr=(E3<<10)|E4。SK3用于密钥置换,当SK3的某些比特为1时,tl和tr的相应比特进行交换,可用下面的公式来表示。
t=SK3&(tl⊕tr)
tr=tr⊕t
tl=tl⊕t
SK1和tl进行模2加后作为前两个S盒的输入,SK2和tr进行模2加后作为后两个S盒的输入。
3.S盒
ICE加密算法有4个S盒,每个S盒的输入为10比特,输出为8比特。同DES加密算法相比,虽然ICE加密算法的S盒在数量上是减少了,但是每个S盒都不是固定不变的,而是依据输入数据的变化而变化的,而且变化量相当大。记S盒的10比特为X,则C为X的中间8比特组成的十进制数;R为X的最高比特和最低比特合成的十进制数;OR为每个S盒第R行的偏移量;PR为每个S盒第R行上的Galois域素数,则每个S盒可由公式(C^OR)7 mod PR生成。ICE加密算法S盒的OR和PR值如表1.11.1所示,表中,OR的值是十六进制的;PR的值是十进制的。
表1.11.1 ICE加密算法S盒的OR和PR值

4.P置换
4个S盒的输出经一个固定的P置换后合成一个新的32比特输出,并作为层函数F的输出。ICE加密算法的P置换表如表1.11.2所示。
表1.11.2 ICE加密算法的P置换表

将64比特的密钥从左到右均分成4个16比特的分组,记为KB[0]、KB[1]、KB[2]、KB[3],根据表1.11.3所示的密钥移位表从4个分组中选出某个分组,取出其低比特,依次合成16个60比特的层密钥,用C语言表示的伪代码如下:
for n=1 to 16 do { SK=0; for j=1 to 3 do for t=1 to 5 do for i=0 to 3 do { z=(i+KR[n])mod 4; B=KB[z]&1; SK=(SK<<1)|B; KB[z]=(KB[z]>>1)|(~B<<19); } kn=SK; }
表1.11.3 ICE加密算法的密钥移位表
