idea密码学 c语言程序,IDEA国际数据加密算法和实现

#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]); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值