華科大密碼學(xué)課程設(shè)計實驗報告_第1頁
華科大密碼學(xué)課程設(shè)計實驗報告_第2頁
華科大密碼學(xué)課程設(shè)計實驗報告_第3頁
華科大密碼學(xué)課程設(shè)計實驗報告_第4頁
華科大密碼學(xué)課程設(shè)計實驗報告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、密碼學(xué)課程設(shè)計實驗報告專業(yè):信息安全班級:0903姓名:付曉帆學(xué)號:U 一、 DES 的編程實現(xiàn)1.實驗?zāi)康?通過實際編程掌握DES的加、脫密及密鑰生成過程,加深對DES算法的認識。2.實驗原理a.加密過程DES是一個分組密碼,使用長度為56比特的密鑰加密長度為64比特的明文,獲得長度為64比特的密文,其加密過程:(1) 給定一個明文X,通過一個固定的初始置換IP置換X的比特,獲得X0,X0=IP(X)=L0R0,L0R0分別是X0的前32比特和后32比特。(2) 然后進行16輪完全相同的運算,有如下規(guī)則,其中0i17,K1, K2,K16都是密鑰K的函數(shù),長度均為48比特:其中函數(shù)f(A,J

2、)的A是一個長度為32的比特串,第二個變量J是一個長度為48的比特串,輸出的是一個長度為32的比特串,其過程:a、將f的第一個變量A根據(jù)一個固定的擴展函數(shù)E擴展成為一個長度為48的比特串b、計算,并將所得結(jié)果分成8個長度為6的比特串,記為B=B1B2B3B4B5B6B7B8c、使用8個S盒,每個Si是一個固定的4X16階矩陣,它的元素來自0到15這16個整數(shù)。給定一個長度為6的比特串,用首位兩個比特作行號,用中間四個比特作為列號,則Sj(Bj)的取值就是Sj的行號列號的整數(shù)所對應(yīng)的二進制表示。記Cj=Sj(Bj),0j9,8個S盒為:S1: 14,4,13,1,2,15,11,8,3,10,6

3、,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, S2: 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, S3: 10,0,9

4、,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, S4: 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,1

5、2,7,2,14, S5: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, S6: 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

6、,5,15,10,11,14,1,7,6,0,8,13, S7: 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, S8: 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,

7、15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11, d、將長度為32的比特串C=C1 C2 C3 C4 C5 C6 C7 C8通過一個固定的置換P置換,將所得結(jié)果P(C)記為f(A,J)。(3) 對比特串R16 L16應(yīng)用初始置換IP的逆置換IP-1,獲得密文Y,即Y=IP-1(R16 L16)。b子密鑰生成過程密鑰方案計算:每一輪都是用不同的、從初始密鑰或稱種子密鑰K導(dǎo)出的48比特密鑰Ki。K是一個長度為64的比特串,實際上除去校驗比特只有56比特有效:(1) 給定一個64比特的密鑰K,刪掉8個校驗比特并利用一個固定的置換PC-1置換K的剩下的5

8、6比特,記PC-1(K) = C0D0,這里C0D0是PC-1(K)的前28比特、后28比特。(2) 對每一個i,0i17,計算: 其中LSi表示一個或兩個位置的左循環(huán)移位,當(dāng)i=1,2,9,4,16時,一個位置,當(dāng)i=3,4,5,6,7,8,10,11,12,13,14,15時,移動兩個位置。PC-2是另一個固定置換。C. 解密過程與加密的過程相同,是加密的逆過程,區(qū)別在于加密輸入明文輸出密文而脫密輸入密文輸出明文,16個內(nèi)部密鑰加密的順序和解密的順序相反。d. 加密算法流程圖(1) 加密算法輸入64比特明文X,經(jīng)過16輪變換,輸出64比特密文Y (2) F函數(shù)Ri-1經(jīng)過E擴展與K(i)異

9、或,通過S盒變換后進行P置換得到32比特的輸出 (3) 子密鑰生成過程種子密鑰通過PC-1變換后,CiDi左移并經(jīng)過PC-2變換得到Ki (4) 程序結(jié)構(gòu)圖輸入字符設(shè)置密碼加密是否解密輸入密碼密碼正確解密密碼錯誤程序結(jié)束是否重新輸入密碼3. 實驗要求a. 輸入一串有意義的漢字,顯示密文和脫密結(jié)果;b. 設(shè)計用戶窗口;c. 實驗環(huán)境說明:操作系統(tǒng)、機型、語言。4. DES的實現(xiàn)a. 開發(fā)環(huán)境主機:Microsoft Windows XP Professional 版本2002 ServicePack3Intel(R) Core(TM)2 Duo CPU T6570 2.10GHz 2.09GHz

