RSA加密解密算法c語言程序_第1頁
RSA加密解密算法c語言程序_第2頁
RSA加密解密算法c語言程序_第3頁
RSA加密解密算法c語言程序_第4頁
RSA加密解密算法c語言程序_第5頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

#include<stdio.h>#include<stdlib.h>#include<string.h>//將十進制數(shù)轉(zhuǎn)換成二進制,用于檢驗大素數(shù)p和qintzhuan_huan(intb,inta[],intk){ intt,temp=-1; while(b>0){ t=b%2; temp++; a[temp]=t; b=b/2; } returntemp;}//歐幾里得算法,用于判斷加密指數(shù)e是否符合要求intgcd(intn,intb){ intr1=n,r2=b,r; while(r2>0){ r=r1%r2; r1=r2; r2=r; } returnr1;}//擴展歐幾里得算法求乘法逆元,即求解密指數(shù)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; }}//檢驗大素數(shù),符合要求返回1,否則返回0intWitness(inta,intn){ intd=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; else return1;}//快速計算模指數(shù)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--){ x=2*x; y=(y*y)%n; if(s[i]==1){ x++; y=(y*a)%n; } } returny;}//主函數(shù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。voidmain(){ intp,q,e,d,n,yn,m[1000],c[10000];//c[10000]存放加密后的數(shù)字密文,m[1000]存放解密后的數(shù)字明文,即英文明文在zimu_biao[69]中的下標。 inti,j; //i,j用于循環(huán)遍歷數(shù)組 intmi_yue; //用戶輸入的密鑰 intcount=1; //統(tǒng)計輸入密鑰的次數(shù),count>3時將不允許用戶再輸入。 charmin_wen[1000],re_min_wen[1000];//分別為用戶輸入的明文、密文,解密后的明文。//密鑰生成 charzimu_biao[69]="abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.?!"; printf("請輸入您要發(fā)送的明文文件(小寫英文表示):\n"); printf("******************************************************\n"); gets(min_wen); printf("******************************************************\n"); printf("\n加密開始,請按要求操作。。。\n\n"); printf("請輸入第一個大素數(shù)p:\n"); while(1){ scanf("%d",&p); if(Witness(2,p)==1){ printf("您輸入的第一個大素數(shù)%d符合要求\n",p); break; } else printf("您輸入的%d不是素數(shù),請重新輸入:\n",p); } printf("請輸入第二個大素數(shù)q:\n"); while(1){ scanf("%d",&q); if(Witness(2,q)){ printf("您輸入的第二個大素數(shù)%d符合要求\n",q); break; } else printf("您輸入的%d不是素數(shù),請重新輸入:\n",q); } n=p*q; yn=(p-1)*(q-1); printf("請輸入加密指數(shù)(整數(shù))e,且0<e<%d\n",yn);//下面由用戶設定加密指數(shù) while(1){ scanf("%d",&e); if(gcd(yn,e)==1){ printf("您輸入加密指數(shù)%d與%d互素,符合要求\n",e,yn); break; } else printf("您輸入加密指數(shù)%d與%d不互素,請重新輸入。。。\n",e,yn); } d=extend(yn,e); //求解密指數(shù)d printf("\n\n請記住您的兩個大素數(shù)分別為p=%d(保密),q=%d(保密),模數(shù)n=%d(公開),歐拉函數(shù)yn=%d(保密),加密指數(shù)e=%d(公鑰,公開),。。。解密指數(shù)d=%d(私鑰,保密)\n\n",p,q,n,yn,e,d);//明文轉(zhuǎn)換過程/* scanf("%s",min_wen); printf("%s",min_wen); */ for(i=0;i<strlen(min_wen);i++) for(j=0;j<68;j++)//for(j=0;j<26;j++) if(min_wen[i]==zimu_biao[j]) m[i]=j;//將字符串明文換成數(shù)字,并存到整型數(shù)組m里面,即明文的另一種表示方法//加密過程 for(i=0;i<strlen(min_wen);i++) c[i]=js_mod(m[i],e,n); printf("輸出密文:\n"); printf("******************************************************\n"); for(i=0;i<strlen(min_wen);i++) printf("%d",c[i]); printf("\n******************************************************\n");//解密過程 for(i=0;i<strlen(min_wen);i++) m[i]=js_mod(c[i],d,n); for(i=0;i<strlen(min_wen);i++) re_min_wen[i]=zimu_biao[m[i]];//提示用戶解密 printf("\n\n您有3次輸入密鑰的機會,密鑰正確后將進行解密顯示明文,3次輸入錯誤解密將終止,請注意。。。\n\n"); while(1){ scanf("%d",&mi_yue); if(mi_yue==d){ printf("密鑰輸入正確,您得到的明文為:\n\n"); for(i=0;i<strlen(min_wen);i++) printf("%c",re_min_wen[i]); printf("\n\n");

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論