netcfln 发表于 2011-12-21 08:43

IDEA国际数据加密算法和实现

<DIV align=left>
<DIV style="TEXT-ALIGN: center"><SPAN style="FONT-WEIGHT: bold">国际数据加密算法  </SPAN> <BR></DIV>国际数据加密算法(IDEA)是瑞士的著名学者提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到<A href="http://baike.baidu.com/view/7510.htm" target=_blank>DES</A>具有密钥太短等缺点,已经过时。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。  类似于DES,IDEA算法也是一种数据块加密算法,它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。  由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对<A href="http://baike.baidu.com/view/8136.htm" target=_blank>加密技术</A>的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。但由于该算法出现的时间不长,针对它的攻击也还不多,还未经过较长时间的考验。因此,尚不能判断出它的优势和缺陷。 <BR><B>IDEA加密算法简介  </B><BR>&nbsp;  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)。  密钥扩展的过程如下: <BR> 1. 将128bit的密钥作为EK的前8byte; <BR> 2. 将前8byte循环左移25bit,得到下一8byte,将这个过程循环7次; <BR> 3. 在第7次循环时,取前4byte作为EK的最后4byte; <BR> 4. 至此52byte的EK生成完毕。 <BR> 密钥扩展的过程如表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算法的应用和研究正在不断走向成熟。<BR></DIV><BR>C程序实现<BR>#include&lt;stdio.h&gt; #include&lt;process.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #define maxim 65537 #define fuyi 65536 #define one 65536 #define round 8<BR><BR>unsigned int inv(unsigned int xin); unsigned int mul(unsigned int a,unsigned int b); void cip(unsigned int IN,unsigned int OUT,unsigned int Z); void key(unsigned int uskey,unsigned int Z); void de_key(unsigned int Z,unsigned int DK);<BR><BR>void main() { int i,j,k,x; unsigned int Z,DK,XX,TT,YY; unsigned int uskey; FILE *fpout,*fpin; printf("\n Input Key"); for(i=1;i&lt;=8;i++) scanf("%6u",&amp;uskey); for(i=0;i&lt;9;i++) uskey=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&lt;7;i++) { for(j=0;j&lt;10;j++) fprintf(fpin,"%6u",Z); fprintf(fpin,"\n"); } fclose(fpin);<BR><BR>/*XX中为明文*/ for(i=0;i&lt;4;i++) XX=2*i+101; clrscr(); printf("Ming wen %6u %6u %6u %6u \n",XX,XX,XX,XX); if((fpin=(fopen("ideaming.txt","w")))==NULL) {printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpin,"%6u,%6u,%6u,%6u \n",XX,XX,XX,XX); fclose(fpin); for(i=1;i&lt;=30000;i++) cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/ printf("\n\n Mingwen %6u %6u %6u %6u \n",YY,YY,YY,YY); if((fpin=fopen("ideamiwn.txt","w"))==NULL) { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u\n",YY,YY,YY,YY); { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u \n",YY,YY,YY,YY); fclose(fpout);<BR><BR>for(i=1;i&lt;=30000;i++) cip(YY,TT,DK);/*encipher YY to TT with Key DK*/ printf("\n Jie Mi %6u %6u %6u %6u \n",TT,TT,TT,TT); if((fpout=fopen("dideaout.txt","w"))==NULL) { printf("cannot open file!"); exit(EXIT_FAILURE); } fprintf(fpout,"%6u %6u %6u %6u \n",TT,TT,TT,TT); fclose(fpout); } /* 此函数执行IDEA算法中的加密过程*/ void cip(unsigned int IN,unsigned int OUT,unsigned int Z) { unsigned int r,x1,x2,x3,x4,kk,t1,t2,a; x1=IN;x2=IN;x3=IN;x4=IN; for(r=1;r&lt;=8;r++) { /* 对64位的块进行分组运算*/ x1=mul(x1,Z);x4=mul(x4,Z); x2=x2+Z&amp;one;x3=(x3+Z)&amp;one; /* MA结构的函数 */ kk=mul(Z,(x1^x3)); t1=mul(Z,(kk+(x2^x4))&amp;one;<BR><BR>/* 随机变换PI*/ x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a; } /* 输出转换*/ OUT=mul(x1,Z); OUT=mul(x4,Z); OUT=(x3+Z)&amp;one; OUT=(x2+Z)&amp;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&amp;one)-(q&gt;&gt;16); if(p&lt;=0) p=p+maxim; { return (unsigned) (p&amp;one); }<BR><BR>/*通过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&lt;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; } <BR><BR>/*产生加密子密钥Z*/ void key(unsigned int uskey,unsigned int Z) { unsigned int S; int i,j,r; for(i=1;i&lt;9;i++) S=uskey; /* shifts */ for(i=8;i&lt;54;i++) { if(i+2)%8==0)/* 对于S,S,...进行计算 */ S=((S&lt;&lt;0)^(S&gt;&gt;7)&amp;one; else if((i+1)%8==0)/* 对于S,S,...进行计算 */ S=((S&lt;&lt;9)^(S&gt;&gt;7)&amp;one; else S=((S&lt;&lt;9)^(S&gt;&gt;7)&amp;one; } /*取得子密钥*/ for(r=1;r&lt;=round+1;r++) for(j=1;j&lt;7;j++) Z=S; }<BR><BR>/* 计算解子密钥DK */ void de_key(unsigned int Z,unsigned int DK) { int j; for(j=1;j&lt;=round+1;j++) {DK=inv(Z); DK=inv(Z); if(i==1|j==round+1) { DK=(fuyi-Z)&amp;one; DK=(fuyi-Z)&amp;one; } else { DK=inv(Z); DK=inv(Z); } } for(j=1;j&lt;=round+1;j++) { DK=inv(Z); DK=inv(Z); } }<BR><BR>
页: [1]
查看完整版本: IDEA国际数据加密算法和实现