10、,1.99GB的內(nèi)存物理地址擴展編程工具:Visual C+ 6.0 功能測試:如圖所示:相關(guān)函數(shù):void ByteToBit(bool *Out, const char *In, int bits);/字符轉(zhuǎn)換成字節(jié)void BitToByte(char *Out,const bool *In,int bits)/字節(jié)轉(zhuǎn)換成字符void RotateL(bool*In,int len,int loop)/循環(huán)左移void Xor(bool*InA,const bool*InB,int len)/異或void Transform(bool*Out,bool*In,const char*Tab

11、le,int len)/各個置換轉(zhuǎn)換void S_func(bool Out32,const bool In48)/將48位轉(zhuǎn)換成32位void F_func(bool In32,const bool Ki48)/F函數(shù)void SetKey(char key8)/生成子密鑰void CDES:Encryption(char out8,char In8)/加密函數(shù)void CDES:Decryption(char out8,char In8)/解密函數(shù)二、 DES的弱密鑰檢測1、什么是DES弱密鑰DES的解密過程,DES的解密過程和DES的加密過程完全類似,只不過將16圈的子密鑰序列K1,K2

12、K16的順序倒過來。即第一圈用第16個子密鑰K16,第二圈用K15,其余類推。如果K16K1,K15K2,K9K8,則加密所用的子密鑰與解密所用的子密鑰相同,對一個明文X加密兩次,得到的還是明文X。更強的,若K1K2K16,則加密過程與解密過程完全一樣。弱密鑰的定義也就是這樣定義:若k使得加密函數(shù)與解密函數(shù)一致,則稱k為弱密鑰。DES至少有4個弱密鑰,讓我們先來看看子密鑰的產(chǎn)生過程:64Bits的密鑰K經(jīng)PC-1之后,變?yōu)?6Bits,然后分為高28Bits和低28Bits,分別進行移位。LSi是循環(huán)左移。PC-2是從56Bits中選出48Bits輸出。若C0和D0為全0或全1,則經(jīng)過移位后顯

13、然不變,于是16個子密鑰都相同。C0和D0是獨立進行移位的,組合一下,就有4個弱密鑰了。因此至少有4個弱密鑰。(1)K1K160x0(2)K1K160xFFFFFFFFFFFF(3)K1K160xFFFFFF(4)K1K160xFFFFFF還可以注意到,第一組和第二組是互補的,第三組和第四組也是互補的。事實上,對于任意密鑰k,我們還有以下關(guān)系成立:(DES的互補性)若yDes(k,X),則yBarDES(kBar,XBar)。(后綴Bar表示取補)2、檢測方法檢測16個內(nèi)部密鑰是否完全相同,若完全相同則判斷為弱密鑰,否則為正常密鑰3、檢測弱密鑰實現(xiàn)在DES程序中加入一個弱密鑰檢測函數(shù),通過檢測

14、其16個內(nèi)部密鑰是否相同,來判斷所輸入的密鑰是否為弱密鑰。所加入函數(shù)如下:bool CheckKey(char* key)SetKey(key);char A6,B6;for(int i=1,j=16;i=1;i+,j-) BitToByte(B,SubKeyi,48); BitToByte(A,SubKeyj,48);/若16個子密鑰完全相同,則為弱密鑰if (memcmp(void*)A,(void*)B,6) ) return 1;else return 0;4、實驗過程(1)輸入密鑰,程序顯示為弱密鑰。(2)輸入密鑰3e96GR4J,檢測顯示為非弱密鑰。5、實驗源代碼#include#

15、include using namespace std;const static char IP64 =/初始置換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;cons

16、t static char EP156 =/密鑰置換(原64位去掉奇偶校驗位后)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;const static char LOOP16 =/左移 1, 1, 2, 2, 2, 2, 2

17、, 2, 1, 2, 2, 2, 2, 2, 2, 1;const static char EP248 =/選擇子密鑰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;static const char EC48 =/放大換位 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8,

18、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;const static char SBox8416 =/8個S盒 / S1 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

19、, 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 , / S2 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, 1

20、1, 6, 7, 12, 0, 5, 14, 9 , / S3 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 , / S4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11,

21、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 , / S5 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,

22、 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 , / S6 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, 1

23、1, 14, 1, 7, 6, 0, 8, 13 , / S7 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 , / S8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5,

24、 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 ;const static char PP32 =/P盒置換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, 3

25、0, 6,22, 11, 4, 25,;const static char LP64 =/末置換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;static bool M

