



版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、xx 工程大學實驗報告( 2015-2016 學年第一學期 )報告題目 :DES 加密算法課程名稱 :密碼學 B任課教員 :專業(yè):學號:姓名:下載可編輯二 O 一六年一月十八日一、課程概述目的:培養(yǎng)學員的編程能力 ,理解算法原理 。要求:給出 DES 算法的軟件實現(xiàn) ,測試 DES 的加密速度 。二、設計思路使用 C+ 語言進行編程 ,簡化了輸入輸出語句 。 預處理時加入了iostream 包。使用了 std 名字空間 。加密時程序輸入的明文是8 個 ascii 碼,生成一個 16 個 16 進制數(shù)的密文 。脫密時程序輸入的密文是16 個 16 進制數(shù),生成一個 8 個 ascii 碼的明文
2、。加脫密所用密鑰均由16 個 16 進制數(shù)組成 。其中 16 進制數(shù)全部使用大寫字母。程序中大量使用了的布爾數(shù)組,一個 bool 型變量只占用一位存儲空間,比 int 型、char 型變量要小的多 。 這降低了程序的空間復雜度。三、采取的方案本程序是將一個由8 個 ascii 碼組成的明文分組加密,生成一個由 16 個 16 進制數(shù)組成的密文 ?;?qū)⒁粋€由 16 個 16 進制數(shù)組成的密文進行脫密,生成一個由 8 個 ascii碼組成的明文 。所用密鑰由 16 個 16 進制數(shù)組成 。本實驗按照輸入數(shù)據(jù)及初始置換、 16 圈迭代、子密鑰生成和逆初始置換及輸出數(shù)據(jù)四個步驟實現(xiàn)加密算法設計。.專業(yè)
3、 .整理 .下載可編輯1、輸入數(shù)據(jù)及初始置換本程序首先會提示用戶輸入加密脫密識別碼,加密輸入 1,脫密輸入 0,將此識別碼存入整形變量o。 根據(jù) o 的不同值 ,提示用戶輸入 8 個字符(加密)或 16 個 16 進制數(shù)(脫密)。輸入的明文或密文轉(zhuǎn)化為二進制數(shù)后儲存到布爾型數(shù)組m65 中 。初始置換通過函數(shù)IP 完成,函數(shù)輸入為原始明文m,函數(shù)將輸出結果保存到布爾型數(shù)組 mip65 中。函數(shù)思想為查表 ,含有一個整形變量數(shù)組ip64 ,保存初始變換表IP。 將 mip 的第 i 位賦值為 m 的第 ipi 位。2、子密鑰生成輸入 16 個 16 進制數(shù)的密鑰后 ,將密鑰保存在一個16 位字符數(shù)
4、組 c 中,通過ToEr 函數(shù)將之變?yōu)槎M制數(shù)。 ToEr 函數(shù)輸入為字符數(shù)組 ,通過 switch 語句逐個檢查字符數(shù)組的每一位 ,將對應的四位二進制數(shù)存在64 位布爾數(shù)組 k 中 。64 bit 密鑰去掉每個字節(jié)的最高位得到56 bit 密鑰輸入 ,通過置換選擇 1 變換得到C 0 和 D 0 各 28 bit,通過 Zhihuan_1 函數(shù)實現(xiàn)置換選擇一 。Zhihuan_1 函數(shù)輸入為二進制密鑰數(shù)組 k64 ,輸出為 C0 和 D0 ,將 C0、D0 分別儲存在 28 位布爾數(shù)組 C、D 中。函數(shù)采用查表方式生成C0 和 D0 。根據(jù)迭代的輪數(shù)確定C 和 D 移位循環(huán)的位數(shù) ,主程序中
5、利用一個16 位整形數(shù)組來存放每一次循環(huán)左移的位數(shù)。循環(huán)左移通過XunHuan 函數(shù)實現(xiàn) ,函數(shù)輸入為循環(huán)位數(shù)和長度為 28 的布爾數(shù)組 ( C 或者 D),函數(shù)運行一次只能改變一個布爾數(shù)組的值。為了減低編程復雜度 ,程序使用串行方法 ,分兩次進行 C、D 的移位 。每完成一次 C 和 D 的移位,進行一次置換選擇二 。置換選擇二利用zhihuan_2 函數(shù)完成 。 思想和Zhihuan_1函數(shù)類似 。 zhihuan_2函數(shù)輸入為移位后的C、 D ,zhihuan_2 函數(shù)將圈子密鑰存放在16*48 的二維布爾數(shù)組kk1749中。kki48 表示.專業(yè) .整理 .下載可編輯第 i 圈的圈子密
6、鑰 。 原理圖如圖 1 所示 。脫密( o=0時)需要將圈子密鑰交換 ,此時可利用kk049 充當中間變量 ,無需定義新的變量減少了系統(tǒng)開銷。密鑰置換選擇1562828C 0D 0移位循環(huán)移位循環(huán)C1D1置換選擇248k 1移位循環(huán)移位循環(huán)C2D2置換選擇248k 2移位循環(huán)移位循環(huán)C16D16置換選擇248k 16圖 1 圈子密鑰生成算法3、16 圈迭代DES 的每一圈迭代采用的是Feistel 模型,先將初始置換后的明文mip 數(shù)組分成 L和 R 兩部分,先將 R 的內(nèi)容放在等長的布爾數(shù)組 T 中,最后時需要將 L 的值賦為 T。之后進入 F 函數(shù),F(xiàn) 函數(shù)原理如圖 2。R=a 1 a2
7、a32Ea1 a2a48K=k 1 k 2 k48S1S2S3S4S5S6S7S8P.專業(yè) .整理 .下載可編輯圖 2F 函數(shù)原理圖程序中的 F 函數(shù)輸入有初始置換結果的右半部分R、圈子密鑰 kk、迭代圈數(shù) i。輸出保存在 R 中。先將輸入的 R 通過查表的方法進行E 拓展,結果保存在 48 位布爾數(shù)組a 中 。再將 a 與圈子密鑰 k 按位模二加 。 結果保存在 a 中 。接下來將 a 分成 8 組,分別進入 8 個 S 盒 。用 for 控制循環(huán) 8 次,每次操作選用 6位二進制代碼的開頭一位和最后一位轉(zhuǎn)化成十進制數(shù),控制 S盒的行數(shù) ,再將 6 位二進制代碼的中間四位轉(zhuǎn)化成十進制數(shù),控制
8、 S 盒的列數(shù) 。 進入第幾個 S 盒有迭代圈數(shù) i 確定 。取到 S 盒中的十進制數(shù)后 ,將它轉(zhuǎn)化成二進制數(shù) ,儲存在 32 位布爾數(shù)組 T 中,在使用查表法完成P 盒置換,最終結果保存在R 中。最后將 L 與 R 按位模二加 ,得到新的 R,完成一次迭代 。4、逆初始置換16 次迭代后 ,先將 L16 和 R16 連接起來 ,保存到 64 位布爾數(shù)組 m 中,m 之前用于保存明文 ,這樣減小了程序占用的空間。另外,為了保證加脫密算法的一致性,迭代時最后一圈不需要交換L 與 R,但程序中為了簡化編程復雜度,在迭代時仍然交換了L 與 R。所以在連接時需要再次交換L 與 R。 所以 m 的高 3
9、2 位應儲存 R,低 32 位應儲存 L。逆初始置換原理同初始置換步驟,不再贅述 。四、取得的成果利 用 密 鑰201601211438FBCA對 明 文81623317加 密 , 密 文 為6B217C871EAE79D2H 結果如圖 3 所示 。.專業(yè) .整理 .下載可編輯圖 3 DES 加密結果圖利用 密鑰201601211438FBCA對 密 文6B217C871EAE79D2脫 密 ,明 文為81623317 。結果如圖 4 所示 。圖 4 DES 脫密結果圖變換不同明文及密鑰 ,均可以正常加脫密 。 在報告中不再羅列 。.專業(yè) .整理 .下載可編輯五、心得體會DES 算法是一種分組
10、密碼算法,本人通過對一個明文分組的加脫密進行編程,耗時近一個月 ,獨立完成了次算法的C+ 實現(xiàn) 。本人的程序不同于網(wǎng)上找的DES 算法程序,網(wǎng)上的大多數(shù)程序的密文都是以ASCII 碼來輸出的 。 但是,這樣輸出的結果有很多亂碼出現(xiàn) 。 因為 ASCII 碼只有在小范圍內(nèi)輸出的結果是正常的字母、數(shù)字或者符號 (從33 至 127 ),如果按 ASCII 輸出亂碼密文 ,脫密者就很難鍵入這些密文,只能通過復制粘貼進行 。 而 VC6.0 的環(huán)境在控制臺中很難進行復制操作,這樣如果不借助文件 ,就很難完成密文的脫密。而密文按16 進制輸出就不存在這個問題。二進制串與ASCII碼、16 進制數(shù)之間的轉(zhuǎn)
11、化也是實驗的難點之一。 C 語言的課上沒有講過位運算的相關知識,本人只能通過除以二取余、查表等笨辦法進行轉(zhuǎn)化 。同樣 ,密鑰選用 16 進制也是一個道理 ,如果只用字符輸入密鑰,密鑰的每八位就會局限在00100001 ( 33 )至01111111 ( 127 )范圍之內(nèi) ,超過范圍就無法用鍵盤進行輸入密鑰,這樣破譯者如果看到了加密程序源代碼 ,相應的窮盡時間會減少 。通過本次編程 ,我發(fā)現(xiàn)我對C/C+ 語言的掌握還是不夠 ,尤其是涉及到位運算 。我也會找機會自學這一部分內(nèi)容。六、附錄程序代碼 :#include using namespace std;void ToEr(char c,boo
12、l k).專業(yè) .整理 .下載可編輯int i,j;j=0;for(i=1;i=16;i+)switch (ci)case 0:k j+=0;k j+=0;k j+=0;k j+=0;break;case 1:kj+=0;kj+=0;kj+=0;kj+=1;break;case 2:kj+=0;kj+=0;kj+=1;kj+=0;.專業(yè) .整理 .下載可編輯break;case 3:kj+=0;kj+=0;kj+=1;kj+=1;break;case 4:kj+=0;kj+=1;kj+=0;kj+=0;break;case 5:kj+=0;kj+=1;kj+=0;kj+=1;break;cas
13、e 6:kj+=0;kj+=1;.專業(yè) .整理 .下載可編輯kj+=1;kj+=0;break;case 7:kj+=0;kj+=1;kj+=1;kj+=1;break;case 8:kj+=1;kj+=0;kj+=0;kj+=0;break;case 9:kj+=1;kj+=0;kj+=0;kj+=1;break;case A:.專業(yè) .整理 .下載可編輯kj+=1;kj+=0;kj+=1;kj+=0;break;case B:kj+=1;kj+=0;kj+=1;kj+=1;break;case C:kj+=1;kj+=1;kj+=0;kj+=0;break;case D:kj+=1;kj+
14、=1;kj+=0;kj+=1;.專業(yè) .整理 .下載可編輯break;case E:kj+=1;kj+=1;kj+=1;kj+=0;break;case F:kj+=1;kj+=1;kj+=1;kj+=1;break;/for (i=0;i64;i+)coutki;/ coutendl;void MtoEr(char asc,bool m).專業(yè) .整理 .下載可編輯int i,j,flag,f;int as9;bool z9=0,t;for(i=1;i=8;i+) asi = (int)asci;for (i=1;i=8;i+)f=1;flag = 8 * (i-1);while(asi!=
15、0)zf = asi % 2;asi /= 2;f+;/ for( j=1;j=8;j+) coutzj;/coutendl;for( j=1;j=4;j+) t = zj;z j = z9-j;z9-j = t;/z1 = 0;for( j=1;j=8;j+) mflag+j = zj;.專業(yè) .整理 .下載可編輯for( j=1;j=8;j+) zj=0;/ for( j=1;j=64;j+) coutmj;/coutendl;void IP(bool m,bool mip)int ip64=57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27,
16、19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7,56, 48, 40, 32, 24, 16, 8, 0,58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6;for (int i=1;i=64;i+)mipi=mipi-1+1;void IP2(bool m,bool mip)int ip64=.專業(yè) .整理 .下載可編輯39, 7, 47, 15, 55, 23, 63, 3
17、1,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,32, 0, 40, 8, 48, 16, 56, 24;for (int i=1;i=64;i+)mipi=mipi-1+1;void Zhihuan_1(bool k,bool C,bool D)int a28=57,49,41,33
18、,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36;int b28=63,55,47,39,31,23,15,.專業(yè) .整理 .下載可編輯7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4;int i;for(i=1;i=28;i+) Ci=kai-1;for(i=1;i=28;i+) Di=kbi-1;/ for(i=1;i=28;i+) coutCi; coutendl;/ for(i=1;i=28;i+) coutDi; coutendl
19、;void zhihuan_2(bool C,bool D,bool k49,int q)int a48=13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31;int i;.專業(yè) .整理 .下載可編輯bool T57;for (i=1;i=56;i+)if(i=28) Ti = Ci;else Ti = Di-28;for(i=1;i=48;i+)kq+1i=Tai-1+1;/fo
20、r (i=1;i=48;i+) coutkq+1i;coutendl;void XunHuan(int x,bool C)int i;bool T29;for(i=1;i29;i+)Ti = C(i+x)%28+1;for(i=1;i29;i+)Ci = Ti;void F(bool R,bool kk49,int x).專業(yè) .整理 .下載可編輯int E48=31,0,1,2,3,4,3,4,5,6,7,8,7,8, 9, 10, 11, 12,11, 12, 13, 14, 15, 16,15, 16, 17, 18, 19, 20,19, 20, 21, 22, 23, 24,23,
21、24, 25, 26, 27, 28,27, 28, 29, 30, 31,0;int S8416=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,
22、 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,.專業(yè) .整理 .下載可編輯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,
23、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,
24、 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,.專業(yè) .整理 .下載可編輯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
25、, 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,1
26、2, 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;int i,j,p,a1,a2,k8;.專業(yè) .整理 .下載可編輯bool a49,b33;for (i=1;i=48;i+) ai = REi-1+1;/ for (i=1;i=48;i+) coutai; for (i=1;i=48;i+) ai= kkxi;/ for (i=1;i=48;i+) coutai; p=1;for (i=0;i8;i+)a1
27、 = ap*2+ap+5;/左右兩位換成十進制數(shù)a2 = ap+1*8+ap+2*4+ap+3*2+ap+4;/ 中間 4 位換成十進制數(shù)/couta1endl;/couta2endl;p += 6;ki = Sia1a2;/coutkiendl;p=1;for (i=0;i8;i+)switch (ki)case 0: bp+ = 0;bp+ = 0;.專業(yè) .整理 .下載可編輯bp+ = 0;bp+ = 0;break;case 1: bp+ = 0;bp+ = 0;bp+ = 0;bp+ = 1;break;case 2: bp+ = 0;bp+ = 0;bp+ = 1;bp+ = 0;
28、break;case 3: bp+ = 0;bp+ = 0;bp+ = 1;bp+ = 1;break;case 4: bp+ = 0;bp+ = 1;bp+ = 0;bp+ = 0;break;case 5: bp+ = 0;bp+ = 1;bp+ = 0;bp+ = 1;break;.專業(yè) .整理 .下載可編輯case 6: bp+ = 0;bp+ = 1;bp+ = 1;bp+ = 0;break;case 7: bp+ = 0;bp+ = 1;bp+ = 1;bp+ = 1;break;case 8: bp+ = 1;bp+ = 0;bp+ = 0;bp+ = 0;break;case
29、 9: bp+ = 1;bp+ = 0;bp+ = 0;bp+ = 1;break;case 10: bp+ = 1;bp+ = 0;bp+ = 1;bp+ = 0;break;case 11: bp+ = 1;bp+ = 0;.專業(yè) .整理 .下載可編輯bp+ = 1;bp+ = 1;break;case 12: bp+ = 1;bp+ = 1;bp+ = 0;bp+ = 0;break;case 13: bp+ = 1;bp+ = 1;bp+ = 0;bp+ = 1;break;case 14: bp+ = 1;bp+ = 1;bp+ = 1;bp+ = 0;break;case 15:
30、bp+ = 1;bp+ = 1;bp+ = 1;bp+ = 1;break;bool T33;for(i=1;i=32;i+) Ti=bi;.專業(yè) .整理 .下載可編輯int P32=15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24;for(i=1;i=32;i+) Ri=TPi-1+1;void main()char c17,asc9;int i,j,mout17;boolk65,kk1749,C29,D29,m65,mip65,L33,R33,T33;/k存放二進制密鑰 ,kk 存放 16 圈的圈子密鑰 , m 存放明文 , mip 存放明文初始變換后int z16=1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;int o;/C 、D 存放圈子密鑰生產(chǎn)算法的左右兩個部分。 z 為圈子密鑰每次循環(huán)左移的次數(shù)couto;.專業(yè) .整理 .下載可編輯cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度離職員工保密協(xié)議及競業(yè)限制合同簽訂流程規(guī)范
- 二零二五年度知識產(chǎn)權保護合伙人合作協(xié)議范本
- 法律實務案例分析題及法律理論應用題卷
- 共享平臺合作協(xié)議知識產(chǎn)權合作開發(fā)協(xié)議
- 高峰會議交流與合作備忘錄
- 油漆勞務合同油漆工用工合同
- 基于大數(shù)據(jù)的農(nóng)業(yè)現(xiàn)代化種植管理系統(tǒng)開發(fā)實踐
- 企業(yè)形象策劃及活動推廣合作協(xié)議
- 精紡織品采購合同
- 高一英語動詞時態(tài)對照分析教案
- 美甲基礎理論精品專業(yè)課件
- 監(jiān)護人考試試題含答案
- 冀教版四年級下冊英語全冊教學設計(經(jīng)典,可直接打印使用)
- 高壓變頻器技術協(xié)議最終2.3日
- 保潔整改方案計劃
- 新編地圖學教程(第三版)毛贊猷_期末復習知識點總結
- 碘-淀粉比色法測定淀粉酶課件
- 經(jīng)銷商授權協(xié)議合同書(中英文對照)
- 初三化學公式大全
- 安裝超載限制器方案
- 外科學總論--創(chuàng)傷ppt
評論
0/150
提交評論