des課程設(shè)計(jì)報(bào)告--網(wǎng)絡(luò)安全_第1頁(yè)
已閱讀1頁(yè),還剩19頁(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、<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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論