• Sueli
    了解作者
  • C/C++
    开发工具
  • 127KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2021-02-20 01:28
    上传日期
IDEA算法的实现,用c语言把它的加解密实现过程输出到屏幕
IDEA算法.rar
  • IDEA算法
  • IDEA.cpp
    6.9KB
  • IDEA.exe
    587KB
内容介绍
//IDEA密码算法 #include <iostream> #include <string> #include <math.h> using namespace std; const unsigned int N=256; //mod(pow(2,8))=256 const unsigned int MUL=65537; //16比特的整数做mod(pow(2,16)+1)=65537的乘法运算 const unsigned int ADD=65536; //16比特的整数做mod(pow(2,16))=65536的加法运算 string change(unsigned int n,unsigned int k)//十进制数顺序变换为k位二进制 { string result; for(int i=0;i<k;i++) { if((i!=0)&&!(i%4)) result=","+result; if(n%2) result="1"+result; else result="0"+result; n/=2; } return result; } void set_key(unsigned int key[],unsigned int z[9][6])//生成密钥模块 { int i,j,k,flag=0,t=0; unsigned int sum,temp[9][6][16]; for(i=0;i<9;i++) { for(j=0;j<6;j++) { for(k=0;k<16;k++) temp[i][j][k]=key[(flag+t++)%128]; if(!(i==j==0)&&((6*i+j)%8)==7) flag+=25; } } for(i=0;i<9;i++) { for(j=0;j<6;j++) { sum=0; for(k=0;k<16;k++) if(temp[i][j][k]) sum+=(unsigned int)pow(2,15-k); /*??????*/ z[i][j]=sum; } } } void set_m(unsigned int write[],unsigned int x[])//生成明文模块 { int i,j; unsigned int sum; for(i=0;i<64;i+=16) { sum=0; for(j=0;j<16;j++) if(write[i+j]) sum+=(unsigned int)pow(2,15-j); /*????????*/ x[i/16]=sum; } } void string_bb(string str,unsigned int result[])//字符序列转换为二进制 { int i,j; unsigned int temp; for(i=0;i<str.length();i++) { temp=str[i]; for(j=7;j>=0;j--) { if(temp%2) result[8*i+j]=1; else result[8*i+j]=0; temp=temp/2; } } } #define LOW16(x) ((x)&0xffff) unsigned int mulInv(unsigned int x) { unsigned int t0,t1; unsigned int q,y; if ( x<=1) return x; t1 = 0x10001L/x; y = 0x10001L%x; if(y == 1) return LOW16(1-t1); t0 = 1 ; do { q = x/y; x %= y; t0 += q*t1; if( x == 1) return t0; q = y/x; y %=x; t1 += q*t0; }while( y != 1); return LOW16(1-t1); } int main() { int i,j,t,n; unsigned int sum,temp,x[4],z[9][6],y[9][6],result[14],fresult[4],key[128],write[64]; string m,k,str; cout<<"\t\t*****************************\n"; cout<<"\t\t\tIDEA密码算法"; cout<<"\n\t\t*****************************\n"; cout<<"\n请输入明文字符串(8位):";cin>>m; getchar(); string_bb(m,write);//将明文字符序列转换为二进制,存放于数组write[64] cout<<"\n\t\t明文是m="<<m<<endl<<endl; cout<<"m="<<endl; for(i=0;i<64;i++) { cout<<write[i]; if((i!=0)&&(i%8)==7) cout<<" "; if((i!=0)&&(i%32)==31) cout<<endl; } k="computersecurity"; cout<<"\n\t\t密钥为k="<<k<<endl<<endl; string_bb(k,key);//将密钥字符序列转换为二进制,存放于数组key[128] cout<<"k="<<endl; for(i=0;i<128;i++) { cout<<key[i]; if((i!=0)&&(i%8)==7) cout<<" "; if((i!=0)&&(i%32)==31) cout<<endl; } set_m(write,x);//生成明文模块x[4] cout<<"\n=====>明文模块:\n"<<endl; for(i=0;i<4;i+=2) cout<<"x["<<i<<"]="<<x[i]<<"\t"<<change(x[i],16)<<"\t"<<"x["<<i+1<<"]="<<x[i+1]<<"\t"<<change(x[i+1],16)<<endl; set_key(key,z);//生成密钥模块z[9][6] cout<<"\n=====>密钥模块:\n"<<endl; for(i=0;i<9;i++) { for(j=0;j<6;j++) { cout<<"z["<<i+1<<"]["<<j+1<<"] "<<change(z[i][j],16)<<"\t"; if(j%2) cout<<endl; } cout<<endl; } cout<<"*******************************************************************************\n"<<endl; getchar(); for(n=0;n<2;n++) { if(n==0) cout<<"加密过程"<<endl; else cout<<"解密过程"<<endl; for(t=0;t<8;t++) { result[0]=(x[0]*z[t][0])%MUL; //X1和第1个子密钥块作乘法运算 result[1]=(x[1]+z[t][1])%ADD; //X2和第2个子密钥块作加法运算 result[2]=(x[2]+z[t][2])%ADD; //X3和第3个子密钥块作加法运算 result[3]=(x[3]*z[t][3])%MUL; //X4和第4个子密钥块作乘法运算 result[4]=result[0]^result[2]; //(1)和(3)结果作异或运算 result[5]=result[1]^result[3]; //(2)和(4)结果作异或运算 result[6]=(result[4]*z[t][4])%MUL; //(5)的结果与第5个子密钥块作乘法运算 result[7]=(result[5]+result[6])%ADD;//(6)和(7)结果作加法运算 result[8]=(result[7]*z[t][5])%MUL; //(8)的结果与第6个子密钥块作乘法运算  result[9]=(result[6]+result[8])%ADD;//(7)和(9) 结果作加法运算 result[10]=result[0]^result[8]; //(1)和(9)结果作异或运算 result[11]=result[2]^result[8]; //(3)和(9) 结果作异或运算 result[12]=result[1]^result[9]; //(2)和(10) 结果作异或运算 result[13]=result[3]^result[9]; //(4)和(10) 结果作异或运算 cout<<"\n 第"<<t+1<<"趟 "<<endl<<endl;//(4)和(10) 结果作异或运算 for(j=0;j<14;j++) cout<<"\tStep"<<j+1<<"\t"<<"result["<<j<<"]="<<result[j]<<" \t\t"<<change(result[j],16)<<endl; cout<<"\nresult[10]="<<result[10]<<" "<<change(result[10],16)<<"\t"; cout<<"result[12]="<<result[12]<<" "<<change(result[12],16)<<endl; cout<<"result[11]="<<result[11]<<" "<<change(result[11],16)<<"\t"; cout<<"result[13]="<<result[13]<<" "<<change(result[13],16)<<endl; cout<<"-------------------------------------------------------------------------------"<<endl; getchar(); x[0]=result[10];x[1]=result[12];x[2]=result[11];x[3]=result[13];//除最后一轮(第9轮)外,第2和第3块交换 /* (14) (4)和(10) 结果作异或运算 。结果的输出为(11),(13),(12),(14)。 除最后一轮(第8轮)外,第2和第3块交换。第8轮结束后,最后输出的变换有: (1) 和第1个子密钥块作乘法运算。 (2) 和第2个子密钥块作加法运算。 (3) 和第3个子密钥块作加法运算。 (4) 和第4个子密钥块作乘法运算。 */ } fresult[0]=(x[0]*z[t][0])%MUL;//X1和第1个子密钥块作乘法运算 fresult[1]=(x[1]+z[t][1])%ADD;//X2和第2个子 密钥块作加法运算 fresult[2]=(x[2]+z[t][2])%ADD;//X3和第3个子密钥块作加法运算 fresult[3]=(x[3]*z[t][3])%MUL;//X4和第4个子密钥块作乘法运算 if(n==0) cout<<"加密结果是:"<<endl; else cout<<"解密结果是:"<<endl; cout<<"-->fresult[1]="<<fresult[0]<<" "<<change(fresult[0],16); printf(" ----%c--%c\n",fresult[0]/N,fresult[0]%N); cout<<"-->fresult[2]="<<fresult[1]<<" "<<change(fresult[1],16); printf(" ----%c--%c\n",fresult[1]/N,fresult[1]%N); cout<<"-->fresult[3]="<<fresult[2]<<" "<<change(fresult[2],16); printf(" ----%c--%c\n",fresult[2]/N,fresult[2]%N); cout<<"-->fresult[4]="<<fresult[3]<<" "<<change(fresult[3],16); printf(" ----%c--%c\n",fresult[3]/N,fresult[3]%N); cout<<"*******************************************************************************"<<endl; if(n==0) { getchar(); x[0]=fresult[0],x[1]=fresult[1],x[2]=fresult[2],x[3]=fresult[3]; /*解密过程的明文子块*/ for(t=0;t<9;t++) y[t][0]=mulInv(z[8-t][0]); /*解密子密钥*/ y[0][1]=ADD-z[8][1]; y[8][1]=ADD-z[0][1]; for(t=1;t<8;t++) y[t][1]=ADD-z[8-t][1]; y[0][2]=ADD-z[8][2]; y[8][2]=ADD-z[0][2]; for(t=1;t<8;t++) y[t][2]=ADD-z[8-t][2]; for(t=0;t<9;t++) y[t][3]=mulInv(z[8-t][3]); for(t=0;t<8;t++) y[t][4]=z[7-t][4]; for(t=0;t<8;t++) y[t][5]=z[7-t][5]; for(i=0;i<9;i++) for(j=0;j<6;j++) z[i][j]=y[i][j]; } } system("pause"); return 0; }
评论
    相关推荐
    • sorting-visualizer:最常见的排序算法可视化工具
      我之所以建立此可视化工具,是因为我希望看到实际的排序算法。 我还希望能够停止动画并后退/前进。 这个项目的最初想法要简单得多,并且随着时间的推移不断发展,在当时超出了我的技能水平的范围内增加了新的复杂...
    • Pathfinding_Visualiser:可视化实际中的路径查找算法
      该项目的目标是能够可视化实际地图数据中的路径查找算法。 个人目的是学习新技能。 在开始这个项目之前,我对使用的许多工具(例如ReactJS,MySQL)缺乏或几乎没有经验。 第二个目的是证明我的能力。 该项目的灵感...
    • MazeTest:这是一个迷宫的实现,我们用来教学生如何编写导航迷宫的算法
      使用 SmartMazeTest 您可以使用 SmartMazeTest 类来帮助您可视化导航算法的行为。 SmartMazeTest 类包含验证算法所需的所有代码。 以下是您需要了解的内容: 使用 getSampleMaze 方法加载迷宫。 如果您有一个空白...
    • Draw-My-Code:用于可视化算法的Web应用程序
      用于可视化算法的Web应用程序 描述: 一个用于对某些算法进行可视化的React Web应用程序。 对于某些程序员而言,学习通用算法的最大问题是他们无法直观地了解这些算法的工作原理。 该Web应用程序使您可以可视化5种...
    • sorting-visualiser:使用Tkinter Python GUI可视化表示排序算法,例如冒泡排序,快速排序,合并排
      因此,要了解这些算法,最重要的是可视化。 这就是为什么我们进行此项目的目的是让每个人都了解这些算法的工作原理,并且通过该项目,您还将对此类排序算法有深入的了解。 Python GUI:Tkinter
    • 山东大学 软件学院 移动互联复习题.zip
      山东大学 软件学院 移动互联网 期末考试复习题,林风波老师的课,人很好,上课风格鲜明,有idea就去实现,期末考试的主观题答案有几题是谈谈自己的看法、观点或建议
    • leetcodeoj和leetcode-algorithm-go:在go中收集leetcode多解
      7、算法可视化文章: 8、 练习 OJ 的不同境界 1、能够把题目归类(关键字) 2、能够想到 basic idea 3、能够暴力 AC 4、能够采用不同方法解题 5、能够总结题解下不同算法的时间和空间复杂度 6、能够 step by step 搞...
    • kla-visualizer:k 级异步广度优先搜索的可视化
      k 级异步广度优先搜索的可视化。 如需演示,请查看 。 [1] 中详细描述了 k 级异步图范式。 [1] Harshvardhan、Adam Fidel、Nancy M. Amato 和 Lawrence Rauchwerger。 2014. KLA:并行图计算的新算法范式。 在第...
    • 搜索可视化
      我之所以建立这个项目,有几个原因:建立一个Web应用程序,巩固我对搜索算法的理解,对其进行可视化,并为其他人提供使用的工具。 输入您要搜索的值并观看运行中的算法。 现在,通过检查使用控制台来查看算法在搜索...
    • 3DES加密算法源代码.rar
      DES加密源代码,用3DES加密算法。 加密强度高,到目前为止,还无人能够破解!