26、64, tmp32, *Li = &M0, *Ri = &M32;static bool SubKey1648;/16個子密鑰class CDES/定義DES類 public: /void Mode();/模式 void Encryption(char out8,char In8);/加密函數(shù) void Decryption(char out8,char In8);/解密函數(shù);void ByteToBit(bool *Out, const char *In, int bits)/字符轉(zhuǎn)換成字節(jié) int i; for(i=0;i3(i&7) & 1; void BitToByte(char *O

27、ut,const bool *In,int bits)/字節(jié)轉(zhuǎn)換成字符 int i; memset(Out,0,(bits+7)/8); for(i=0;i3 |= Ini(i&7); void RotateL(bool*In,int len,int loop)/循環(huán)左移 static bool tmp256; memcpy(tmp,In,loop); memcpy(In,In+loop,len-loop); memcpy(In+len-loop,tmp,loop); void Xor(bool*InA,const bool*InB,int len)/異或 int i; for(i=0;ile

28、n;i+) InAi=InBi; void Transform(bool*Out,bool*In,const char*Table,int len)/各個置換轉(zhuǎn)換 int i; static bool tmp256; for(i=0;ilen;i+) tmpi=InTablei-1; memcpy(Out,tmp,len);void S_func(bool Out32,const bool In48)/將48位轉(zhuǎn)換成32位 int j,m,n; /膨脹后的比特串分為8組,每組6比特。 for(j=0;j8;j+,In+=6,Out+=4) m = (In0*2)+In5; n = (In1*8

29、)+(In2*4)+(In3*2)+In4; ByteToBit(Out,&SBoxjmn,4); void F_func(bool In32,const bool Ki48) static bool MR48; Transform(MR,In,EC,48); Xor(MR, Ki, 48); /膨脹后的比特串分為8組,每組6比特。各組經(jīng)過各自的S盒后,又變?yōu)?比特,合并后又成為32比特。 S_func(In, MR); /該32比特經(jīng)過P變換后,輸出的比特串才是32比特的f(Ri-1,Ki)。 Transform(In, In, PP, 32);void SetKey(char key8)/

30、生成子密鑰 int i; static bool K64, *KL = &K0, *KR = &K28; ByteToBit(K,key,64); /轉(zhuǎn)換為二進制 Transform(K,K,EP1,56); /64比特的密鑰K,經(jīng)過EP1后,生成56比特的串。 /生成16個子密鑰 for(i=0;i16;i+) /循環(huán)左移,合并 RotateL(KL,28,LOOPi); RotateL(KR,28,LOOPi); Transform(SubKeyi,K,EP2,48); bool CheckKey(char* key)SetKey(key);char A6,B6;for(int i=1,j

31、=16;i=1;i+,j-) BitToByte(B,SubKeyi,48); BitToByte(A,SubKeyj,48);/若16個子密鑰完全相同,則為弱密鑰if (memcmp(void*)A,(void*)B,6) ) return 1;else return 0;void CDES:Encryption(char out8,char In8)/加密函數(shù) ByteToBit(M,In,64); /轉(zhuǎn)換為二進制 Transform(M,M,IP,64); for(int i=0;i=0;i-) memcpy(tmp,Li,32); F_func(Li,SubKeyi); Xor(Li,

32、Ri,32); memcpy(Ri,tmp,32); Transform(M, M, LP, 64); BitToByte(out, M, 64); / return(out);void main() int c; char key10;char str128;char str1128;coutstr;coutkey; c=CheckKey(key);if(c) printf(非弱密鑰n);else printf(弱密鑰n);SetKey(key);memset(str1,0,sizeof(str1);CDES des;des.Encryption(str1,str);cout密文:str1e

33、ndl;coutn;if(n=1)while(1)coutsec;if(strcmp(sec,key)=0)memset(str,0,sizeof(str); des.Decryption(str,str1); cout解密后明文:strendl;break; elsecout密碼錯誤!endl;elsecout過程結(jié)束!endl;三、RSA的快速實現(xiàn)一、實驗原理1、選取長度相等的兩個大素數(shù)p 和q,計算其乘積:n = pq然后隨機選取加密密鑰e,使e 和(p1)(q1)互素。最后用歐幾里德擴展算法計算解密密鑰d,以滿足ed = 1(mod(p1) ( q1)即d = e1 mod(p1)(q1)e 和n 是公鑰,d 是私鑰2、加密公式如下:ci = mie(mod n)3、解密時,取每一密文分組ci 并計算:mi = cid(mod n)Cid =(mie)d = mi(ed) = mik(p1)(q1)+1 = mi mik(p1)(q1) = mi *1 = mi4、消息也可以用d 加密用e 解密二、實驗?zāi)康耐ㄟ^RSA加密算法的實現(xiàn),

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論