網絡空間安全概論 實驗1加密 加密算法_第1頁
網絡空間安全概論 實驗1加密 加密算法_第2頁
網絡空間安全概論 實驗1加密 加密算法_第3頁
網絡空間安全概論 實驗1加密 加密算法_第4頁
網絡空間安全概論 實驗1加密 加密算法_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

目錄1仿射密碼 仿射密碼算法簡介仿射密碼是一種替換密碼,即一個字母對應一個字母。明文中的所有字母都在字母表上乘以系數,再向后(或向前)按照一個固定數目進行偏移后被替換成密文。明文記為m,密文記為c,密鑰記為,加密變換記為E(m),解密變換記為D(m),n為基本字符的個數。它的加密函數是:,其中和n\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"互素。解密函數是:,此處滿足等式。核心代碼輾轉相除法求最大公約數(用于檢驗和n是否互素):求逆元(用于求):加密算法:解密算法:算法流程圖:實驗結果當輸入與26不互素時,提示輸入密鑰不合法,如圖1-1所示;圖1-1輸入密鑰不合法時當輸入密鑰合法時,輸入明文,程序給出相應加密后的密文,并將密文解密,如圖1-2所示。圖1-2輸入密鑰合法時進行加解密實驗分析因為仿射密碼仍為單字母表密碼,其依舊保留了該類別加密之弱處。當=1時,仿射加密為愷撒(Caesar)密碼,該加密方程可簡化為線性移動;當=0時,仿射加密為乘數密碼。考慮加密英文,即n=26,除去當=1且=0的情況,總共有26*12-1=311種非易仿射密鑰對。因為密碼缺少復雜性,根據\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"柯克霍夫原則,這套系統是不安全的。此密碼之首要弱處為,如果密碼學家可發現(如\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"頻率分析,暴力破解,臆測或任何其他方法)加密文件兩字元之原文,則關鍵值可透過解一\t"/item/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A0%81/_blank"方程組得到。2序列密碼2.1算法簡介線性反饋移位寄存器(linearfeedbackshiftregister,LFSR)是指,給定前一狀態的輸出,將該輸出的\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"線性函數再用作輸入的移位寄存器。異或運算是最常見的單比特線性函數:對寄存器的某些位進行異或操作后作為輸入,再對寄存器中的各比特進行整體移位。影響下一個狀態的比特位叫做抽頭。LFSR最高位的比特為輸出比特。抽頭依次與輸出比特進行異或運算,然后反饋回最低位。最高位所生成的序列被稱為輸出流。最大長度的LFSR生成一個m序列(例如,只有與有一定抽序列的LFSR才能通過所有2n?1個內部狀態,不包括全零狀態),除非它本身為全零,亦即狀態永不改變。16位的本源多項式為,常數“1”并不代表某一個抽頭,它所指的是一個比特位的輸入。2.2核心代碼將初始狀態轉換為二進制表示,其中again用于計算周期:生成序列:算法流程圖:2.3實驗結果當初始狀態為18即0000000000010010時,輸出序列周期為65535,如圖2-1-1、2-1-2所示;圖2-1-1初始狀態為18時圖2-1-2初始狀態為18時的序列周期當初始狀態為4569即0001000111011001時,輸出序列周期為65535,如圖2-2-1、2-2-2所示;圖2-2-1初始狀態為4569時圖2-2-2初始狀態為4569時的序列周期當初始狀態為18即0000000000010010時,修改多項式為(非本原多項式),輸出序列周期為63,如圖2-3所示;圖2-3非本原多項式,初始狀態為18時2.4實驗分析對于m序列(周期為2n-1),如果攻擊者知道了2n位明密文對,則可確定反饋多項式的系數,從而確定該LFSR接下來的狀態,也就能得到余下的密鑰序列。由此可見,采用線性移位寄存器產生的序列密碼在已知明文攻擊下時可以破譯的,所以,盡管m序列的隨即性能良好且在所有同階的線性移位寄存器生成序列中周期最長,但從序列密碼安全角度來看,m序列不合適直接作為密鑰序列來使用,也就是說,密鑰序列產生器單有線性移位寄存器是不夠的,還需要非線性組合部分。3DES加解密3.1算法簡介DES算法全稱為DataEncryptionStandard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。DES是一個分組加密算法,典型的DES以64位為分組對數據加密,加密和解密用的是同一個算法。1、密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位,使得每個密鑰都有奇數個1),分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組。DES算法的主要流程如下圖所示:2、IP置換IP置換目的是將輸入的64位數據塊按位重新組合,并把輸出分為L0、R0兩部分,每部分各長32位。置換規則如下表所示:58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157表中的數字代表新數據中此位置的數據在原數據中的位置,即原數據塊的第58位放到新數據的第1位,第50位放到第2位,……依此類推,第7位放到第64位。置換后的數據分為L0和R0兩部分,L0為新數據的左32位,R0為新數據的右32位。要注意一點,位數是從左邊開始數的,即最0x0000008000000002最左邊的位為1,最右邊的位為64。3、密鑰置換不考慮每個字節的第8位,DES的密鑰由64位減至56位,每個字節的第8位作為奇偶校驗位。產生的56位密鑰由下表生成(注意表中沒有8,16,24,32,40,48,56和64這8位):57494133251791585042342618102595343252719113605244366355473931231576254463830221466153453729211352820124在DES的每一輪中,從56位密鑰產生出不同的48位子密鑰,確定這些子密鑰的方式如下:(1)將56位的密鑰分成兩部分,每部分28位。(2)根據輪數,這兩部分分別循環左移1位或2位。每輪移動的位數如下表:輪數12345678910111213141516位數1122222212222221移動后,從56位中選出48位。這個過程中,既置換了每位的順序,又選擇了子密鑰,因此稱為壓縮置換。4、E擴展置換擴展置置換目標是IP置換后獲得的右半部分R0,將32位輸入擴展為48位(分為4位×8組)輸出。擴展置換目的有兩個:生成與密鑰相同長度的數據以進行異或運算;提供更長的結果,在后續的替代運算中可以進行壓縮。擴展置換原理如下表:3212345456789891011121312131415161716171819202120212223242524252627282928293031321表中的數字代表位,兩列黃色數據是擴展的數據,可以看出,擴展的數據是從相鄰兩組分別取靠近的一位,4位變為6位。靠近32位的位為1,靠近1位的位為32。表中第二行的4取自上組中的末位,9取自下組中的首位。我們舉個例子看一下(雖然擴展置換針對的是上步IP置換中的R0,但為便于觀察擴展,這里不取R0舉例):輸入數據0x10811001,轉換為二進制就是0001000010000001B,按照上表擴展得下表:100010100001010000000010100010100000000000000010表中的黃色數據是從臨近的上下組取得的,二進制為100010100001010000000010100010100000000000000010B,轉換為十六進制0x8A14028A0002。擴展置換之后,右半部分數據R0變為48位,與密鑰置換得到的輪密鑰進行異或。5、S盒代替壓縮后的密鑰與擴展分組異或以后得到48位的數據,將這個數據送人S盒,進行替代運算。替代由8個不同的S盒完成,每個S盒有6位輸入4位輸出。48位輸入分為8個6位的分組,一個分組對應一個S盒,對應的S盒對各組進行代替操作。一個S盒就是一個4行16列的表,盒中的每一項都是一個4位的數。S盒的6個輸入確定了其對應的輸出在哪一行哪一列,輸入的高低兩位做為行數H,中間四位做為列數L,在S-BOX中查找第H行L列對應的數據(<32)。一共8個S盒代替過程產生8個4位的分組,組合在一起形成32位數據。S盒代替時DES算法的關鍵步驟,所有的其他的運算都是線性的,易于分析,而S盒是非線性的,相比于其他步驟,提供了更好安全性。6、P盒置換S盒代替運算的32位輸出按照P盒進行置換。該置換把輸入的每位映射到輸出位,任何一位不能被映射兩次,也不能被略去,映射規則如下表:1672021291228171152326518311028241432273919133062211425表中的數字代表原數據中此位置的數據在新數據中的位置,即原數據塊的第16位放到新數據的第1位,第7位放到第2位,……依此類推,第25位放到第32位。例如0x10A10001進行P盒置換后變為0x80000886。0x10A10001表現為表的形式(第一位位于左上角)原來為:00010000101000010000000000000001經P盒變換后為:10000000000000000000100010000110即10000000000000000000100010000110B,十六進制為0x80000886.最后,P盒置換的結果與最初的64位分組左半部分L0異或,然后左、右半部分交換,接著開始另一輪。7、IP-1末置換末置換是初始置換的逆過程,DES最后一輪后,左、右兩半部分并未進行交換,而是兩部分合并形成一個分組做為末置換的輸入。末置換規則如下表:40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725置換方法同上,此處省略。經過以上步驟,就可以得到密文了。3.2核心代碼將默認值輸入:對56位密鑰的前后部分進行左移:生成16個48位的子密鑰:將char字符數組轉為二進制:擴展置換,32->48:異或、查找S_BOX置換表:P置換,32->32:加密過程:解密過程:3.3實驗結果百度找到的測試結果:plaintextkeyciphertext0756D8E0774761D20170F175468FB5E60CD3DA020021DC09進行檢驗,結果一致:3.5實驗分析最初的羅斯福密碼中密鑰長度為128位,DES的加密單位僅有64位二進制,而且其中某些位還要用于奇偶校驗或其他通訊開銷,有效密碼只有56位,這對于數據傳輸來說太小,各次迭代中使用的密鑰是遞推產生的,這種相關性必然降低了密碼體制的安全性。至今,最有效的破解方法是窮舉搜索法,那么56位長的密鑰總共要測試256次,花費時間太長。近年來有人提出用差分和線性攻擊方案來破解DES算法,雖然,從理論上來說破譯的性能高于窮舉搜索法,但要有超高速計算機提供支持。盡管如此,我們仍然需要考慮對DES算法進行改進,使密鑰長度增加些,以實現更好的保密功能。針對DES算法上的缺陷,各國專家們都在研究如何增強DES算法的安全性,現在已發展出幾十種改進的DES,經過比較,筆者認為多重DES具有較高的可行性。為了增加密鑰的長度,采用多重DES加密技術,將分組密碼進行級聯,在不同的密鑰作用下,連續多次對一組明文進行加密。針對DES算法,專家們的共識是采用三重DES加密算法。在DES算法中存在12個半弱密鑰和4個弱密鑰。應避免出現這16種弱密鑰。附件:附件1.仿射密碼主要代碼#include<iostream>#include<string.h>usingnamespacestd;charm[100];charc[100];intgcd(inta,intb)//輾轉相除法求a,b的最大公約數{ intk=0; do { k=a%b; a=b; b=k; }while(k!=0); returna;}intInverse(inta,intb)//求a相對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<<"請輸入密鑰k1、k2:"; cin>>k1>>k2; while(gcd(k1,26)!=1)//判斷輸入的密鑰是否合法 { cout<<"輸入的密鑰不合法,請重新輸入k1、k2:"<<endl; cin>>k1>>k2; } cout<<"請輸入需要加密的明文:"; 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<<"初始狀態為:"<<bint.to_string()<<endl; do { intj=bint[15]^bint[4]^bint[2]^bint[0];//本原多項式為: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};//結尾置換表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};//每輪左移的位數intshiftBits[]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//擴展置換表,將32位擴展至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盒,每個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; //第一步:擴展置換,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;}/***對56位密鑰的前后部分進行左移*/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個48位的子密鑰*/voidgenerateKeys(){ bitset<56>realKey; bitset<28>left; bitset<28>right; bitset<48>compressKey; //去掉奇偶標記位,將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; }}/***工具函數:將char字符數組轉為二進制*/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]; //第五步:結尾置換IP-1 currentBits=cipher; for(inti=0;i<64;++i) cipher[63-i]=currentBits[64-IP_1[i]]; //返回密文 returncipher;}/***DES解密*/bitset<64>decrypt

溫馨提示

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

評論

0/150

提交評論