版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗一、密碼學基礎實驗一、實驗目的通過實現簡單的古典密碼算法,理解密碼學的相關概念如明文(plaintext)、密文(ciphertext)、加<ahref=””>密密鑰</a>(encryptionkey)、解密密鑰(decryptionkey)、加密算法(encryptionalgorithm)、解密算法(decryptionalgorithm)等。 (1)通過這個上機訓練,讓學生深刻了解DES、RSA的運行原理。掌握使用DES、RSA算法對實際的數據進行加密和解密。 (2)通過這個上機訓練,使學<ahref=””>生掌握常</a>用密碼軟件(PGP、SSH)下載、安裝、使用二、實驗內容【實驗項目1】用C\C++語言實現仿射變換(Affine)加/解密算法;用C\C++語言實現統計26個英文字母出現的頻率的程序;利用仿射變換加/解密程序對一段較長的英文文章進行加密,再利用統計軟件對明文和密文中字母出現的頻率進行統計并作對比,觀察有什么規律。放射變換:加密:解密:其中a,b為密鑰,,且gcd(a,26)=1實驗要求:加/解密程序對任意滿足條件的a、b都能夠處理。1.1實驗步驟(1)統計26個英文字母出現的頻率的程序#include<iostream>#include<fstream>#include<vector>usingnamespacestd;voidmain(){ifstreamin("a.txt"); vector<int>s; vector<int>n(26,0); for(inti=0;i<26;++i) s.push_back(97+i); for(charx;in>>x;) for(inti=0;i<26;++i) if(int(x)==s[i]){ n[i]++;} floatsum=0.0; for(intj=0;j<26;++j) sum+=n[j]; cout<<"統計結果如下:"<<endl;for(intk=0;k<26;++k){ //n[k]=n[k]/sum; cout<<''<<char(k+97)<<"出現的概率為:"<<n[k]/sum<<endl; //cout<<n[k]<<endl; }(2)仿射變換加/解密程序對一段較長的英文文章進行加密#include<iostream>#include<fstream>#include<vector>usingnamespacestd;//////////判斷兩個數是不是互素(輾轉相除)////////boolgcd(inta){ intf=26,g,r; g=a; do{ r=f%g; f=g; g=r; }while(r); if(f==1) return1; else return0;}//////////////////求逆//////intinv(inta){ intx,i; for(i=1;i<=30;++i) if((26*i+1)%a==0) { x=(26*i+1)/a;break;} returnx;}//////////////////////////////////////////////////////////voidmain(){ cout<<"請你選擇操作密碼的方式:"<<endl<<"0—表示加密"<<endl<<"1—表示解密"<<endl; intz; cin>>z; if(z==0||z==1) {////////////////////////////////////////// cout<<"請輸入密鑰a和b:"<<endl; inta,b; cin>>a>>b; if((a<1||a>25)||(b<0||b>25)) cout<<"a,b的輸入范圍有錯!"<<endl; else if(gcd(a)==0) cout<<"密鑰a有誤,與26不互素"<<endl; else { if(z==0)////加密算法 {ifstreamin("a.txt"); ofstreamout("b.txt"); vector<int>s; for(charx;in>>x;)s.push_back(int(x)); for(inti=0;i<s.size();++i) { s[i]=(a*(s[i]-97)+b)%26; out<<char(s[i]+97)<<''; }out<<endl;cout<<"加密成功!明文請見“b.txt”"<<endl; } else////解密算法 { ifstreamin("b.txt"); ofstreamout("a.txt"); vector<int>s; for(charx;in>>x;)s.push_back(int(x)); for(inti=0;i<s.size();++i) { s[i]=inv(a)*(s[i]-97-b+26)%26; out<<char(s[i]+97)<<''; }out<<endl;cout<<"解密成功!密文請見“a.txt”"<<endl; } }//////////////////////////////////////// } else cout<<"所選操作無效!"<<endl;}}1.2實驗結果及分析該程序是對文件進行操作,結果如下:(1) 統計26個英文字母出現的頻率的程序(2) 仿射變換加/解密程序對一段較長的英文文章進行加密【實驗項目2】利用C\C++實現RSA算法的加、解密運算。具體包括:利用擴展的EUCLID計算amodn的乘法逆元;Miller-Rabin素性測試算法對一個給定的大數進行測試;實現的運算,并計算;利用Fermat定理手工計算,并與3)計算的結果對比;實現RSA算法。并對"ILOVETHEPEOPLE'SREPUBLICOFCHINA"加解密。說明:為了方便實現,分組可以小一點,比如兩個字母一組。字母及其數字編碼字母及其數字編碼空格00N14A01O15B02P16C03Q17D04R18E05S19F06T20G07U21H08V22I09W23J10X24K11Y25L12Z26M132.1實驗步驟#include<iostream>#include<vector>#include<string>usingnamespacestd;intEuclid(inta,intn)//n大于a{ intx,y,r; x=n;y=a; for(inti=0;;) { if(y==0) returnx; if(y==1) returny;r=x%y; x=y; y=r; }}doubleextenEuclid(doublea,doublen)//利用擴展的EUCLID計算amodn的乘法逆元{ doublex1=1,x2=0,x3=n,y1=0,y2=1,y3=a,Q; doublet1,t2,t3; for(inti=0;;) { if(y3==0) { returnx3; cout<<"noreverse"<<endl; } if(y3==1) returny2; Q=int(x3/y3);t1=x1-Q*y1; t2=x2-Q*y2; t3=x3-Q*y3; x1=y1;x2=y2;x3=y3; y1=t1;y2=t2;y3=t3; }}boolRabin(inta,intn)//Miller-Rabin素性測試算法對一個給定的大數進行測試{ vector<int>b; unsignedintN=n-1; for(inti=0,j=1;;i++) { if(j>N) break; if((N>>i)&(unsignedint)1) b.push_back(1); else b.push_back(0); j*=2; }//將n-1表示成二進制形式 for(intk=0;k<b.size();k++) cout<<b[k]; cout<<endl; intd=1,x=0; for(intii=b.size()-1;ii>=0;ii--) { x=d; d=(d*d)%n; if(d==1&&x!=1&&x!=n-1) returnfalse; if(b[ii]==1) d=(d*a)%n; } if(d!=1) returnfalse; returntrue;}doublequickindex1(doublea,doublem,doublen)//實現a^mmodn的運算{ vector<int>b; unsigneddoubleN=m; for(intii=0,j=1;;ii++) { if(j>N) break; if((N>>ii)&(unsigneddouble)1) b.push_back(1); else b.push_back(0); j*=2; } doublec=0,d=1; for(inti=b.size()-1;i>=0;i--) { c*=2; d=(d*d)-int((d*d)/n)*n; if(b[i]==1) { c+=1; d=(d*a)-int((d*a)/n)*n; } } returnd;}voidtransfer(charcypher[],doublec[]){ intm[100]={0}; for(inti=0,j=0;cypher[j]!='\0';i+=2) { if(cypher[j]=='') { m[i]=0;m[i+1]=0; } else { m[i]=cypher[j]-64; if(m[i]<10) { m[i+1]=m[i]; m[i]=0; } else { m[i+1]=m[i]%10; m[i]=m[i]/10; } } j++; } for(intk2=0;k2<2*strlen(cypher);k2++) cout<<m[k2]; cout<<endl; //intc[100]={0}; for(intk=0,n=0;k<2*strlen(cypher);k+=4) { c[n]=m[k]*1000+m[k+1]*100+m[k+2]*10+m[k+3]; n++; }for(;c[n-1]<1000;)//最后一個數填充零,不過此例可要可不要 c[n-1]*=10;}voidmain(){ doublec[100]={0}; doublea[100]={0}; doubleb[100]={0}; charcypher[]="ILOVETHEPEOPLE'SREPUBLICOFCHINA";//對“我愛中華人民共和國”加解密 transfer(cypher,c);//字母變數字的過程 for(intk1=0;c[k1]!='\0';k1++) cout<<c[k1]<<""; //選取兩個素數p=563,q=823 doublen=0,fn=0,p=563,q=823,d=0; n=p*q;fn=(q-1)*(p-1); //選e與fn互素 for(doublee=2;e<fn;e+=3) { if(Euclid(e,fn)==1) break; } d=extenEuclid(e,fn); cout<<endl<<"密碼和密鑰edandn:"; cout<<e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學創新方法與實踐探索
- 數字技術賦能高職院校教學模式改革的研究
- 公司班級小活動策劃方案
- 探討互聯網背景下家庭、學校共同協作培育幼兒思想模式
- 學生捐贈協議書范本
- 公司新品特價活動方案
- 買房贈車免責協議書范本
- 公司游戲小活動方案
- 公司美食大比拼活動方案
- 公司物資團購活動方案
- 急性心肌梗死診斷分型及再灌注治療策略李軼課件
- 《建黨偉業》觀后感課件
- 2025年安全生產月主題宣貫課件
- 涼山州屬國有企業專業技術人員及管理人員招聘筆試真題2024
- 數學建模思想在中小學數學課堂教學中的應用研究
- 2025年五級應急救援員資格理論考試題庫(含答案)
- 國家開放大學漢語言文學本科《古代小說戲曲專題》期末紙質考試第一大題選擇題庫2025春期版
- GB/T 45236-2025化工園區危險品運輸車輛停車場建設規范
- 深圳市勞動合同樣本大全
- GB/T 45144-2024道路車輛車輪和輪輞使用、維護和安全的一般要求及報廢條件
-
評論
0/150
提交評論