资源描述:
《RSA加密解密算法c语言程序.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、#include#include#include//将十进制数转换成二进制,用于检验大素数p和qintzhuan_huan(intb,inta[],intk){intt,temp=-1;while(b>0){t=b%2;temp++;a[temp]=t;b=b/2;}returntemp;}//欧几里得算法,用于判断加密指数e是否符合要求intgcd(intn,intb){intr1=n,r2=b,r;while(r2>0){r=r1%r2;r1=r2;r2
2、=r;}returnr1;}//扩展欧几里得算法求乘法逆元,即求解密指数dintextend(intn,intb){intq,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)returnt1%n;else{while((t1+i*n)<0)i++;returnt1+i*n;}}//检验大素数,符合要求返回1,否则返回0intWitness(inta,intn){intd
3、=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))return0;if(b[i]==1)d=(d*a)%n;}if(d!=1)return0;elsereturn1;}//快速计算模指数intjs_mod(inta,intb,intn){intx=0,y=1,k,i,s[1000];k=zhuan_huan(b,s,1000);for(i=k;i>=0;i
4、--){x=2*x;y=(y*y)%n;if(s[i]==1){x++;y=(y*a)%n;}}returny;}//主函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。voidmain(){intp,q,e,d,n,yn,m[1000],c[10000];//c[10000]存放加密后的数字密文,m[1000]存放解密后的数字明文,即英文明文在zimu_biao[69]中的下标。inti,j;//i,j用于循环遍历数组intmi_yue;//用户输入的密钥intcount=
5、1;//统计输入密钥的次数,count>3时将不允许用户再输入。charmin_wen[1000],re_min_wen[1000];//分别为用户输入的明文、密文,解密后的明文。//密钥生成charzimu_biao[69]="abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.?!";printf("请输入您要发送的明文文件(小写英文表示):");printf("**********************************
6、********************");gets(min_wen);printf("******************************************************");printf("加密开始,请按要求操作。。。");printf("请输入第一个大素数p:");while(1){scanf("%d",&p);if(Witness(2,p)==1){printf("您输入的第一个大素数%d符合要求",p);break;}elseprintf("您输入的%
7、d不是素数,请重新输入:",p);}printf("请输入第二个大素数q:");while(1){scanf("%d",&q);if(Witness(2,q)){printf("您输入的第二个大素数%d符合要求",q);break;}elseprintf("您输入的%d不是素数,请重新输入:",q);}n=p*q;yn=(p-1)*(q-1);printf("请输入加密指数(整数)e,且08、(yn,e)==1){printf("您输入加密指数%d与%d互素,符合要求",e,yn);break;}elseprintf("您输入加密指数%d与%d不互素,请重新输入。。。",e,yn);}d=extend(yn,e);//求解密指数dprintf("请记住您的两个大素数分别为p=%d(保密),q=%d(保密),模数n=%d(公开),欧