IDEA.C
上传用户:xahyhb
上传日期:2022-07-21
资源大小:2k
文件大小:5k
- #include<stdio.h>
- #include<process.h>
- #include<conio.h>
- #include<stdlib.h>
- #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]);/*用密钥Z加密XX中的明文并存在YY中*/
- 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;
-
- 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("nn 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 %6un",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]);
- }
-
- }