

下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 網(wǎng)絡(luò)安全</b></p><p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p><b> DES源代碼分析</b></p><p> 一、DES對(duì)稱加密算法簡(jiǎn)介</p><p> 最著名的保密密鑰或?qū)ΨQ密鑰加密算法DES(Data Encryption Standa
2、rd)是由IBM公司在70年代發(fā)展起來(lái)的,并經(jīng)過(guò)政府的加密標(biāo)準(zhǔn)篩選后,于1976年11月被美國(guó)政府采用,DES隨后被美國(guó)國(guó)家標(biāo)準(zhǔn)局和美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(American National Standard Institute, ANSI) 承認(rèn)。</p><p> DES使用56位密鑰對(duì)64位的數(shù)據(jù)塊進(jìn)行加密,并對(duì)64位的數(shù)據(jù)塊進(jìn)行16輪編碼。與每輪編碼時(shí),一個(gè)48位的“每輪”密鑰值由56位的完整密鑰得出來(lái)。DE
3、S用軟件進(jìn)行解碼需要用很長(zhǎng)時(shí)間,而用硬件解碼速度非???,但幸運(yùn)的是當(dāng)時(shí)大多數(shù)黑客并沒(méi)有足夠的設(shè)備制造出這種硬件設(shè)備。在1977年,人們估計(jì)要耗資兩千萬(wàn)美元才能建成一個(gè)專門計(jì)算機(jī)用于DES的解密,而且需要12個(gè)小時(shí)的破解才能得到結(jié)果。所以,當(dāng)時(shí)DES被認(rèn)為是一種十分強(qiáng)壯的加密方法。</p><p> 二、DES對(duì)稱加密算法分析</p><p> ?。?)DES算法原理</p>
4、<p> 在DES算法中有Data、Key、Mode三個(gè)參數(shù)。其中Data代表需要加密或解密的數(shù)據(jù),由8字節(jié)64位組成;Key代表加密或解密的密鑰,也由8字節(jié)64位組成;Mode代表加密或解密的狀態(tài)。</p><p> 在DES算法中加密和解密的原理是一樣的,只是因?yàn)镸ode的狀態(tài)不同,適用密鑰的順序不同而已。</p><p> ?。?)DES算法的加密過(guò)程</p&g
5、t;<p> DES算法的加密過(guò)程如圖6.2所示。</p><p> 初始置換(Initial Permutation,IP)是對(duì)輸入的64位數(shù)據(jù)按照規(guī)定的矩陣改變數(shù)據(jù)位的排列順序的換位變換,此過(guò)程與密鑰無(wú)關(guān)。</p><p> 子密鑰生成是由64位外部輸入密鑰通過(guò)置換和移位操作生成加密和解密所需的16組(每組56位)子密鑰的過(guò)程。</p><p&g
6、t; 乘積變換過(guò)程非常復(fù)雜,是加密過(guò)程的關(guān)鍵。該過(guò)程通過(guò)16輪重復(fù)的替代、移位、異或和置換操作打亂原輸入數(shù)據(jù)。</p><p> 逆初始置換(IP-1)與初始置換過(guò)程相同,只是置換矩陣是初始置換的逆矩陣。</p><p> ?、?初始置換(IP)</p><p> 將64位明文按照初始置換表(如表6.1)的規(guī)則進(jìn)行置換。其置換過(guò)程為:將輸入明文的第58位置換到
7、第1位,第50位置換到第2位,第12位置換到第3位,依此類推,……,最后第7位置換到第64位。</p><p><b> ?、?子密鑰生成</b></p><p> 輸入的密鑰K是64位數(shù)據(jù),但其中第8、16、24、32、40、48、56、64位用于奇偶校驗(yàn),實(shí)際使用的密鑰位只有56位。子密鑰Ki的生成流程如圖6.3所示。</p><p>
8、 第1步:PC1變換。將56位密鑰按置換選擇1(PC-1)的規(guī)律(見(jiàn)表6.2)進(jìn)行置換,變換后分為左右兩路(C0、D0)各28位。</p><p> 第2步:數(shù)據(jù)左移。將兩個(gè)28位的C0和D0按表6.3的規(guī)則進(jìn)行循環(huán)左移。表6.3中第1行表示迭代輪次,第2行表示左移的位數(shù)。左移的規(guī)律是將C0和D0所有的位按表中規(guī)定的位數(shù)循環(huán)左移。</p><p> 第3步:PC2變換和子密鑰生成。C0
9、和D0左移1位后得到C1和D1 ,再將C1和D1數(shù)據(jù)組合后(56位)按照PC2變換的要求變換得到48位的子密鑰K1,在進(jìn)行第1輪迭代時(shí)使用K1;同理,將C1和D1左移1位得到C2和D2,再將C2和D2數(shù)據(jù)組合后按照PC2變換的要求變換得到48位的子密鑰K2;……;依此類推,就可以得到K3、K4…..K16。PC2變換如表6.4所示。PC2變換是將輸入的56位數(shù)據(jù)變換為48位輸出,該變換是一種壓縮變換。</p><p&
10、gt; 根據(jù)不同輪數(shù)分別進(jìn)行左移和壓縮變換,分別得到16個(gè)48位的子密鑰K1, K2,…, K16。</p><p><b> ?、?乘積變換</b></p><p> 初始置換后的數(shù)據(jù)分為各32位的兩部分,左部分為L(zhǎng)0,右部分為R0,這樣,L0 = D58D50D12….D8,R0 = D57D49D41…D7。乘積變換過(guò)程就是將L0和R0按照乘積變換運(yùn)算公式進(jìn)
11、行迭代運(yùn)算,最后得出L16和R16。如圖6.4所示。</p><p> 第1步:E變換。E變換是一個(gè)擴(kuò)展變換,其過(guò)程是將32位的數(shù)據(jù)Ri-1變換成48位,變換規(guī)則如表6.5所示。</p><p> 第2步:異或變換。將E變換輸出的48位數(shù)據(jù)與48位的子密鑰Ki進(jìn)行異或運(yùn)算,得到48位的S盒數(shù)據(jù)。</p><p> 第3步:S盒變換。將48位的S盒數(shù)據(jù)均分為8部
12、分,每部分為6位,用8個(gè)S盒S1~S8表示。每個(gè)S盒的輸入為6位,變換后輸出為4位,即經(jīng)過(guò)8個(gè)S盒S1~S8變換后輸出為32位,如圖6.5所示。</p><p> S盒的變換規(guī)則:以S1盒為例,將6位輸入數(shù)據(jù)(a1a2a3a4a5a6)的中間4位(a2a3a4a5)對(duì)應(yīng)的數(shù)值作為列,兩端的2位(a1a6) 對(duì)應(yīng)的數(shù)值作為行,找到如表6.6所示的S1轉(zhuǎn)換表中相應(yīng)的位,得到的數(shù)值再轉(zhuǎn)換成二進(jìn)制形式的4位數(shù)據(jù),此即為
13、S1盒的輸出。</p><p> 第4步:P變換。P變換的過(guò)程是將S盒輸出的32位數(shù)據(jù)進(jìn)行位置變換得到一個(gè)新的32數(shù)據(jù)組,因此P變換為線性變換,其變換規(guī)則如表6.14所示。</p><p> 第5步:異或變換。P變換輸出的32位數(shù)據(jù)與32位的Li-1異或后輸出32位數(shù)據(jù),此數(shù)據(jù)就是Ri。當(dāng)i≤15時(shí),Ri與Li各32位數(shù)據(jù)將被用來(lái)進(jìn)行下一輪迭代變換。</p><p&
14、gt; ?、?逆初始置換(IP-1)</p><p> 將第16輪迭代變換的輸出R16與L16組合在一起構(gòu)成64位數(shù)據(jù)組,作為逆初始置換(IP-1)的輸入。逆初始置換的變換規(guī)則如表6.15所示,置換完成后的數(shù)據(jù)即為64位密文。</p><p> DES算法的解密過(guò)程</p><p> DES的解密算法與加密算法相同,解密密鑰也與加密密鑰相同,區(qū)別僅在于進(jìn)行16
15、輪迭代運(yùn)算時(shí)使用的子密鑰順序與加密時(shí)是相反的,即第1輪用子密鑰K16、第2輪用K15、…,最后一輪用子密鑰K1。</p><p> ?。?)DES算法的安全性</p><p> DES是世界上使用最為廣泛和流行的一種分組密碼算法,被公認(rèn)為世界上第一個(gè)實(shí)用的密碼算法標(biāo)準(zhǔn)。</p><p> DES的缺點(diǎn)是密鑰位數(shù)太短(56位),而且算法是對(duì)稱的,使得這些密鑰中還存
16、在一些弱密鑰和半弱密鑰,因此容易被采用窮盡密鑰方法解密</p><p> 由于DES算法完全公開(kāi),其安全性完全依賴于對(duì)密鑰的保護(hù),必須有可靠的信道來(lái)分發(fā)密鑰。</p><p> 三、DES對(duì)稱加密算法的實(shí)現(xiàn)</p><p> 1、C語(yǔ)言實(shí)現(xiàn)DES對(duì)稱加密算法過(guò)程分析</p><p><b> (1)初始置換</b>
17、;</p><p> //根據(jù)表格改變順序</p><p> void ChangeOrder (bit *origbin, bit *newbin, int *table, int num)</p><p><b> {</b></p><p><b> int i;</b></p&
18、gt;<p> bit temp[64];</p><p> for (i = 0; i < num; i++)</p><p><b> {</b></p><p> temp[i] = origbin[table[i] - 1];</p><p><b> }</b>
19、;</p><p> CopyBin(temp, newbin, num);</p><p><b> }</b></p><p><b> ?。?)子密鑰生成</b></p><p> void SetKeys(bit *origkey, bit keys[][48])</p>
20、<p><b> {</b></p><p><b> int i;</b></p><p> bit key64[64], key48[48], key56[56], lkey[28], rkey[28];</p><p> CopyBin(origkey, key64, 64);</p>
21、<p> ChangeOrder (key64, key56, PC1, 56);</p><p> //printf("PC1變換后的key:\n"); PrintBin (key56, 56, 7);</p><p> for (i = 0; i < 16; i++)</p><p><b> {<
22、/b></p><p> //PrintBin (key56, 56, 14);</p><p> SplitData(key56, lkey, rkey, 56);</p><p> LoopMove (lkey, MOVE[i]);</p><p> LoopMove (rkey, MOVE[i]);</p>
23、<p> //printf("C%d:\n", i); PrintBin (lkey, 28, 7);</p><p> //printf("D%d:\n", i); PrintBin (rkey, 28, 7);</p><p> MergeData(key56, lkey, rkey, 56);</p><p&
24、gt; //printf("C%d D%d:\n", i, i); PrintBin (key56, 56, 14);</p><p> ChangeOrder (key56, key48, PC2, 48);</p><p> CopyBin(key48, keys[i], 48);</p><p> //printf("%d
25、個(gè)密鑰:\n", i + 1); PrintBin (keys[i], 48, 12);</p><p><b> }</b></p><p><b> }</b></p><p><b> ?。?)異或運(yùn)算</b></p><p> void Xor(bit
26、*date1, bit *data2, int num)</p><p><b> {</b></p><p><b> int i;</b></p><p> for (i = 0; i < num; i++)</p><p><b> {</b></p&
27、gt;<p> data2[i] ^= date1[i];</p><p><b> }</b></p><p><b> }</b></p><p> ?。?)密鑰左移及S盒變換</p><p> void LoopMove (bit *key, int num)</p
28、><p><b> {</b></p><p> bit temp[28];</p><p> CopyBin(&key[num], temp, 28-num);</p><p> CopyBin(key, &temp[28-num], num);</p><p> Copy
29、Bin(temp, key, 28);</p><p><b> }</b></p><p> void SChange(bit *data48, bit *data32)</p><p><b> {</b></p><p><b> int i;</b></p
30、><p> bit r[2], c[4];</p><p> char er, ec;</p><p> for (i = 0; i < 8; i++)</p><p><b> {</b></p><p> int j = i * 6;</p><p> C
31、opyBin(&data48[j], r, 1);</p><p> CopyBin(&data48[j + 5], &r[1], 1);</p><p> CopyBin(&data48[j + 1], c, 4);</p><p> BinToDec(r, &er, 2);</p><p>
32、 BinToDec(c, &ec, 4);</p><p> DecToBin(S[i][er][ec], &data32[i * 4], 4);</p><p><b> }</b></p><p><b> }</b></p><p> (5)DES對(duì)稱加密算法加密解密&
33、lt;/p><p> //DES加密、解密</p><p> void DES(char *mykey, char *origdata, char *newdata, int type)</p><p><b> {</b></p><p> int len, i, j;</p><p>
34、bit data[64];//保存二進(jìn)制的數(shù)據(jù)</p><p> bit key[64];//保存二進(jìn)制密鑰</p><p> bit keys[16][48];//保持子密鑰</p><p> StrToBin (mykey, key, 64);</p><p> //printf("初始密碼:\n"); Pri
35、ntBin (key, 64, 8);</p><p> SetKeys(key, keys);</p><p> len = strlen(origdata);</p><p> for (i = 0, j = len; j >= 8; i++, j -= 8)</p><p><b> {</b><
36、;/p><p> StrToBin (&origdata[i * 8], data, 64);</p><p> DESBlock(keys, data, type);</p><p> BinToDec(data, &newdata[i * 8], 64);</p><p><b> }</b>&l
37、t;/p><p> //不滿8字節(jié)用0填充</p><p><b> if (j)</b></p><p><b> {</b></p><p> memset(data, 0, 64);</p><p> StrToBin (&origdata[i * 8],
38、 data, j * 8);</p><p> DESBlock(keys, data, type);</p><p> BinToDec(data, &newdata[i * 8], 64);</p><p><b> }</b></p><p> memset(&newdata[len % 8
39、 == 0 ? len : (len + 8 - len % 8)], 0, 1);</p><p><b> }</b></p><p><b> ?。?)運(yùn)行截圖</b></p><p><b> 加密</b></p><p><b> 解密</b&g
40、t;</p><p> 2、手工計(jì)算DES對(duì)稱加密算法過(guò)程分析</p><p> 明文:1107300420林志祥</p><p> 密鑰:19920324</p><p> ?。?)初始置換(IP)</p><p><b> 原數(shù)據(jù):</b></p><p>
41、 丨 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 0 丨</p><p> 丨 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 丨</p><p> 丨 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 丨</p><p> 丨 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 丨</p>
42、;<p><b> IP置換后的數(shù)據(jù):</b></p><p> 丨 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 丨</p><p> 丨 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 丨</p><p> 丨 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 丨<
43、/p><p> 丨 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 丨</p><p><b> ?。?)子密鑰生成</b></p><p><b> 1)根據(jù)PC1變換</b></p><p><b> 原密鑰:</b></p><p&g
44、t; 丨 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 丨</p><p> 丨 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 丨</p><p> 丨 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 丨</p><p> 丨 0 0 1 1 0 1 1 1 0 0 1 1 1 0 0 0 丨</p&
45、gt;<p> PC1變換后的密鑰:</p><p> 丨 0 0 0 0 0 0 0 0 0 0 0 0 0 0 丨</p><p> 丨 0 0 1 1 1 1 1 1 1 1 1 1 1 1 丨</p><p> 丨 0 1 1 0 0 1 1 0 0 1 1 1 1 0 丨</p><p> 丨 0 0 1 0
46、 0 0 0 0 0 0 1 1 1 1 丨</p><p> 2)PC2變換和子密鑰生成</p><p><b> C1和D1:</b></p><p> 丨 0 0 0 0 0 0 0 丨丨 1 1 0 0 1 1 0 丨</p><p> 丨 0 0 0 0 0 0 0 丨丨 0 1 1 1 1 0 0
47、 丨</p><p> 丨 0 1 1 1 1 1 1 丨丨 0 1 0 0 0 0 0 丨</p><p> 丨 1 1 1 1 1 1 0 丨丨 0 0 1 1 1 1 0 丨</p><p><b> K1:</b></p><p> 丨 0 1 0 1 0 0 0 0 0 0 1 0 丨</p&
48、gt;<p> 丨 1 1 0 0 1 0 1 0 1 1 0 0 丨</p><p> 丨 0 1 0 1 0 1 1 1 0 0 1 0 丨</p><p> 丨 1 0 1 0 1 1 0 0 0 0 1 0 丨</p><p><b> C2和D2:</b></p><p> 丨 0 0
49、0 0 0 0 0 丨丨 1 0 0 1 1 0 0 丨</p><p> 丨 0 0 0 0 0 0 0 丨丨 1 1 1 1 0 0 0 丨</p><p> 丨 1 1 1 1 1 1 1 丨丨 1 0 0 0 0 0 0 丨</p><p> 丨 1 1 1 1 1 0 0 丨丨 0 1 1 1 1 0 1 丨</p><p
50、><b> K15:</b></p><p> 丨 0 0 0 1 1 0 0 1 0 0 1 0 丨</p><p> 丨 1 1 0 0 1 0 0 0 1 1 0 0 丨</p><p> 丨 1 0 1 0 0 1 0 1 0 0 0 0 丨</p><p> 丨 0 0 1 1 0 0 1 1
51、0 1 1 1 丨</p><p><b> C16和D16:</b></p><p> 丨 0 0 0 0 0 0 0 丨丨 0 1 1 0 0 1 1 丨</p><p> 丨 0 0 0 0 0 0 0 丨丨 0 0 1 1 1 1 0 丨</p><p> 丨 0 0 1 1 1 1 1 丨丨 0
52、0 1 0 0 0 0 丨</p><p> 丨 1 1 1 1 1 1 1 丨丨 0 0 0 1 1 1 1 丨</p><p><b> K16:</b></p><p> 丨 0 1 0 1 0 0 0 1 0 0 1 0 丨</p><p> 丨 1 1 0 0 1 0 0 0 1 1 0 0 丨<
53、;/p><p> 丨 1 0 1 0 0 1 1 1 0 1 0 0 丨</p><p> 丨 0 0 1 1 1 1 0 0 0 0 0 0 丨</p><p><b> (3)乘積變換</b></p><p><b> 1)E變換</b></p><p><b&
54、gt; L0和R0:</b></p><p> 丨 0 0 1 1 1 1 1 0 丨丨 0 0 1 1 1 1 1 1 丨</p><p> 丨 1 1 1 1 0 1 0 1 丨丨 1 1 1 0 0 0 0 1 丨</p><p> 丨 0 0 0 1 0 1 0 0 丨丨 0 0 0 0 1 1 0 0 丨</p>&
55、lt;p> 丨 1 1 0 1 0 0 0 1 丨丨 0 0 1 0 0 1 1 1 丨</p><p> E變換后的右半部分?jǐn)?shù)據(jù)和密鑰K1:</p><p> 丨 1 0 0 1 1 1 1 1 1 1 1 1 丨丨 0 1 0 1 0 0 0 0 0 0 1 0 丨</p><p> 丨 1 1 1 1 0 0 0 0 0 0 1 0 丨丨
56、1 1 0 0 1 0 1 0 1 1 0 0 丨</p><p> 丨 1 0 0 0 0 1 0 1 1 0 0 0 丨丨 0 1 0 1 0 1 1 1 0 0 1 0 丨</p><p> 丨 0 0 0 1 0 0 0 0 1 1 1 0 丨丨 1 0 1 0 1 1 0 0 0 0 1 0 丨</p><p> 2)異或變換1及S盒變換<
57、/p><p> 兩者進(jìn)行異或運(yùn)算得:</p><p> 丨 1 1 0 0 1 1 1 1 1 1 0 1 丨</p><p> 丨 0 0 1 1 1 0 1 0 1 1 1 0 丨</p><p> 丨 1 1 0 1 0 0 1 0 1 0 1 0 丨</p><p> 丨 1 0 1 1 1 1 0 0
58、1 1 0 0 丨</p><p><b> S盒獲得的數(shù)值:</b></p><p> 11 14 5 13 12 8 7 11 </p><p> S盒變換后的右半部分?jǐn)?shù)據(jù):</p><p> 丨 1 0 1 1 1 1 1 0 丨</p><p>
59、; 丨 0 1 0 1 1 1 0 1 丨</p><p> 丨 1 1 0 0 1 0 0 0 丨</p><p> 丨 0 1 1 1 1 0 1 1 丨</p><p><b> 3)P變換</b></p><p> P變換后的右半部分?jǐn)?shù)據(jù)和左半部分的數(shù)據(jù):</p><p> 丨
60、 1 1 0 1 1 1 1 1 丨丨 0 0 1 1 1 1 1 0 丨</p><p> 丨 1 0 0 1 1 1 1 1 丨丨 1 1 1 1 0 1 0 1 丨</p><p> 丨 0 0 0 1 1 1 1 0 丨丨 0 0 0 1 0 1 0 0 丨</p><p> 丨 0 1 0 1 0 0 1 0 丨丨 1 1 0 1 0 0 0
61、 1 丨</p><p><b> 4)異或變換2</b></p><p><b> 兩者異或運(yùn)算得:</b></p><p> 丨 1 1 1 0 0 0 0 1 丨</p><p> 丨 0 1 1 0 1 0 1 0 丨</p><p> 丨 0 0 0 0
62、1 0 1 0 丨</p><p> 丨 1 0 0 0 0 0 1 1 丨</p><p><b> L1和R1:</b></p><p> 丨 0 0 1 1 1 1 1 1 丨丨 1 1 1 0 0 0 0 1 丨</p><p> 丨 1 1 1 0 0 0 0 1 丨丨 0 1 1 0 1 0 1
63、0 丨</p><p> 丨 0 0 0 0 1 1 0 0 丨丨 0 0 0 0 1 0 1 0 丨</p><p> 丨 0 0 1 0 0 1 1 1 丨丨 1 0 0 0 0 0 1 1 丨</p><p><b> 兩者異或運(yùn)算得:</b></p><p> 丨 1 1 0 0 1 0 0 1 丨&
64、lt;/p><p> 丨 1 0 0 0 0 0 0 0 丨</p><p> 丨 1 0 0 1 0 1 0 1 丨</p><p> 丨 0 1 1 0 1 1 1 0 丨</p><p><b> L16和R16:</b></p><p> 丨 1 1 0 1 1 1 1 1 丨丨
65、1 1 0 0 1 0 0 1 丨</p><p> 丨 1 1 1 0 1 0 1 1 丨丨 1 0 0 0 0 0 0 0 丨</p><p> 丨 1 0 1 0 0 1 0 0 丨丨 1 0 0 1 0 1 0 1 丨</p><p> 丨 1 1 1 0 0 1 0 0 丨丨 0 1 1 0 1 1 1 0 丨</p><p
66、><b> 乘積變換后的數(shù)據(jù):</b></p><p> 丨 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 丨</p><p> 丨 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 丨</p><p> 丨 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 丨</p>
67、<p> 丨 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 丨</p><p><b> ?。?)初始置換</b></p><p> 逆初始置換表后的數(shù)據(jù):</p><p> 丨 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 丨</p><p> 丨 1 0 0 0
68、1 1 1 1 1 1 1 0 0 0 0 1 丨</p><p> 丨 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 丨</p><p> 丨 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 丨</p><p> DES對(duì)稱加密算法解密算法與加密算法相同,同上可解密。</p><p><b>
69、; 三、總結(jié)</b></p><p> DES算法是明文分組為64位,有效密鑰56位,輸出密文64位的,具有16輪迭代的分組對(duì)稱密碼算法。通過(guò)學(xué)習(xí)此算法,了解到了許多函數(shù),其中有密鑰生成函數(shù),加密函數(shù),解密函數(shù),測(cè)試函數(shù)以及密鑰長(zhǎng)度檢驗(yàn)函數(shù)等。</p><p><b> 四、源代碼</b></p><p> 附:#inclu
70、de<stdio.h></p><p> #include<stdlib.h></p><p> #include<string.h></p><p> #include "table.h"</p><p> #define bitbool</p><p
71、> #define MAX_SIZE1000</p><p> #define ENCRYPT0</p><p> #define DECODE1</p><p> void StrToBin(char *str, bit *bin, int num)</p><p><b> {</b><
72、;/p><p><b> int i;</b></p><p> for (i = 0; i < num; i++)</p><p><b> {</b></p><p> bin[i] = (str[i / 8] >> (7 - i % 8)) & 1;</p&
73、gt;<p><b> }</b></p><p><b> }</b></p><p> void DecToBin(int dec, bit *bin, int num)</p><p><b> {</b></p><p><b> in
74、t i;</b></p><p> for (i = 0; num > 0; i++, num--)</p><p><b> {</b></p><p> bin[i] = dec >> (num - 1) & 1;</p><p><b> }</b>
75、;</p><p><b> }</b></p><p> void BinToDec(bit *bin, char *dec, int num)</p><p><b> {</b></p><p> int count, res, i;</p><p> for
76、(count = 0; num > 0; count++, num -= 8)</p><p><b> {</b></p><p> dec[count] = 0;</p><p> res = num < 8 ? num : 8;</p><p> for (i = res; i > 0 ;
77、 i--)</p><p><b> {</b></p><p> dec[count] |= bin[count * 8 + res - i] << (i - 1);</p><p><b> }</b></p><p><b> }</b></p&
78、gt;<p><b> }</b></p><p> void CopyBin(bit *origbin, bit *newbin, int num)</p><p><b> {</b></p><p><b> int i;</b></p><p>
79、 for (i = 0; i < num; i++)</p><p><b> {</b></p><p> newbin[i] = origbin[i];</p><p><b> }</b></p><p><b> }</b></p><
80、p> void PrintBin (bit *bin, int num, int count)</p><p><b> {</b></p><p><b> int i;</b></p><p> for (i = 0; i < num; i++)</p><p><b&
81、gt; {</b></p><p> if(i % count == 0) printf("丨 ");</p><p> printf("%-2d", bin[i]);</p><p> if((i + 1) % count == 0) printf("丨\n");</p>
82、<p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> void PrintInfo (int num ,bit *ldata, bit *rdata, bit *subkey)</p><
83、;p><b> {</b></p><p><b> int i, j;</b></p><p> printf(" L%d:\t\t\t R%d:\t\t\t K%d:\n", num, num, num);</p><p> for (i = 0; i < 4; i++)<
84、/p><p><b> {</b></p><p> printf ("丨 ");</p><p> for (j = 0; j < 8; j++)</p><p><b> {</b></p><p> printf("%-2d&q
85、uot;, ldata[i * 8 + j]);</p><p><b> }</b></p><p> printf("丨\t丨 ");</p><p> for (j = 0; j < 8; j++)</p><p><b> {</b></p>
86、<p> printf("%-2d", rdata[i * 8 + j]);</p><p><b> }</b></p><p> printf("丨\t丨 ");</p><p> for (j = 0; j < 12; j++)</p><p><
87、;b> {</b></p><p> printf("%-2d", subkey[i * 12 + j]);</p><p><b> }</b></p><p> printf("丨\n");</p><p><b> }</b>
88、</p><p> printf("\n");</p><p><b> }</b></p><p> void ChangeOrder (bit *origbin, bit *newbin, int *table, int num)</p><p><b> {</b>
89、</p><p><b> int i;</b></p><p> bit temp[64];</p><p> for (i = 0; i < num; i++)</p><p><b> {</b></p><p> temp[i] = origbin[t
90、able[i] - 1];</p><p><b> }</b></p><p> CopyBin(temp, newbin, num);</p><p><b> }</b></p><p> void SplitData (bit *data, bit *ldata, bit *rdat
91、a, int num)</p><p><b> {</b></p><p> CopyBin(data, ldata, num / 2);</p><p> CopyBin(&data[num / 2], rdata, num / 2);</p><p><b> }</b><
92、;/p><p> void MergeData(bit *data, bit *ldata, bit *rdata, int num)</p><p><b> {</b></p><p> CopyBin(ldata, data, num / 2);</p><p> CopyBin(rdata, &dat
93、a[num / 2], num / 2);</p><p><b> }</b></p><p> void Xor(bit *date1, bit *data2, int num)</p><p><b> {</b></p><p><b> int i;</b>&
94、lt;/p><p> for (i = 0; i < num; i++)</p><p><b> {</b></p><p> data2[i] ^= date1[i];</p><p><b> }</b></p><p><b> }</b&
95、gt;</p><p> void LoopMove (bit *key, int num)</p><p><b> {</b></p><p> bit temp[28];</p><p> CopyBin(&key[num], temp, 28-num);</p><p>
96、 CopyBin(key, &temp[28-num], num);</p><p> CopyBin(temp, key, 28);</p><p><b> }</b></p><p> void SChange(bit *data48, bit *data32)</p><p><b>
97、{</b></p><p><b> int i;</b></p><p> bit r[2], c[4];</p><p> char er, ec;</p><p> for (i = 0; i < 8; i++)</p><p><b> {</b
98、></p><p> int j = i * 6;</p><p> CopyBin(&data48[j], r, 1);</p><p> CopyBin(&data48[j + 5], &r[1], 1);</p><p> CopyBin(&data48[j + 1], c, 4);<
99、/p><p> BinToDec(r, &er, 2);</p><p> BinToDec(c, &ec, 4);</p><p> DecToBin(S[i][er][ec], &data32[i * 4], 4);</p><p><b> }</b></p><p&
100、gt;<b> }</b></p><p> void SetKeys(bit *origkey, bit keys[][48])</p><p><b> {</b></p><p><b> int i;</b></p><p> bit key64[64], k
101、ey48[48], key56[56], lkey[28], rkey[28];</p><p> CopyBin(origkey, key64, 64);</p><p> ChangeOrder (key64, key56, PC1, 56);</p><p> for (i = 0; i < 16; i++)</p><p>
102、;<b> {</b></p><p> SplitData(key56, lkey, rkey, 56);</p><p> LoopMove (lkey, MOVE[i]);</p><p> LoopMove (rkey, MOVE[i]);</p><p> MergeData(key56, lkey,
103、 rkey, 56);</p><p> ChangeOrder (key56, key48, PC2, 48);</p><p> CopyBin(key48, keys[i], 48);</p><p><b> }</b></p><p><b> }</b></p>&
104、lt;p> void DESBlock (bit keys[][48], bit *data, int type)</p><p><b> {</b></p><p><b> int i;</b></p><p> bit ldata[32], rdata[32], data48[48], data32[
105、32];</p><p> SplitData(data, ldata, rdata, 64);</p><p> for (i = 0; i < 16; i++)</p><p><b> {</b></p><p> CopyBin (rdata, data32, 32);</p><
106、;p> ChangeOrder (rdata, data48, E, 48);</p><p> if (type == ENCRYPT) Xor (keys[i], data48, 48);</p><p> else Xor (keys[15 - i], data48, 48);</p><p> SChange (data48, rdata);&
107、lt;/p><p> ChangeOrder (rdata, rdata, P, 32);</p><p> Xor (ldata, rdata, 32);</p><p> CopyBin (data32, ldata, 32);</p><p><b> }</b></p><p> M
108、ergeData(data, rdata, ldata, 64);</p><p> ChangeOrder(data, data, FP, 64);</p><p> PrintBin (data, 64, 8);</p><p><b> }</b></p><p> void DES(char *mykey
109、, char *origdata, char *newdata, int type)</p><p><b> {</b></p><p> int len, i, j;</p><p> bit data[64];</p><p> bit key[64];</p><p> bit
110、keys[16][48];</p><p> StrToBin (mykey, key, 64);</p><p> SetKeys(key, keys);</p><p> len = strlen(origdata);</p><p> for (i = 0, j = len; j >= 8; i++, j -= 8)<
111、;/p><p><b> {</b></p><p> StrToBin (&origdata[i * 8], data, 64);</p><p> DESBlock(keys, data, type);</p><p> BinToDec(data, &newdata[i * 8], 64);&l
112、t;/p><p><b> }</b></p><p><b> if (j)</b></p><p><b> {</b></p><p> memset(data, 0, 64);</p><p> StrToBin (&origdat
113、a[i * 8], data, j * 8);</p><p> DESBlock(keys, data, type);</p><p> BinToDec(data, &newdata[i * 8], 64);</p><p><b> }</b></p><p> memset(&newdat
114、a[len % 8 == 0 ? len : (len + 8 - len % 8)], 0, 1);</p><p><b> }</b></p><p> int main ()</p><p><b> {</b></p><p> char mydata[MAX_SIZE];<
115、/p><p> char mykey[MAX_SIZE];</p><p> char cipher[MAX_SIZE];</p><p> char decipher[MAX_SIZE];</p><p><b> while (1)</b></p><p><b> {<
116、/b></p><p> system("CLS");</p><p> printf ("\n");</p><p> printf ("DES加密\n");</p><p> printf ("\n");</p><p>
117、 printf ("明文:");</p><p> fflush(stdin);</p><p> scanf ("%s", mydata);</p><p><b> do{</b></p><p> printf ("密鑰:");</p>
118、;<p> fflush(stdin);</p><p> scanf ("%s", mykey);</p><p> }while (strlen(mykey) != 8);</p><p> DES (mykey, mydata, cipher, ENCRYPT);</p><p> print
119、f ("密文:%s\n\n",cipher);</p><p> system("pause");</p><p> printf ("\n");</p><p> printf ("\n");</p><p> printf ("DES解密\n
120、");</p><p> printf ("\n");</p><p><b> do{</b></p><p> printf ("密鑰:");</p><p> fflush(stdin);</p><p> scanf ("
121、;%s", mykey);</p><p> }while (strlen(mykey) != 8);</p><p> DES (mykey, cipher, decipher, DECODE);</p><p> printf ("解密:%s\n\n",decipher);</p><p> syst
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)---基于des加密的聊天程序
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)方案
- 校園網(wǎng)絡(luò)安全課程設(shè)計(jì)
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)--基于認(rèn)證的攻擊設(shè)計(jì)報(bào)告
- 信息安全概論--網(wǎng)絡(luò)安全的發(fā)展課程設(shè)計(jì)
- des算法課程設(shè)計(jì)
- 基于dsp的網(wǎng)絡(luò)安全視頻監(jiān)視系統(tǒng)的課程設(shè)計(jì)報(bào)告
- 基于校園網(wǎng)網(wǎng)絡(luò)安全管理與維護(hù)課程設(shè)計(jì)報(bào)告
- des算法實(shí)現(xiàn)-課程設(shè)計(jì)
- 網(wǎng)絡(luò)安全協(xié)議課程設(shè)計(jì)--ssl協(xié)議的安全性研究
- 校園網(wǎng)絡(luò)安全的管理與應(yīng)用課程設(shè)計(jì)論文
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)----某中小企業(yè)網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì)
- 《網(wǎng)絡(luò)安全》課程設(shè)計(jì)--arp地址欺騙與icmp重定向設(shè)計(jì)
- 網(wǎng)絡(luò)攻擊與防御課程設(shè)計(jì)-網(wǎng)絡(luò)安全整體規(guī)劃與實(shí)現(xiàn)
- 網(wǎng)絡(luò)安全協(xié)議課程設(shè)計(jì)-對(duì)ipsec協(xié)議的分析與優(yōu)化
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)--銀行辦公局域網(wǎng)辦公攻擊方案
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)---rc4加密算法的實(shí)現(xiàn)
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)--rc4加密算法的實(shí)現(xiàn)
- 學(xué)校網(wǎng)絡(luò)設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)安全課程設(shè)計(jì)-- web服務(wù)器的安全配置
聯(lián)系客服
本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知眾賞文庫(kù),我們立即給予刪除!
- 備案號(hào): 經(jīng)營(yíng)許可證編號(hào):浙ICP備20018660號(hào)
-
Copyright ? 2013-2023 眾賞文庫(kù)版權(quán)所有 違法與不良信息舉報(bào)電話:15067167862
評(píng)論
0/150
提交評(píng)論