實驗報告-密碼學(xué)_第1頁
實驗報告-密碼學(xué)_第2頁
實驗報告-密碼學(xué)_第3頁
實驗報告-密碼學(xué)_第4頁
實驗報告-密碼學(xué)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./信息安全實驗報告學(xué)號:學(xué)生:班級:實驗三密碼學(xué)實驗一、古典密碼算法實驗實驗?zāi)康耐ㄟ^編程實現(xiàn)替代密碼算法和置換密碼算法,加深對古典密碼體制的了解,為深入學(xué)習(xí)密碼學(xué)奠定基礎(chǔ)。編譯環(huán)境運行windows或linux操作系統(tǒng)的PC機,具有g(shù)cc〔linux、VC〔windows等C語言編譯環(huán)境。實驗原理古典密碼算法歷史上曾被廣泛應(yīng)用,大都比較簡單,使用手工和機械操作來實現(xiàn)加密和解密。它的主要應(yīng)用對象是文字信息,利用密碼算法實現(xiàn)文字信息的加密和解密。下面介紹兩種常見的具有代表性的古典密碼算法,以幫助讀者對密碼算法建立一個初步的印象。1.替代密碼替代密碼算法的原理是使用替代法進(jìn)行加密,就是將明文中的字符用其它字符替代后形成密文。例如:明文字母a、b、c、d,用D、E、F、G做對應(yīng)替換后形成密文。替代密碼包括多種類型,如單表替代密碼、多明碼替代密碼、多字母替代密碼、多表替代密碼等。下面我們介紹一種典型的單表替代密碼,愷撒<caesar>密碼,又叫循環(huán)移位密碼。它的加密方法,就是將明文中的每個字母用此字符在字母表中后面第k個字母替代。它的加密過程可以表示為下面的函數(shù):E<m>=<m+k>modn其中:m為明文字母在字母表中的位置數(shù);n為字母表中的字母個數(shù);k為密鑰;E<m>為密文字母在字母表中對應(yīng)的位置數(shù)。例如,對于明文字母H,其在字母表中的位置數(shù)為8,設(shè)k=4,則按照上式計算出來的密文為L:E<8>=<m+k>modn=<8+4>mod26=12=L2.置換密碼置換密碼算法的原理是不改變明文字符,只將字符在明文中的排列順序改變,從而實現(xiàn)明文信息的加密。置換密碼有時又稱為換位密碼。矩陣換位法是實現(xiàn)置換密碼的一種常用方法。它將明文中的字母按照給的順序安排在一個矩陣中,然后用根據(jù)密鑰提供的順序重新組合矩陣中字母,從而形成密文。例如,明文為attackbeginsatfive,密鑰為cipher,將明文按照每行6列的形式排在矩陣中,形成如下形式:attackbeginsatfive根據(jù)密鑰cipher中各字母在字母表中出現(xiàn)的先后順序,給定一個置換:123456f=145326根據(jù)上面的置換,將原有矩陣中的字母按照第1列,第4列,第5列,第3列,第2列,第6列的順序排列,則有下面形式:aacttkbingesaIvfte從而得到密文:abatgftetcnvaiikse其解密的過程是根據(jù)密鑰的字母數(shù)作為列數(shù),將密文按照列、行的順序?qū)懗?再根據(jù)由密鑰給出的矩陣置換產(chǎn)生新的矩陣,從而恢復(fù)明文。實驗容和步驟1、根據(jù)實驗原理部分對替代密碼算法的介紹,自己創(chuàng)建明文信息,并選擇一個密鑰k,編寫替代密碼算法的實現(xiàn)程序,實現(xiàn)加密和解密操作。2、根據(jù)實驗原理部分對置換密碼算法的介紹,自己創(chuàng)建明文信息,并選擇一個密鑰,編寫置換密碼算法的實現(xiàn)程序,實現(xiàn)加密和解密操作??偨Y(jié)與思考記錄程序調(diào)試過程中出現(xiàn)的問題,分析其原因并找出解決方法。記錄最終實現(xiàn)的程序執(zhí)行結(jié)果。思考采取什么樣的手段來防類似對網(wǎng)絡(luò)的攻擊。實驗結(jié)果替換密碼的加密解密先是加密實現(xiàn)程序為:#include"stdio.h"#include"conio.h"main<>{intk,i=0;chara[100],b[100]={0};;printf<"pleaseinputyourmingwen:\n">;gets<a>;printf<"pleaseinputmishi\n">;scanf<"%d",&k>;printf<"\n">;do{b[i]=<char><a[i]+k>;if<b[i]>122>{b[i]=<char><b[i]-26>;}i++;}while<a[i]!='\0'>;puts<b>;getch<>;}實驗結(jié)果為:再是解密:實現(xiàn)程序為:#include"stdio.h"#include"conio.h"main<>{intk,i=0;chara[100],b[100];printf<"pleaseinputmiwen:\n">;gets<a>;printf<"pleaseinputmishi:\n">;scanf<"%d",&k>;printf<"\n">;do{b[i]=<char><a[i]-k>;if<b[i]<97>{b[i]=<char><b[i]+26>;不知道三哪里的問題結(jié)果中的Y輸不出來}i++;}while<a[i]!='\0'>;puts<b>;getch<>;}結(jié)果為:置換密碼先是加密實現(xiàn)程序#include<stdio.h>#defineTRUE1#defineFALSE0#defineN1000#defineM50intGlength<char*a>{char*pt;intnlen=0;pt=a;while<<*pt>!='\0'>{nlen++;pt++;}returnnlen;}voidencrypt<char*a,intn,int*b>{inti,j,k,t,x,y;charc[M][M],d[M][M];k=Glength<a>;puts<a>;t=k%n;if<t==0>{x=k/n;}else{x=<k/n>+1;}printf<"%d\n",x>;for<i=0;i<x;i++>{for<j=0;j<n;j++>{if<<<a[i*n+j]>>96>&&<a[i*n+j]<123>>{c[i][j]=a[i*n+j];printf<"%c",c[i][j]>;}else{c[i][j]='';printf<"%c",c[i][j]>;}}}printf<"\nhehe\n">;for<j=0;j<n;j++>{for<i=0;i<x;i++>{y=b[j];printf<"encrypt%d\t",y>;d[i][y]=c[i][j];printf<"--%c\t",d[i][y]>;}}printf<"\n">;for<i=0;i<x;i++>{for<j=0;j<n;j++>{a[i*n+j]=d[i][j];}}a[x*n+j+1]='\0';puts<a>;}voidbubble_sort<char*a,intn,int*b>{inti,j,nTemp,k,x;charchange;charc[N];x=0;strcpy<c,a>;for<i=n-1,change=TRUE;i>=1&&change;--i>{change=FALSE;for<j=0;j<i;++j>{if<a[j]>a[j+1]>{nTemp=a[j];a[j]=a[j+1];a[j+1]=nTemp;change=TRUE;}}}i=0;while<<c[i]>!='\0'>{for<k=0;k<n;k++>{if<<c[i]>==a[k]>{b[x]=k;printf<"%d\t",b[x]>;}}i++;x++;}printf<"\n">;puts<a>;}intmain<>{intk;charnArr[N],a[N];intb[N];clrscr<>;printf<"Pleaseinputkey:\n">;gets<nArr>;k=Glength<nArr>;printf<"PleaseinputMword:\n">;gets<a>;printf<"Thedataitemsinascendingorder:\n">;bubble_sort<&nArr,k,&b>;puts<nArr>;encrypt<&a,k,&b>;puts<a>;printf<"\n">;return0;}加密結(jié)果為:二、公鑰加密算法—RSA一、實驗?zāi)康耐ㄟ^使用RSA算法對實驗數(shù)據(jù)進(jìn)行加密和解密,掌握公鑰加密算法的基本原理,熟練掌握RSA算法各功能模塊的工作原理和具體運算過程。二、實驗原理RSA公鑰加密算法是1977年由RonRivest、AdiShamirh和LenAdleman在〔美國麻省理工學(xué)院開發(fā)的。RSA取名來自開發(fā)他們?nèi)叩拿?。RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易,但那時想要對其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。1.RSA的密鑰生成RSA的算法涉及三個參數(shù),n、e、d。其中,n是兩個大質(zhì)數(shù)p、q的積,n的二進(jìn)制表示時所占用的位數(shù),就是所謂的密鑰長度。鑒于現(xiàn)代對于大整數(shù)分解的水平不斷增強,一般P、Q的取值都要求在1024位以上。e和d是一對相關(guān)的值,e可以任意取,但要求e與<p-1>*<q-1>互質(zhì);再選擇d,要求:<e*d>mod<<p-1>*<q-1>>=1。<n,e>、<n,d>就是密鑰對。一般將前者當(dāng)作公鑰,后者作為私鑰使用。2.RSA加密/解密過程RSA加解密和解密的算法完全相同,設(shè)A為明文,B為密文,則:A=B^emodn;B=A^dmodn;e和d可以互換使用,即:A=B^dmodn;B=A^emodn;三、實驗環(huán)境運行Windows或Linux操作系統(tǒng)的PC機,具有g(shù)cc<Linux>、VC〔Windows等C語言編譯環(huán)境。四、實驗容和步驟1.根據(jù)本講義提供的RSA程序,分析RSA算法的實現(xiàn)過程:<1>、利用:voidGenerateKey<RSA_Key&PublicKey,RSA_Key&PrivateKey,unsignedintiKeySize>函數(shù)根據(jù)實際需要生成符合要求長度的公鑰和私鑰,大致步驟如下:a>隨機生成兩個指定長度的大素數(shù)P,Q。b>計算N=P*Q,以及N的歐拉函數(shù)φ<N>=<P-1>*<Q-1>。c>隨機生成一個與φ<N>互素的大整數(shù)E〔公鑰。d>根據(jù)公式ed≡1<modΦ<N>>,利用函數(shù)multi_inverse<1,Big*,Big,Big*>計算出私鑰D。〔2、將某個大整數(shù)賦值給一個Big型變量M〔明文?!?、調(diào)用函數(shù)powmod<..,..,..,..>對明文M加密得到密文C。〔4、調(diào)用函數(shù)powmod<..,..,..,..>對密文C解密得到明文D?!?、比較M與D是否一致,判斷實驗結(jié)果是否正確?!?、調(diào)換公鑰、私鑰后重復(fù)以上步驟,驗證e、d的可互換性,并思考為什么可以這樣做。2.使用實例分析取p=11,q=13。首先計算:n=pq=11×13=143φ<n>=<p-1><q-1>=<11-1>×<13-1>=120然后選擇e=17,滿足gcd<e,φ<n>>=gcd<17,120>=1,然后根據(jù)ed≡1<modφ<N>>計算d=113。則:公鑰:<17,143>、私鑰:<113,143>。設(shè)明文信息:m=24。對明文信息加密,得密文為:c≡m^e%N=24^17%143=7密文c經(jīng)過公開信道發(fā)送到接收方后,接收方用私鑰d對密文進(jìn)行解密:m≡c^d%N=7^113%143=24從而正確地恢復(fù)出明文。五、思考題1、闡明RSA密鑰生成以及加密、解密流程<1>RSA密鑰生成:1>找出p,q,r三個數(shù),p,q互質(zhì),r與<p-1><q-1>互質(zhì),p,q,r這三個數(shù)便是privatekey。 2>找出m,使得mr==1mod<p-1><q-1> 3>計算n=pq,m,n這兩個數(shù)便是publickey<2>流程:用戶A用B的公鑰對key進(jìn)行加密,B收到消息后用自己的私鑰進(jìn)行解密獲取key。2.使用提供的模塊編寫RSA加密程序?qū)?shù)據(jù)進(jìn)行加密和解密,提交程序代碼和執(zhí)行結(jié)果。程序代碼:#include"time.h"#include"big.h"#include<iostream>#defineBUFFERSIZE4096staticmiracl*mip=mirsys<BUFFERSIZE,0>;structRSA_Key//密鑰結(jié)構(gòu)體{ Bige; BigN;};intmain<void>{voidGenerateKey<RSA_Key&PublicKey,RSA_Key&PrivateKey,unsignedintiKeySize>;//密鑰生成函數(shù) RSA_KeyPublicKey;//公鑰<e,N> RSA_KeyPrivateKey;//私鑰<d,N> BigM;//明文M BigC;//密文C BigD;//解密文DunsignedintiKeySize; std::cout<<"請輸入加密密鑰長度<單位比特>"<<std::endl; std::cin>>iKeySize; std::cout<<"密鑰生成中"<<std::endl; GenerateKey<PublicKey,PrivateKey,iKeySize/4>;//產(chǎn)生iKeySizebit密鑰 std::cout<<"密鑰生成完畢"<<std::endl; std::cout<<"請輸入明文:"<<std::endl; std::cin>>std::hex>>M; powmod<M.getbig<>,PublicKey.e.getbig<>,PublicKey.N.getbig<>,C.getbig<>>;//調(diào)用加密函數(shù)計算:C=<M^e>%N std::cout<<"RSA加密密文:"<<std::endl; std::cout<<std::hex<<C<<std::endl; powmod<C.getbig<>,PrivateKey.e.getbig<>,PrivateKey.N.getbig<>,D.getbig<>>;//解密與加密使用同一函數(shù),只是密鑰不同即:D=<C^d>%N std::cout<<"解密:"<<std::endl; std::cout<<std::hex<<D<<std::endl;//若D與M相同,可認(rèn)為正確 system<"Pause">;return0;}voidGenerateKey<RSA_Key&PublicKey,RSA_Key&PrivateKey,unsignedintiKeySize>{voidGeneratePrime<Big*bigGenPrime,intiLength,intiBase>;unsignedintInitRandom<>;unsignedintRAND_SEED=InitRandom

溫馨提示

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

評論

0/150

提交評論