#include#include#include//将十进制数转换成二进制,用于检验大素数 p 和 qint zhuan_huan(int b,int a[],int k){int t,temp=-1;while(b>0){t=b%2;temp++;a[temp]=t;b=b/2;}return temp;}//欧几里得算法,用于推断加密指数 e 是否符合要求int gcd(int n,int b){int r1=n,r2=b,r;while(r2>0){r=r1%r2;r1=r2;r2=r;}return r1;}//扩展欧几里得算法求乘法逆元,即求解密指数 dint 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{while((t1+i*n)<0)i++;return t1+i*n;}}//检验大素数,符合要求返回 1,否则返回 0int 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) return 0;elsereturn 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(){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]="abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789'.?!";printf("请输入您要发送的明文文件(小写英文表示):\n");printf("******************************************************\n");gets(min_wen);printf("******************************************************\n");printf("\n 加密开始,请按要求操作。。。\n\n");printf("请输入第一个大素数 p:\n");while(1){scanf("%d",&p);if(Witness(2,p)==1){printf("您输入的第一个大素数 %d 符合要求\n",p);break;}elseprintf("您输入的 %d 不是素数,请重新输入:\n",p);}prin...