1、include
2、hile(r2>0){ r=r1%r2; r1=r2; r2=r; } return r1; } //扩展欧几里得算法求乘法逆元,即求解密指数d int extend(int n,int b) { int q,r,r1=n,r2=b,t,t1=0,t2=1,i=1; while(r2>0) { q=r1/r2; r=r1%r2; r1=r2; r2=r; t=t1-q*t2; t1=t2; t2=t; } if(t1>=0) return t1%n; else{
3、 while((t1+i*n)<0) i++; return t1+i*n; } } //检验大素数,符合要求返回1,否则返回0 int Witness(int a,int n) { int d=1,k,r=n-1,i,x,b[1000]; k=zhuan_huan(r,b,1000); for(i=k;i>=0;i--){ x=d; d=(d*d)%n; if((d==1)&&(x!=1)&&(x!=n-1)) return 0; if(b[i]==1) d=(d*a)%n; } if(d!=1) retu
4、rn 0; else return 1; } //快速计算模指数 int js_mod(int a,int b,int n) { int x=0,y=1,k,i,s[1000]; k=zhuan_huan(b,s,1000); for(i=k;i>=0;i--){ x=2*x; y=(y*y)%n; if(s[i]==1){ x++; y=(y*a)%n; } } return y; } //主函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 void main(
5、) { int p,q,e,d,n,yn,m[1000],c[10000];//c[10000]存放加密后的数字密文,m[1000]存放解密后的数字明文,即英文明文在zimu_biao[69]中的下标。 int i,j; //i,j用于循环遍历数组 int mi_yue; //用户输入的密钥 int count=1; //统计输入密钥的次数,count>3时将不允许用户再输入。 char min_wen[1000],re_min_wen[1000];//分别为用户输入的明文、密文,解密后的明文。 //密钥生成 char zimu_biao[69]="abcdef
6、ghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789'.?!"; printf("请输入您要发送的明文文件(小写英文表示):\n"); printf("******************************************************\n"); gets(min_wen); printf("******************************************************\n"); printf("\n加密开始,请按要求操作。。。\n\n"); print
7、f("请输入第一个大素数p:\n"); while(1){ scanf("%d",&p); if(Witness(2,p)==1){ printf("您输入的第一个大素数 %d 符合要求\n",p); break; } else printf("您输入的 %d 不是素数,请重新输入:\n",p); } printf("请输入第二个大素数q:\n"); while(1){ scanf("%d",&q); if(Witness(2,q)){ printf("您输入的第二个大素数 %d 符合要求
8、\n",q);
break;
}
else
printf("您输入的 %d 不是素数,请重新输入:\n",q);
}
n=p*q; yn=(p-1)*(q-1);
printf("请输入加密指数(整数)e,且0 9、f("您输入加密指数 %d 与 %d 不互素,请重新输入。。。\n",e,yn);
}
d=extend(yn,e); //求解密指数d
printf("\n\n请记住您的两个大素数分别为p=%d(保密),q=%d(保密),模数n=%d(公开),欧拉函数yn=%d(保密),加密指数e=%d(公钥,公开),。。。解密指数 d=%d(私钥,保密)\n\n",p,q,n,yn,e,d);
//明文转换过程
/* scanf("%s",min_wen);
printf("%s",min_wen); */
for(i=0;i 10、
for(j=0;j<68;j++) //for(j=0;j<26;j++)
if(min_wen[i]==zimu_biao[j])
m[i]=j;//将字符串明文换成数字,并存到整型数组m里面,即明文的另一种表示方法
//加密过程
for(i=0;i 11、i 12、解密显示明文,3次输入错误解密将终止,请注意。。。\n\n");
while(1){
scanf("%d",&mi_yue);
if(mi_yue==d){
printf("密钥输入正确,您得到的明文为:\n\n");
for(i=0;i