IDEA.C
上传用户:xahyhb
上传日期:2022-07-21
资源大小:2k
文件大小:5k
源码类别:

加密解密

开发平台:

Visual C++

  1. #include<stdio.h>
  2. #include<process.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. #define maxim 65537
  6. #define fuyi 65536
  7. #define one 65536
  8. #define round 8
  9. unsigned int inv(unsigned int xin);
  10. unsigned int mul(unsigned int a,unsigned int b);
  11. void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10]);/*用密钥Z加密XX中的明文并存在YY中*/
  12. void key(unsigned int uskey[9],unsigned int Z[7][10]);/*产生加密子密钥*/
  13. void de_key(unsigned int Z[7][10],unsigned int DK[7][10]);
  14. void main()
  15.  int i,j,k,x;
  16.     unsigned int Z[7][10],DK[7][10],XX[5],TT[5],YY[5];
  17.     unsigned int uskey[9];
  18. FILE *fpout,*fpin;
  19. printf("n Input Key");
  20. for(i=1;i<=8;i++)
  21.     scanf("%6u",&uskey[i]);
  22. for(i=0;i<9;i++)
  23.     uskey[i]=100+i*3;
  24.     key(uskey,Z);/*产生加密子密钥*/
  25.     de_key(Z,DK);/*计算解密子密钥*/
  26.     if((fpin=fopen("ekey.txt","w"))==NULL)
  27.     {
  28.      printf("cannot open file!");
  29.      exit(EXIT_FAILURE);
  30.     }
  31.      for(i=0;i<7;i++)
  32.     {
  33.      for(j=0;j<10;j++)
  34.      fprintf(fpin,"%6u",Z[i][j]);
  35.      fprintf(fpin,"n");
  36.     }
  37.      fclose(fpin);
  38.     
  39.     /*XX[1..5]中为明文*/
  40.     for(i=0;i<4;i++) XX[i]=2*i+101;
  41.    
  42.     printf("Ming wen %6u %6u %6u %6u n",XX[0],XX[1],XX[2],XX[3]);
  43.            if((fpin=(fopen("ideaming.txt","w")))==NULL)
  44.     {printf("cannot open file!");
  45.      exit(EXIT_FAILURE);
  46.     }
  47.     fprintf(fpin,"%6u,%6u,%6u,%6u n",XX[0],XX[1],XX[2],XX[3]);
  48.     fclose(fpin);
  49.     for(i=1;i<=30000;i++)
  50.     cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/
  51.     printf("nn Mingwen %6u %6u %6u %6u n",YY[0],YY[1],YY[2],YY[3]);
  52.  if((fpin=fopen("ideamiwn.txt","w"))==NULL)
  53.  {
  54.     printf("cannot open file!");
  55.     exit(EXIT_FAILURE);
  56. }
  57.     fprintf(fpout,"%6u %6u %6u %6un",YY[0],YY[1],YY[2],YY[3]);
  58.     {
  59.     printf("cannot open file!");
  60.     exit(EXIT_FAILURE);
  61.     }
  62.     fprintf(fpout,"%6u %6u %6u %6u n",YY[0],YY[1],YY[2],YY[3]);
  63.     fclose(fpout);
  64.     for(i=1;i<=30000;i++)
  65.     cip(YY,TT,DK);/*encipher YY to TT with Key DK*/
  66.     printf("n Jie Mi %6u %6u %6u %6u n",TT[0],TT[1],TT[2],TT[3]);
  67.     if((fpout=fopen("dideaout.txt","w"))==NULL)
  68.     {
  69.     printf("cannot open file!");
  70.     exit(EXIT_FAILURE);
  71.     }
  72.     fprintf(fpout,"%6u %6u %6u %6u n",TT[0],TT[1],TT[2],TT[3]);
  73.     fclose(fpout);
  74.     }
  75.     /* 此函数执行IDEA算法中的加密过程*/
  76.     
  77.     void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10])
  78.     {
  79.     unsigned int r,x1,x2,x3,x4,kk,t1,t2,a;
  80.     x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
  81.     for(r=1;r<=8;r++)
  82.     {
  83.     
  84. /* 对64位的块进行分组运算*/
  85.     
  86. x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
  87.     
  88. x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
  89.     
  90. /* MA结构的函数 */
  91.     
  92. kk=mul(Z[5][r],(x1^x3));
  93.     
  94. t1=mul(Z[6][r],(kk+(x2^x4))&one;
  95.     
  96. /* 随机变换PI*/
  97.     
  98. x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
  99.     }
  100.     /* 输出转换*/
  101.     OUT[0]=mul(x1,Z[1][round+1]);
  102.     OUT[3]=mul(x4,Z[1][round+1]);
  103.     OUT[1]=(x3+Z[2][round+1])&one;
  104.     OUT[2]=(x2+Z[3][round+1])&one;
  105.     }
  106.     
  107.     /* 用高低算法上实现乘法运算*/
  108.     unsigned int mul(unsigned int a,unsigned int b)
  109.     {
  110.     long int p;
  111.     long unsigned q;
  112.     if(a==0) p=maxim-b;
  113.     else if(b==0) p=maxim-a;
  114.     else
  115.     {
  116.     q=(unsigned long)a*(unsigned long)b;
  117.     p=(q&one)-(q>>16);
  118.     if(p<=0) p=p+maxim;
  119.     {
  120.     return (unsigned) (p&one);
  121.     }
  122.     
  123.     /*通过Euclidean gcd算法计算xin的倒数*/
  124.     unsigned int inv(unsigned int xin)
  125.     {
  126.     long n1,n2,q,r,b1,b2,t;
  127.     if(xin==0)
  128.     b2=0;
  129.     else
  130.     {n1=maxim;n2=xin;b2=1;b1=0;
  131.     do{
  132.     r=(n1%n2);q=(n1-r)/n2;
  133.     if(r==0)
  134.     if(b2<0) b2=maxim+b2;
  135.     else
  136.     {n1=n2;n2=r;
  137.     t=b2;
  138.     b2=b1-q*b2;b1=t;
  139.     }
  140.     }while(r!=0);
  141.     }
  142.     return (unsigned long int)b2;
  143.     }
  144.     
  145.     
  146.     /*产生加密子密钥Z*/
  147.     void key(unsigned int uskey[9],unsigned int Z[7][10])
  148.     {
  149.     unsigned int S[54];
  150.     int i,j,r;
  151.     for(i=1;i<9;i++)
  152.     S[i-1]=uskey[i];
  153.     /* shifts */
  154.     for(i=8;i<54;i++)
  155.     {
  156.     if(i+2)%8==0)/* 对于S[14],S[22],...进行计算 */
  157.     S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
  158.     else if((i+1)%8==0)/* 对于S[15],S[23],...进行计算 */
  159.     S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
  160.     else
  161.     S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
  162.     }
  163.     /*取得子密钥*/
  164.     for(r=1;r<=round+1;r++)
  165.       for(j=1;j<7;j++)
  166.       Z[j][r]=S[6*(r-1)+j-1];
  167.     }
  168.     
  169.     /* 计算解子密钥DK */
  170.     void de_key(unsigned int Z[7][10],unsigned int DK[7][10])
  171.     {
  172.     int j;
  173.     for(j=1;j<=round+1;j++)
  174.     {DK[1][round-j+2]=inv(Z[1][j]);
  175.     DK[4][round-j+2]=inv(Z[4][j]);
  176.     if(i==1|j==round+1)
  177.     {
  178.     DK[2][round-j+2]=(fuyi-Z[2][j])&one;
  179.     DK[3][round-j+2]=(fuyi-Z[3][j])&one;
  180.     }
  181.     else
  182.     {
  183.     DK[2][round-j+2]=inv(Z[3][j]);
  184.     DK[3][round-j+2]=inv(Z[2][j]);
  185.     }
  186.     }
  187.     for(j=1;j<=round+1;j++)
  188.     {
  189.     DK[5][round-j+2]=inv(Z[5][j]);
  190.     DK[6][round-j+2]=inv(Z[6][j]);
  191.     }
  192.     
  193.     }