2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  網絡安全</b></p><p>  課 程 設 計 報 告</p><p><b>  DES源代碼分析</b></p><p>  一、DES對稱加密算法簡介</p><p>  最著名的保密密鑰或對稱密鑰加密算法DES(Data Encryption Standa

2、rd)是由IBM公司在70年代發(fā)展起來的,并經過政府的加密標準篩選后,于1976年11月被美國政府采用,DES隨后被美國國家標準局和美國國家標準協(xié)會(American National Standard Institute, ANSI) 承認。</p><p>  DES使用56位密鑰對64位的數據塊進行加密,并對64位的數據塊進行16輪編碼。與每輪編碼時,一個48位的“每輪”密鑰值由56位的完整密鑰得出來。DE

3、S用軟件進行解碼需要用很長時間,而用硬件解碼速度非???,但幸運的是當時大多數黑客并沒有足夠的設備制造出這種硬件設備。在1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用于DES的解密,而且需要12個小時的破解才能得到結果。所以,當時DES被認為是一種十分強壯的加密方法。</p><p>  二、DES對稱加密算法分析</p><p> ?。?)DES算法原理</p>

4、<p>  在DES算法中有Data、Key、Mode三個參數。其中Data代表需要加密或解密的數據,由8字節(jié)64位組成;Key代表加密或解密的密鑰,也由8字節(jié)64位組成;Mode代表加密或解密的狀態(tài)。</p><p>  在DES算法中加密和解密的原理是一樣的,只是因為Mode的狀態(tài)不同,適用密鑰的順序不同而已。</p><p> ?。?)DES算法的加密過程</p&g

5、t;<p>  DES算法的加密過程如圖6.2所示。</p><p>  初始置換(Initial Permutation,IP)是對輸入的64位數據按照規(guī)定的矩陣改變數據位的排列順序的換位變換,此過程與密鑰無關。</p><p>  子密鑰生成是由64位外部輸入密鑰通過置換和移位操作生成加密和解密所需的16組(每組56位)子密鑰的過程。</p><p&g

6、t;  乘積變換過程非常復雜,是加密過程的關鍵。該過程通過16輪重復的替代、移位、異或和置換操作打亂原輸入數據。</p><p>  逆初始置換(IP-1)與初始置換過程相同,只是置換矩陣是初始置換的逆矩陣。</p><p>  ① 初始置換(IP)</p><p>  將64位明文按照初始置換表(如表6.1)的規(guī)則進行置換。其置換過程為:將輸入明文的第58位置換到

7、第1位,第50位置換到第2位,第12位置換到第3位,依此類推,……,最后第7位置換到第64位。</p><p><b>  ② 子密鑰生成</b></p><p>  輸入的密鑰K是64位數據,但其中第8、16、24、32、40、48、56、64位用于奇偶校驗,實際使用的密鑰位只有56位。子密鑰Ki的生成流程如圖6.3所示。</p><p> 

8、 第1步:PC1變換。將56位密鑰按置換選擇1(PC-1)的規(guī)律(見表6.2)進行置換,變換后分為左右兩路(C0、D0)各28位。</p><p>  第2步:數據左移。將兩個28位的C0和D0按表6.3的規(guī)則進行循環(huán)左移。表6.3中第1行表示迭代輪次,第2行表示左移的位數。左移的規(guī)律是將C0和D0所有的位按表中規(guī)定的位數循環(huán)左移。</p><p>  第3步:PC2變換和子密鑰生成。C0

9、和D0左移1位后得到C1和D1 ,再將C1和D1數據組合后(56位)按照PC2變換的要求變換得到48位的子密鑰K1,在進行第1輪迭代時使用K1;同理,將C1和D1左移1位得到C2和D2,再將C2和D2數據組合后按照PC2變換的要求變換得到48位的子密鑰K2;……;依此類推,就可以得到K3、K4…..K16。PC2變換如表6.4所示。PC2變換是將輸入的56位數據變換為48位輸出,該變換是一種壓縮變換。</p><p&

10、gt;  根據不同輪數分別進行左移和壓縮變換,分別得到16個48位的子密鑰K1, K2,…, K16。</p><p><b> ?、?乘積變換</b></p><p>  初始置換后的數據分為各32位的兩部分,左部分為L0,右部分為R0,這樣,L0 = D58D50D12….D8,R0 = D57D49D41…D7。乘積變換過程就是將L0和R0按照乘積變換運算公式進

