網(wǎng)絡(luò)空間安全概論 實(shí)驗(yàn)1加密 加密算法_第1頁(yè)
網(wǎng)絡(luò)空間安全概論 實(shí)驗(yàn)1加密 加密算法_第2頁(yè)
網(wǎng)絡(luò)空間安全概論 實(shí)驗(yàn)1加密 加密算法_第3頁(yè)
網(wǎng)絡(luò)空間安全概論 實(shí)驗(yàn)1加密 加密算法_第4頁(yè)
網(wǎng)絡(luò)空間安全概論 實(shí)驗(yàn)1加密 加密算法_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄1仿射密碼 仿射密碼算法簡(jiǎn)介仿射密碼是一種替換密碼,即一個(gè)字母對(duì)應(yīng)一個(gè)字母。明文中的所有字母都在字母表上乘以系數(shù),再向后(或向前)按照一個(gè)固定數(shù)目進(jìn)行偏移后被替換成密文。明文記為m,密文記為c,密鑰記為,加密變換記為E(m),解密變換記為D(m),n為基本字符的個(gè)數(shù)。它的加密函數(shù)是:,其中和n\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"互素。解密函數(shù)是:,此處滿足等式。核心代碼輾轉(zhuǎn)相除法求最大公約數(shù)(用于檢驗(yàn)和n是否互素):求逆元(用于求):加密算法:解密算法:算法流程圖:實(shí)驗(yàn)結(jié)果當(dāng)輸入與26不互素時(shí),提示輸入密鑰不合法,如圖1-1所示;圖1-1輸入密鑰不合法時(shí)當(dāng)輸入密鑰合法時(shí),輸入明文,程序給出相應(yīng)加密后的密文,并將密文解密,如圖1-2所示。圖1-2輸入密鑰合法時(shí)進(jìn)行加解密實(shí)驗(yàn)分析因?yàn)榉律涿艽a仍為單字母表密碼,其依舊保留了該類別加密之弱處。當(dāng)=1時(shí),仿射加密為愷撒(Caesar)密碼,該加密方程可簡(jiǎn)化為線性移動(dòng);當(dāng)=0時(shí),仿射加密為乘數(shù)密碼??紤]加密英文,即n=26,除去當(dāng)=1且=0的情況,總共有26*12-1=311種非易仿射密鑰對(duì)。因?yàn)槊艽a缺少?gòu)?fù)雜性,根據(jù)\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"柯克霍夫原則,這套系統(tǒng)是不安全的。此密碼之首要弱處為,如果密碼學(xué)家可發(fā)現(xiàn)(如\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"頻率分析,暴力破解,臆測(cè)或任何其他方法)加密文件兩字元之原文,則關(guān)鍵值可透過(guò)解一\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"方程組得到。2序列密碼2.1算法簡(jiǎn)介線性反饋移位寄存器(linearfeedbackshiftregister,LFSR)是指,給定前一狀態(tài)的輸出,將該輸出的\t"/item/%E7%BA%BF%E6%80%A7%E5%8F%8D%E9%A6%88%E7%A7%BB%E4%BD%8D%E5%AF%84%E5%AD%98%E5%99%A8/_blank"線性函數(shù)再用作輸入的移位寄存器。異或運(yùn)算是最常見(jiàn)的單比特線性函數(shù):對(duì)寄存器的某些位進(jìn)行異或操作后作為輸入,再對(duì)寄存器中的各比特進(jìn)行整體移位。影響下一個(gè)狀態(tài)的比特位叫做抽頭。LFSR最高位的比特為輸出比特。抽頭依次與輸出比特進(jìn)行異或運(yùn)算,然后反饋回最低位。最高位所生成的序列被稱為輸出流。最大長(zhǎng)度的LFSR生成一個(gè)m序列(例如,只有與有一定抽序列的LFSR才能通過(guò)所有2n?1個(gè)內(nèi)部狀態(tài),不包括全零狀態(tài)),除非它本身為全零,亦即狀態(tài)永不改變。16位的本源多項(xiàng)式為,常數(shù)“1”并不代表某一個(gè)抽頭,它所指的是一個(gè)比特位的輸入。2.2核心代碼將初始狀態(tài)轉(zhuǎn)換為二進(jìn)制表示,其中again用于計(jì)算周期:生成序列:算法流程圖:2.3實(shí)驗(yàn)結(jié)果當(dāng)初始狀態(tài)為18即0000000000010010時(shí),輸出序列周期為65535,如圖2-1-1、2-1-2所示;圖2-1-1初始狀態(tài)為18時(shí)圖2-1-2初始狀態(tài)為18時(shí)的序列周期當(dāng)初始狀態(tài)為4569即0001000111011001時(shí),輸出序列周期為65535,如圖2-2-1、2-2-2所示;圖2-2-1初始狀態(tài)為4569時(shí)圖2-2-2初始狀態(tài)為4569時(shí)的序列周期當(dāng)初始狀態(tài)為18即0000000000010010時(shí),修改多項(xiàng)式為(非本原多項(xiàng)式),輸出序列周期為63,如圖2-3所示;圖2-3非本原多項(xiàng)式,初始狀態(tài)為18時(shí)2.4實(shí)驗(yàn)分析對(duì)于m序列(周期為2n-1),如果攻擊者知道了2n位明密文對(duì),則可確定反饋多項(xiàng)式的系數(shù),從而確定該LFSR接下來(lái)的狀態(tài),也就能得到余下的密鑰序列。由此可見(jiàn),采用線性移位寄存器產(chǎn)生的序列密碼在已知明文攻擊下時(shí)可以破譯的,所以,盡管m序列的隨即性能良好且在所有同階的線性移位寄存器生成序列中周期最長(zhǎng),但從序列密碼安全角度來(lái)看,m序列不合適直接作為密鑰序列來(lái)使用,也就是說(shuō),密鑰序列產(chǎn)生器單有線性移位寄存器是不夠的,還需要非線性組合部分。3DES加解密3.1算法簡(jiǎn)介DES算法全稱為DataEncryptionStandard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法,1977年被美國(guó)聯(lián)邦政府的國(guó)家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS),并授權(quán)在非密級(jí)政府通信中使用,隨后該算法在國(guó)際上廣泛流傳開(kāi)來(lái)。DES是一個(gè)分組加密算法,典型的DES以64位為分組對(duì)數(shù)據(jù)加密,加密和解密用的是同一個(gè)算法。1、密鑰長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算(第8、16、24、32、40、48、56、64位是校驗(yàn)位,使得每個(gè)密鑰都有奇數(shù)個(gè)1),分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組。DES算法的主要流程如下圖所示:2、IP置換IP置換目的是將輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L(zhǎng)0、R0兩部分,每部分各長(zhǎng)32位。置換規(guī)則如下表所示:58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157表中的數(shù)字代表新數(shù)據(jù)中此位置的數(shù)據(jù)在原數(shù)據(jù)中的位置,即原數(shù)據(jù)塊的第58位放到新數(shù)據(jù)的第1位,第50位放到第2位,……依此類推,第7位放到第64位。置換后的數(shù)據(jù)分為L(zhǎng)0和R0兩部分,L0為新數(shù)據(jù)的左32位,R0為新數(shù)據(jù)的右32位。要注意一點(diǎn),位數(shù)是從左邊開(kāi)始數(shù)的,即最0x0000008000000002最左邊的位為1,最右邊的位為64。3、密鑰置換不考慮每個(gè)字節(jié)的第8位,DES的密鑰由64位減至56位,每個(gè)字節(jié)的第8位作為奇偶校驗(yàn)位。產(chǎn)生的56位密鑰由下表生成(注意表中沒(méi)有8,16,24,32,40,48,56和64這8位):57494133251791585042342618102595343252719113605244366355473931231576254463830221466153453729211352820124在DES的每一輪中,從56位密鑰產(chǎn)生出不同的48位子密鑰,確定這些子密鑰的方式如下:(1)將56位的密鑰分成兩部分,每部分28位。(2)根據(jù)輪數(shù),這兩部分分別循環(huán)左移1位或2位。每輪移動(dòng)的位數(shù)如下表:輪數(shù)12345678910111213141516位數(shù)1122222212222221移動(dòng)后,從56位中選出48位。這個(gè)過(guò)程中,既置換了每位的順序,又選擇了子密鑰,因此稱為壓縮置換。4、E擴(kuò)展置換擴(kuò)展置置換目標(biāo)是IP置換后獲得的右半部分R0,將32位輸入擴(kuò)展為48位(分為4位×8組)輸出。擴(kuò)展置換目的有兩個(gè):生成與密鑰相同長(zhǎng)度的數(shù)據(jù)以進(jìn)行異或運(yùn)算;提供更長(zhǎng)的結(jié)果,在后續(xù)的替代運(yùn)算中可以進(jìn)行壓縮。擴(kuò)展置換原理如下表:3212345456789891011121312131415161716171819202120212223242524252627282928293031321表中的數(shù)字代表位,兩列黃色數(shù)據(jù)是擴(kuò)展的數(shù)據(jù),可以看出,擴(kuò)展的數(shù)據(jù)是從相鄰兩組分別取靠近的一位,4位變?yōu)?位。靠近32位的位為1,靠近1位的位為32。表中第二行的4取自上組中的末位,9取自下組中的首位。我們舉個(gè)例子看一下(雖然擴(kuò)展置換針對(duì)的是上步IP置換中的R0,但為便于觀察擴(kuò)展,這里不取R0舉例):輸入數(shù)據(jù)0x10811001,轉(zhuǎn)換為二進(jìn)制就是0001000010000001B,按照上表擴(kuò)展得下表:100010100001010000000010100010100000000000000010表中的黃色數(shù)據(jù)是從臨近的上下組取得的,二進(jìn)制為100010100001010000000010100010100000000000000010B,轉(zhuǎn)換為十六進(jìn)制0x8A14028A0002。擴(kuò)展置換之后,右半部分?jǐn)?shù)據(jù)R0變?yōu)?8位,與密鑰置換得到的輪密鑰進(jìn)行異或。5、S盒代替壓縮后的密鑰與擴(kuò)展分組異或以后得到48位的數(shù)據(jù),將這個(gè)數(shù)據(jù)送人S盒,進(jìn)行替代運(yùn)算。替代由8個(gè)不同的S盒完成,每個(gè)S盒有6位輸入4位輸出。48位輸入分為8個(gè)6位的分組,一個(gè)分組對(duì)應(yīng)一個(gè)S盒,對(duì)應(yīng)的S盒對(duì)各組進(jìn)行代替操作。一個(gè)S盒就是一個(gè)4行16列的表,盒中的每一項(xiàng)都是一個(gè)4位的數(shù)。S盒的6個(gè)輸入確定了其對(duì)應(yīng)的輸出在哪一行哪一列,輸入的高低兩位做為行數(shù)H,中間四位做為列數(shù)L,在S-BOX中查找第H行L列對(duì)應(yīng)的數(shù)據(jù)(<32)。一共8個(gè)S盒代替過(guò)程產(chǎn)生8個(gè)4位的分組,組合在一起形成32位數(shù)據(jù)。S盒代替時(shí)DES算法的關(guān)鍵步驟,所有的其他的運(yùn)算都是線性的,易于分析,而S盒是非線性的,相比于其他步驟,提供了更好安全性。6、P盒置換S盒代替運(yùn)算的32位輸出按照P盒進(jìn)行置換。該置換把輸入的每位映射到輸出位,任何一位不能被映射兩次,也不能被略去,映射規(guī)則如下表:1672021291228171152326518311028241432273919133062211425表中的數(shù)字代表原數(shù)據(jù)中此位置的數(shù)據(jù)在新數(shù)據(jù)中的位置,即原數(shù)據(jù)塊的第16位放到新數(shù)據(jù)的第1位,第7位放到第2位,……依此類推,第25位放到第32位。例如0x10A10001進(jìn)行P盒置換后變?yōu)?x80000886。0x10A10001表現(xiàn)為表的形式(第一位位于左上角)原來(lái)為:00010000101000010000000000000001經(jīng)P盒變換后為:10000000000000000000100010000110即10000000000000000000100010000110B,十六進(jìn)制為0x80000886.最后,P盒置換的結(jié)果與最初的64位分組左半部分L0異或,然后左、右半部分交換,接著開(kāi)始另一輪。7、IP-1末置換末置換是初始置換的逆過(guò)程,DES最后一輪后,左、右兩半部分并未進(jìn)行交換,而是兩部分合并形成一個(gè)分組做為末置換的輸入。末置換規(guī)則如下表:40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725置換方法同上,此處省略。經(jīng)過(guò)以上步驟,就可以得到密文了。3.2核心代碼將默認(rèn)值輸入:對(duì)56位密鑰的前后部分進(jìn)行左移:生成16個(gè)48位的子密鑰:將char字符數(shù)組轉(zhuǎn)為二進(jìn)制:擴(kuò)展置換,32->48:異或、查找S_BOX置換表:P置換,32->32:加密過(guò)程:解密過(guò)程:3.3實(shí)驗(yàn)結(jié)果百度找到的測(cè)試結(jié)果:plaintextkeyciphertext0756D8E0774761D20170F175468FB5E60CD3DA020021DC09進(jìn)行檢驗(yàn),結(jié)果一致:3.5實(shí)驗(yàn)分析最初的羅斯福密碼中密鑰長(zhǎng)度為128位,DES的加密單位僅有64位二進(jìn)制,而且其中某些位還要用于奇偶校驗(yàn)或其他通訊開(kāi)銷,有效密碼只有56位,這對(duì)于數(shù)據(jù)傳輸來(lái)說(shuō)太小,各次迭代中使用的密鑰是遞推產(chǎn)生的,這種相關(guān)性必然降低了密碼體制的安全性。至今,最有效的破解方法是窮舉搜索法,那么56位長(zhǎng)的密鑰總共要測(cè)試256次,花費(fèi)時(shí)間太長(zhǎng)。近年來(lái)有人提出用差分和線性攻擊方案來(lái)破解DES算法,雖然,從理論上來(lái)說(shuō)破譯的性能高于窮舉搜索法,但要有超高速計(jì)算機(jī)提供支持。盡管如此,我們?nèi)匀恍枰紤]對(duì)DES算法進(jìn)行改進(jìn),使密鑰長(zhǎng)度增加些,以實(shí)現(xiàn)更好的保密功能。針對(duì)DES算法上的缺陷,各國(guó)專家們都在研究如何增強(qiáng)DES算法的安全性,現(xiàn)在已發(fā)展出幾十種改進(jìn)的DES,經(jīng)過(guò)比較,筆者認(rèn)為多重DES具有較高的可行性。為了增加密鑰的長(zhǎng)度,采用多重DES加密技術(shù),將分組密碼進(jìn)行級(jí)聯(lián),在不同的密鑰作用下,連續(xù)多次對(duì)一組明文進(jìn)行加密。針對(duì)DES算法,專家們的共識(shí)是采用三重DES加密算法。在DES算法中存在12個(gè)半弱密鑰和4個(gè)弱密鑰。應(yīng)避免出現(xiàn)這16種弱密鑰。附件:附件1.仿射密碼主要代碼#include<iostream>#include<string.h>usingnamespacestd;charm[100];charc[100];intgcd(inta,intb)//輾轉(zhuǎn)相除法求a,b的最大公約數(shù){ intk=0; do { k=a%b; a=b; b=k; }while(k!=0); returna;}intInverse(inta,intb)//求a相對(duì)b的逆元{ inti=0; while(a*(++i)%b!=1);//a*i=1(modb) returni;}voidEncryption(charm[],intk1,intk2)//加密{ intlen=strlen(m); for(inti=0;i<len;i++) { c[i]=(k1*(m[i]-97)+k2)%26+65;//加密公式c=e(m)=k1*m+k2(mod26) } cout<<"加密后的密文為:"; for(inti=0;i<len;i++) cout<<c[i]; cout<<endl;}voidDecryption(charc[],intk1,intk2)//解密{ intlen=strlen(c); charm1[100]; for(inti=0;i<len;i++) { intt=c[i]-65-k2; if(t<0) { t=t+26; } m1[i]=k1*t%26+97;//解密公式m=(e(m)-k2)*(k1^-1)(mod26) } cout<<"解密后的明文為:"; for(inti=0;i<len;i++) cout<<m1[i]; cout<<endl;}intmain(){ intk1,k2; cout<<"請(qǐng)輸入密鑰k1、k2:"; cin>>k1>>k2; while(gcd(k1,26)!=1)//判斷輸入的密鑰是否合法 { cout<<"輸入的密鑰不合法,請(qǐng)重新輸入k1、k2:"<<endl; cin>>k1>>k2; } cout<<"請(qǐng)輸入需要加密的明文:"; cin>>m; Encryption(m,k1,k2); intk3=Inverse(k1,26); cout<<"解密密鑰為:"; cout<<k3<<""<<k2<<endl; Decryption(c,k3,k2); return0;}附件2.序列密碼主要代碼#include<bits/stdc++.h>typedeflonglongll;#definen16usingnamespacestd;intmain(){ bitset<n>bint(18); bitset<n>str(bint); strings1,s2; llagain=0;//序列周期 cout<<"初始狀態(tài)為:"<<bint.to_string()<<endl; do { intj=bint[15]^bint[4]^bint[2]^bint[0];//本原多項(xiàng)式為:x^16+x^5+x^3+x+1 s1=bint.to_string(); s2.push_back(s1[n-1]); bint.operator>>=(1); bint[n-1]=j; again++; }while(str.to_string()!=bint.to_string()); cout<<endl; cout<<"輸出序列為:"<<s2<<endl; cout<<"序列周期為:"<<again<<endl; return0;}附件3.DES加解密主要代碼#include<bits/stdc++.h>usingnamespacestd;bitset<64>key;//64位密鑰bitset<48>subKey[16];//存放16輪子密鑰//初始置換表intIP[]={58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6, 64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7};//結(jié)尾置換表intIP_1[]={40,8,48,16,56,24,64,32, 39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25};//密鑰置換表,將64位密鑰變成56位intPC_1[]={57,49,41,33,25,17,9, 1,58,50,42,34,26,18, 10,2,59,51,43,35,27, 19,11,3,60,52,44,36, 63,55,47,39,31,23,15, 7,62,54,46,38,30,22, 14,6,61,53,45,37,29, 21,13,5,28,20,12,4};//壓縮置換,將56位密鑰壓縮成48位子密鑰intPC_2[]={14,17,11,24,1,5, 3,28,15,6,21,10, 23,19,12,4,26,8, 16,7,27,20,13,2, 41,52,31,37,47,55, 30,40,51,45,33,48, 44,49,39,56,34,53, 46,42,50,36,29,32};//每輪左移的位數(shù)intshiftBits[]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//擴(kuò)展置換表,將32位擴(kuò)展至48位intE[]={32,1,2,3,4,5, 4,5,6,7,8,9, 8,9,10,11,12,13, 12,13,14,15,16,17, 16,17,18,19,20,21, 20,21,22,23,24,25, 24,25,26,27,28,29, 28,29,30,31,32,1};//S盒,每個(gè)S盒是4x16的置換表,6位->4位intS_BOX[8][4][16]={ { {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13} }, { {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9} }, { {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12} }, { {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14} }, { {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3} }, { {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13} }, { {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12} }, { {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11} }};//P置換,32位->32位intP[]={16,7,20,21, 29,12,28,17, 1,15,23,26, 5,18,31,10, 2,8,24,14, 32,27,3,9, 19,13,30,6, 22,11,4,25};bitset<32>f(bitset<32>R,bitset<48>k){ bitset<48>expandR; //第一步:擴(kuò)展置換,32->48 for(inti=0;i<48;++i) expandR[47-i]=R[32-E[i]]; //第二步:異或 expandR=expandR^k; //第三步:查找S_BOX置換表 bitset<32>output; intx=0; for(inti=0;i<48;i=i+6) { introw=expandR[47-i]*2+expandR[47-i-5]; intcol=expandR[47-i-1]*8+expandR[47-i-2]*4+expandR[47-i-3]*2+expandR[47-i-4]; intnum=S_BOX[i/6][row][col]; bitset<4>binary(num); output[31-x]=binary[3]; output[31-x-1]=binary[2]; output[31-x-2]=binary[1]; output[31-x-3]=binary[0]; x+=4; } //第四步:P-置換,32->32 bitset<32>tmp=output; for(inti=0;i<32;++i) output[31-i]=tmp[32-P[i]]; returnoutput;}/***對(duì)56位密鑰的前后部分進(jìn)行左移*/bitset<28>leftShift(bitset<28>k,intshift){ bitset<28>tmp=k; for(inti=27;i>=0;--i) { if(i-shift<0) k[i]=tmp[i-shift+28]; else k[i]=tmp[i-shift]; } returnk;}/***生成16個(gè)48位的子密鑰*/voidgenerateKeys(){ bitset<56>realKey; bitset<28>left; bitset<28>right; bitset<48>compressKey; //去掉奇偶標(biāo)記位,將64位密鑰變成56位 for(inti=0;i<56;++i) realKey[55-i]=key[64-PC_1[i]]; //生成子密鑰,保存在subKeys[16]中 for(intround=0;round<16;++round) { //前28位與后28位 for(inti=28;i<56;++i) left[i-28]=realKey[i]; for(inti=0;i<28;++i) right[i]=realKey[i]; //左移 left=leftShift(left,shiftBits[round]); right=leftShift(right,shiftBits[round]); //壓縮置換,由56位得到48位子密鑰 for(inti=28;i<56;++i) realKey[i]=left[i-28]; for(inti=0;i<28;++i) realKey[i]=right[i]; for(inti=0;i<48;++i) compressKey[47-i]=realKey[56-PC_2[i]]; subKey[round]=compressKey; }}/***工具函數(shù):將char字符數(shù)組轉(zhuǎn)為二進(jìn)制*/bitset<64>charToBitset(constchars[8]){ bitset<64>bits; for(inti=0;i<8;++i) for(intj=0;j<8;++j) bits[i*8+j]=((s[i]>>j)&1); returnbits;}/***DES加密*/bitset<64>encrypt(bitset<64>&plain){ bitset<64>cipher; bitset<64>currentBits; bitset<32>left; bitset<32>right; bitset<32>newLeft; //第一步:初始置換IP for(inti=0;i<64;++i) currentBits[63-i]=plain[64-IP[i]]; //第二步:獲取Li和Ri for(inti=32;i<64;++i) left[i-32]=currentBits[i]; for(inti=0;i<32;++i) right[i]=currentBits[i]; //第三步:共16輪迭代 for(intround=0;round<16;++round) { newLeft=right; right=left^f(right,subKey[round]); left=newLeft; } //第四步:合并L16和R16,注意合并為R16L16 for(inti=0;i<32;++i) cipher[i]=left[i]; for(inti=32;i<64;++i) cipher[i]=right[i-32]; //第五步:結(jié)尾置換IP-1 currentBits=cipher; for(inti=0;i<64;++i) cipher[63-i]=currentBits[64-IP_1[i]]; //返回密文 returncipher;}/***DES解密*/bitset<64>decrypt

溫馨提示

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

評(píng)論

0/150

提交評(píng)論