国际数据加密算法
国际数据加密算法(IDEA)是瑞士的著名学者提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到具有密钥太短等缺点,已经过时。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。 类似于DES,IDEA算法也是一种数据块加密算法,它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。 由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。但由于该算法出现的时间不长,针对它的攻击也还不多,还未经过较长时间的考验。因此,尚不能判断出它的优势和缺陷。
IDEA加密算法简介 IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。 早在1990年,Xuejia Lai等人在EuroCrypt’90年会上提出了分组密码建议PES(Proposed Encryption Standard)。在EuroCrypt’91年会上, Xuejia Lai等人又提出了PES的修正版IPES(Improved PES)。目前IPES已经商品化,并改名为IDEA。IDEA已由瑞士的Ascom公司注册专利,以商业目的使用IDEA算法必须向该公司申请许可。 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生成完毕。
密钥扩展的过程如表1所示,为了能够清楚的看出每个8Byte的关系,在表1中用粗线条将将每个8Byte划分开了. IDEA算法相对来说是一个比较新的算法,其安全性研究也在不断进行之中。在IDEA算法公布后不久,就有学者指出:IDEA的密钥扩展算法存在缺陷,导致在IDEA算法中存在大量弱密钥类,但这个弱点通过简单的修改密钥扩展算法(加入异或算子) 即可克服。在1997年的EuroCrypt’97年会上,John Borst等人提出了对圈数减少的IDEA的两种攻击算法:对3.5圈IDEA的截短差分攻击(Truncate Diffrential Attack)和对3圈IDEA的差分线性攻击(Diffrential Linear Attack)。但作者也同时指出,这两种攻击算法对整8.5圈的IDEA算法不可能取得实质性的攻击效果。目前尚未出现新的攻击算法,一般认为攻击整 8.5圈IDEA算法唯一有效的方法是穷尽搜索128bit的密钥空间。 目前IDEA在工程中已有大量应用实例,PGP(Pretty Good Privacy)就使用IDEA作为其分组加密算法;安全套接字层SSL(Secure Socket Layer)也将IDEA包含在其加密算法库SSLRef中;IDEA算法专利的所有者Ascom公司也推出了一系列基于IDEA算法的安全产品,包括:基于IDEA的Exchange安全插件、IDEA加密芯片、IDEA加密软件包等。IDEA算法的应用和研究正在不断走向成熟。
C程序实现
#include
#include #include #include #define maxim 65537 #define fuyi 65536 #define one 65536 #define round 8
unsigned int inv(unsigned int xin); unsigned int mul(unsigned int a,unsigned int b); void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10]); void key(unsigned int uskey[9],unsigned int Z[7][10]); void de_key(unsigned int Z[7][10],unsigned int DK[7][10]);
void main() { int i,j,k,x; unsigned int Z[7][10],DK[7][10],XX[5],TT[5],YY[5]; unsigned int uskey[9]; FILE *fpout,*fpin; printf("\n Input Key"); for(i=1;i<=8;i++) scanf("%6u",&uskey[i]); for(i=0;i<9;i++) uskey[i]=100+i*3; key(uskey,Z);/*产生加密子密钥*/ de_key(Z,DK);/*计算解密子密钥*/ if((fpin=fopen("ekey.txt","w"))==NULL) { printf("cannot open file!"); exit(EXIT_FAILURE); } for(i=0;i<7;i++) { for(j=0;j<10;j++) fprintf(fpin,"%6u",Z[i][j]); fprintf(fpin,"\n"); } fclose(fpin);
/*XX[1..5]中为明文*/ for(i=0;i<4;i++) XX[i]=2*i+101; clrscr(); printf("Ming wen %6u %6u %6u %6u \n",XX[0],XX[1],XX[2],XX[3]); if((fpin=(fopen("ideaming.txt","w")))==NULL) {printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpin,"%6u,%6u,%6u,%6u \n",XX[0],XX[1],XX[2],XX[3]); fclose(fpin); for(i=1;i<=30000;i++) cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/ printf("\n\n Mingwen %6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]); if((fpin=fopen("ideamiwn.txt","w"))==NULL) { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u\n",YY[0],YY[1],YY[2],YY[3]); { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]); fclose(fpout);
for(i=1;i<=30000;i++) cip(YY,TT,DK);/*encipher YY to TT with Key DK*/ printf("\n Jie Mi %6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]); if((fpout=fopen("dideaout.txt","w"))==NULL) { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]); fclose(fpout); } /* 此函数执行IDEA算法中的加密过程*/ void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10]) { unsigned int r,x1,x2,x3,x4,kk,t1,t2,a; x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3]; for(r=1;r<=8;r++) { /* 对64位的块进行分组运算*/ x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]); x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one; /* MA结构的函数 */ kk=mul(Z[5][r],(x1^x3)); t1=mul(Z[6][r],(kk+(x2^x4))&one;
/* 随机变换PI*/ x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a; } /* 输出转换*/ OUT[0]=mul(x1,Z[1][round+1]); OUT[3]=mul(x4,Z[1][round+1]); OUT[1]=(x3+Z[2][round+1])&one; OUT[2]=(x2+Z[3][round+1])&one; } /* 用高低算法上实现乘法运算*/ unsigned int mul(unsigned int a,unsigned int b) { long int p; long unsigned q; if(a==0) p=maxim-b; else if(b==0) p=maxim-a; else { q=(unsigned long)a*(unsigned long)b; p=(q&one)-(q>>16); if(p<=0) p=p+maxim; { return (unsigned) (p&one); }
/*通过Euclidean gcd算法计算xin的倒数*/ unsigned int inv(unsigned int xin) { long n1,n2,q,r,b1,b2,t; if(xin==0) b2=0; else {n1=maxim;n2=xin;b2=1;b1=0; do{ r=(n1%n2);q=(n1-r)/n2; if(r==0) if(b2<0) b2=maxim+b2; else {n1=n2;n2=r; t=b2; b2=b1-q*b2;b1=t; } }while(r!=0); } return (unsigned long int)b2; }
/*产生加密子密钥Z*/ void key(unsigned int uskey[9],unsigned int Z[7][10]) { unsigned int S[54]; int i,j,r; for(i=1;i<9;i++) S[i-1]=uskey[i]; /* shifts */ for(i=8;i<54;i++) { if(i+2)%8==0)/* 对于S[14],S[22],...进行计算 */ S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one; else if((i+1)%8==0)/* 对于S[15],S[23],...进行计算 */ S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one; else S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one; } /*取得子密钥*/ for(r=1;r<=round+1;r++) for(j=1;j<7;j++) Z[j][r]=S[6*(r-1)+j-1]; }
/* 计算解子密钥DK */ void de_key(unsigned int Z[7][10],unsigned int DK[7][10]) { int j; for(j=1;j<=round+1;j++) {DK[1][round-j+2]=inv(Z[1][j]); DK[4][round-j+2]=inv(Z[4][j]); if(i==1|j==round+1) { DK[2][round-j+2]=(fuyi-Z[2][j])&one; DK[3][round-j+2]=(fuyi-Z[3][j])&one; } else { DK[2][round-j+2]=inv(Z[3][j]); DK[3][round-j+2]=inv(Z[2][j]); } } for(j=1;j<=round+1;j++) { DK[5][round-j+2]=inv(Z[5][j]); DK[6][round-j+2]=inv(Z[6][j]); } }
阅读(4081) | 评论(0) | 转发(0) |