11、行迭代運算,最后得出L16和R16。如圖6.4所示。</p><p>  第1步:E變換。E變換是一個擴展變換,其過程是將32位的數據Ri-1變換成48位,變換規(guī)則如表6.5所示。</p><p>  第2步:異或變換。將E變換輸出的48位數據與48位的子密鑰Ki進行異或運算,得到48位的S盒數據。</p><p>  第3步:S盒變換。將48位的S盒數據均分為8部

12、分,每部分為6位,用8個S盒S1~S8表示。每個S盒的輸入為6位,變換后輸出為4位,即經過8個S盒S1~S8變換后輸出為32位,如圖6.5所示。</p><p>  S盒的變換規(guī)則:以S1盒為例,將6位輸入數據(a1a2a3a4a5a6)的中間4位(a2a3a4a5)對應的數值作為列,兩端的2位(a1a6) 對應的數值作為行,找到如表6.6所示的S1轉換表中相應的位,得到的數值再轉換成二進制形式的4位數據,此即為

13、S1盒的輸出。</p><p>  第4步:P變換。P變換的過程是將S盒輸出的32位數據進行位置變換得到一個新的32數據組,因此P變換為線性變換,其變換規(guī)則如表6.14所示。</p><p>  第5步:異或變換。P變換輸出的32位數據與32位的Li-1異或后輸出32位數據,此數據就是Ri。當i≤15時,Ri與Li各32位數據將被用來進行下一輪迭代變換。</p><p&

14、gt; ?、?逆初始置換(IP-1)</p><p>  將第16輪迭代變換的輸出R16與L16組合在一起構成64位數據組,作為逆初始置換(IP-1)的輸入。逆初始置換的變換規(guī)則如表6.15所示,置換完成后的數據即為64位密文。</p><p>  DES算法的解密過程</p><p>  DES的解密算法與加密算法相同,解密密鑰也與加密密鑰相同,區(qū)別僅在于進行16

15、輪迭代運算時使用的子密鑰順序與加密時是相反的,即第1輪用子密鑰K16、第2輪用K15、…,最后一輪用子密鑰K1。</p><p> ?。?)DES算法的安全性</p><p>  DES是世界上使用最為廣泛和流行的一種分組密碼算法,被公認為世界上第一個實用的密碼算法標準。</p><p>  DES的缺點是密鑰位數太短(56位),而且算法是對稱的,使得這些密鑰中還存

16、在一些弱密鑰和半弱密鑰,因此容易被采用窮盡密鑰方法解密</p><p>  由于DES算法完全公開,其安全性完全依賴于對密鑰的保護,必須有可靠的信道來分發(fā)密鑰。</p><p>  三、DES對稱加密算法的實現</p><p>  1、C語言實現DES對稱加密算法過程分析</p><p><b> ?。?)初始置換</b>

17、;</p><p>  //根據表格改變順序</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>  (2)子密鑰生成</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、個密鑰:\n", i + 1); PrintBin (keys[i], 48, 12);</p><p><b>  }</b></p><p><b>  }</b></p><p><b> ?。?)異或運算</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>  (4)密鑰左移及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對稱加密算法加密解密&

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];//保存二進制的數據</p><p>  bit key[64];//保存二進制密鑰</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>  (4)運行截圖</b></p><p><b>  加密</b></p><p><b>  解密</b&g

40、t;</p><p>  2、手工計算DES對稱加密算法過程分析</p><p>  明文:1107300420林志祥</p><p>  密鑰:19920324</p><p> ?。?)初始置換(IP)</p><p><b>  原數據:</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置換后的數據:</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)根據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> ?。?)乘積變換</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變換后的右半部分數據和密鑰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>  兩者進行異或運算得:</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盒獲得的數值:</b></p><p>  11 14 5 13 12 8 7 11 </p><p>  S盒變換后的右半部分數據:</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變換后的右半部分數據和左半部分的數據:</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>  兩者異或運算得:</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>  兩者異或運算得:</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>  乘積變換后的數據:</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>  逆初始置換表后的數據:</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對稱加密算法解密算法與加密算法相同,同上可解密。</p><p><b>

69、;  三、總結</b></p><p>  DES算法是明文分組為64位,有效密鑰56位,輸出密文64位的,具有16輪迭代的分組對稱密碼算法。通過學習此算法,了解到了許多函數,其中有密鑰生成函數,加密函數,解密函數,測試函數以及密鑰長度檢驗函數等。</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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論