密碼學(xué)課程設(shè)計(jì)報(bào)告_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  密碼學(xué)課程設(shè)計(jì)</b></p><p>  班級(jí): </p><p>  成員姓名: </p><p>  指導(dǎo)教師: </p><p><b&g

2、t;  2011.7</b></p><p><b>  目錄</b></p><p><b>  密碼學(xué)課程設(shè)計(jì)1</b></p><p>  1.實(shí)驗(yàn)一 實(shí)現(xiàn)一個(gè)多表古典加密和解密程序1</p><p><b>  1.1實(shí)驗(yàn)?zāi)康?</b></p&g

3、t;<p><b>  1.2實(shí)驗(yàn)要求1</b></p><p><b>  1.3實(shí)驗(yàn)內(nèi)容1</b></p><p>  1.4古典加密方法1</p><p>  1.5 程序代碼1</p><p>  1.6 結(jié)果分析3</p><p>  1.7

4、 實(shí)驗(yàn)總結(jié)3</p><p>  2.實(shí)驗(yàn)二 DES算法的實(shí)現(xiàn)4</p><p><b>  2.1實(shí)驗(yàn)?zāi)康?</b></p><p><b>  2.3實(shí)驗(yàn)內(nèi)容4</b></p><p>  2.4 DES對稱加密算法4</p><p>  2.5 程序代碼6&

5、lt;/p><p><b>  2.6結(jié)果分析8</b></p><p><b>  2.7實(shí)驗(yàn)總結(jié)8</b></p><p>  3.實(shí)驗(yàn)三 實(shí)現(xiàn)一個(gè)大素?cái)?shù)生成算法9</p><p><b>  3.1實(shí)驗(yàn)?zāi)康?</b></p><p><b

6、>  3.2實(shí)驗(yàn)要求9</b></p><p><b>  3.3實(shí)驗(yàn)內(nèi)容9</b></p><p>  3.4 Miller-Rabin素性測試法9</p><p>  3.5 程序代碼10</p><p>  3.6 結(jié)果分析10</p><p>  3.7 實(shí)驗(yàn)總

7、結(jié)11</p><p><b>  4. 結(jié)束語11</b></p><p>  1.實(shí)驗(yàn)一 實(shí)現(xiàn)一個(gè)多表古典加密和解密程序</p><p><b>  1.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  掌握多表古典加密方法。</p><p><b>  1.2實(shí)驗(yàn)要

8、求</b></p><p>  能用高級(jí)語言實(shí)現(xiàn)古典加密方法。</p><p><b>  1.3實(shí)驗(yàn)內(nèi)容</b></p><p>  多表古典加密方法主要有Playfair體制、Vigenere體制、Beaufor體制、Vernam體制和Hill體制,用高級(jí)語言實(shí)現(xiàn)其中一種體制的加密和解密算法。</p><p&

9、gt;<b>  1.4古典加密方法</b></p><p>  古典加密方法分為單表加密和多表加密。古典密碼編碼方法有置換,代替,加法 。把明文中的字母重新排列,字母本身不變,但其位置改變了,這樣編成的密碼稱為置換密碼?! ?lt;/p><p>  最簡單的置換密碼是把明文中的字母順序倒過來,然后截成固定長度的字母組作為密文。 乘積和迭代是多種加密方法混合使用,對一個(gè)加

10、密函數(shù)多次迭代。 </p><p>  單表代替密碼的安全性不高,一個(gè)原因是一個(gè)明文字母只由一個(gè)密文字母代替。構(gòu)造多個(gè)密文字母表,在密鑰的控制下用相應(yīng)密文字母表中的一個(gè)字母來代替明文字母表中的一個(gè)字母。一個(gè)明文字母有多種代替。 所以本次試驗(yàn)我選擇做的就是 Vernam密碼。</p><p><b>  1.5 程序代碼</b></p>&l

11、t;p>  #include <iostream></p><p>  #include <string></p><p>  #include <vector></p><p>  using namespace std;</p><p>  int main()</p><p&

12、gt;<b>  {</b></p><p>  string plain,ciper,key; </p><p>  int len; //長度三者一致 </p><p>  void change(string &, vector<int>&);//字符變數(shù)字</p&g

13、t;<p>  vector<int> encrypt_compute(vector<int> m,vector<int> k);//加密計(jì)算</p><p>  vector<int> discrypt_compute(vector<int> c,vector<int> k);//解密計(jì)算</p><p&g

14、t;  void re_change( vector<int>&,string &);//數(shù)字變字符</p><p>  cout<<"歡迎使用Vernam加解密:"<<endl;</p><p>  cout<<"====================="<<endl;&

15、lt;/p><p>  int flag; //操作標(biāo)記</p><p><b>  do</b></p><p><b>  {</b></p><p>  cout<<"請選擇操作:1、加密 2、解密 3、結(jié)束:"<<endl;</p>

16、<p>  cin>>flag;</p><p>  if(flag==1)</p><p><b>  {</b></p><p>  cout<<"請輸入明文:";</p><p>  cin>>plain;</p><p>

17、  cout<<"請輸入相同長度的密鑰:";</p><p><b>  cin>>key;</b></p><p>  len = plain.size(); </p><p>  vector<int> p,c,k; //存變換的數(shù)字</p><p>  c

18、hange(plain, p); </p><p>  change(key, k); //字母->數(shù)字</p><p>  c = encrypt_compute(p,k);</p><p>  re_change(c,ciper); //數(shù)字->字母</p><p>  cout<<"密文是

19、:"<<ciper<<endl;</p><p><b>  }</b></p><p>  if(flag==2)</p><p><b>  {</b></p><p>  cout<<"請輸入密文:";</p>&

20、lt;p>  cin>>ciper;</p><p>  cout<<"請輸入相同長度的密鑰:";</p><p><b>  cin>>key;</b></p><p>  len = ciper.size(); </p><p>  vector<i

21、nt> p,c,k; //存變換的數(shù)字</p><p>  change(ciper, c); </p><p>  change(key, k); //字母->數(shù)字</p><p>  p = discrypt_compute(c,k);</p><p>  plain="";//清空明文原來

22、的值</p><p>  re_change(p,plain);</p><p>  cout<<"明文是:"<<plain<<endl;</p><p><b>  }</b></p><p>  }while(flag!=3);</p><p

23、><b>  return 0;</b></p><p><b>  }</b></p><p>  void change(string &plain, vector<int>&number) //字母變數(shù)字</p><p><b>  {</b></p&

24、gt;<p>  for (unsigned int i=0;i<plain.size();i++)</p><p><b>  {</b></p><p>  number.push_back(plain[i]-97); //a為0</p><p><b>  }</b></p>&

25、lt;p><b>  }</b></p><p>  vector<int> encrypt_compute(vector<int> m,vector<int> k) //加密計(jì)算</p><p><b>  {</b></p><p>  vector<int> s

26、um;</p><p>  for(unsigned int i=0; i<m.size(); i++)</p><p><b>  {</b></p><p>  sum.push_back((m[i]+k[i])%26);</p><p><b>  }</b></p>&l

27、t;p>  return sum;</p><p><b>  }</b></p><p>  vector<int> discrypt_compute(vector<int> c,vector<int> k) //解密計(jì)算</p><p><b>  {</b></p>

28、;<p>  vector<int> resum;</p><p><b>  int temp;</b></p><p>  for(unsigned int i=0; i<c.size(); i++)</p><p><b>  {</b></p><p>  t

29、emp = c[i]-k[i];</p><p>  if(temp<0) temp+=26;</p><p>  resum.push_back(temp);</p><p><b>  }</b></p><p>  return resum;</p><p><b>  }&

30、lt;/b></p><p>  void re_change( vector<int>& sum,string &c) //數(shù)字變字符</p><p><b>  {</b></p><p>  string temp;//用于處理insert函數(shù)變量傳遞</p><p>  fo

31、r (unsigned int i=0;i<sum.size();i++)</p><p><b>  {</b></p><p>  temp=sum[i]+97;</p><p>  c.insert(i,temp);//a為0</p><p><b>  }</b></p>

32、<p><b>  }</b></p><p><b>  1.6 結(jié)果分析</b></p><p>  首先在程序執(zhí)行時(shí)的提示下,輸入密鑰,接下來輸入要加密明文,程序執(zhí)行,可以產(chǎn)生加密后的密文,并自動(dòng)解密出原來的明文。順利執(zhí)行加密和解密過程。</p><p><b>  1.7 實(shí)驗(yàn)總結(jié)</b

33、></p><p>  古典多表密碼有多種體質(zhì),這次試驗(yàn)我選擇的是Vernam體制。經(jīng)過對加密算法的實(shí)現(xiàn),我對古典加密算法的模式,過程和原理有了更深入的了解。</p><p>  多表古典密碼通過構(gòu)造多個(gè)對應(yīng)明文的密文字母表,在密鑰的控制下使用相應(yīng)的密文字母表中的某個(gè)字母來代替明文字母表中的一個(gè)字母。達(dá)到隱藏明文的目的。解密的時(shí)候?qū)@個(gè)過程進(jìn)行逆操作,得到明文。一個(gè)明文字母有多種代替

34、。而Vernam密碼就是著名的多表代替密碼。</p><p>  2.實(shí)驗(yàn)二 DES算法的實(shí)現(xiàn)</p><p><b>  2.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  握分組加密算法的設(shè)計(jì)與實(shí)現(xiàn)方法。</p><p><b>  2.2實(shí)驗(yàn)要求 </b></p><p>  

35、用高級(jí)語言實(shí)現(xiàn)實(shí)現(xiàn)DES加密和解密算法。</p><p><b>  2.3實(shí)驗(yàn)內(nèi)容</b></p><p>  DES是由初始變換、乘積變換和逆初始變換構(gòu)成,乘積變換是DES算法的核心。首先用代碼實(shí)現(xiàn)這幾個(gè)變換,然后組合成DES加密算法。由于DES解密算法與加密算法相同只是子密鑰使用次序不同,因此可簡單地由加密算法實(shí)現(xiàn)解密算法。</p><p&g

36、t;  2.4 DES對稱加密算法</p><p>  對稱加密算法有時(shí)又叫做傳統(tǒng)密碼算法,加密密鑰可以從解密密鑰中推導(dǎo)出來,解密密鑰也可以從加密密鑰中推導(dǎo)出來。在大多數(shù)的對稱算法中,加密密鑰和解密密鑰是相同的,因此也成為秘密密鑰算法或者單密鑰算法。它要求發(fā)送發(fā)和接收方在安全通信之前先商定一個(gè)密鑰。對稱算法的安全性依賴于密鑰,所以密鑰的保密性對通信至關(guān)重要。對稱加密算法主要有分組加密和流加密兩類。分組加密是指將明

37、文分成固定商都的組,用同一密鑰分別對每一組加密,輸出固定長度的密文,典型代表:DES、3DES、IDEA。</p><p><b>  DES的加密流程:</b></p><p>  DES的加密過程可分為加密處理,加密變換和子密鑰生成幾個(gè)部分組成。 </p><p><b>  1.加密處理過程 </b></p&g

38、t;<p>  (1)初始變換。加密處理首先要對64位的明文按表1所示的初始換位表IP進(jìn)行變換。表中的數(shù)值表示輸入位被置換后的新位置。例如輸入的第58位,在輸出的時(shí)候被置換到第1位;輸入的是第7位,在輸出時(shí)被置換到第64位。</p><p>  (2)加密處理。上述換位處理的輸出,中間要經(jīng)過16輪加密變換。初始換位的64位的輸出作為下一次的輸入,將64位分為左、右兩個(gè)32位,分別記為L0和R0,從L

39、0、R0到L16、R16,共進(jìn)行16輪加密變換。其中,經(jīng)過n輪處理后的點(diǎn)左右32位分別為Ln和Rn,則可做如下定義: </p><p><b>  Ln=Rn-1 </b></p><p><b>  Rn=Ln-1 </b></p><p>  其中,kn是向第n輪輸入的48位的子密鑰,Ln-1和Rn-1分別是第n-1輪

40、的輸出,f是Mangler函數(shù)。 </p><p>  (3)最后換位。進(jìn)行16輪的加密變換之后,將L16和R16合成64位的數(shù)據(jù),再按照表2所示的最后換位表進(jìn)行IP-1的換位,得到64位的密文,這就是DES算法加密的結(jié)果。</p><p><b>  2.加密變換過程 </b></p><p>  通過重復(fù)某些位將32位的右半部分按照擴(kuò)展表3

41、擴(kuò)展換位表擴(kuò)展為48位,而56位的密鑰先移位然后通過選擇其中的某些位減少至48位,48位的右半部分通過異或操作和48位的密鑰結(jié)合,并分成6位的8個(gè)分組,通過8個(gè)S-盒將這48位替代成新的32位數(shù)據(jù),再將其置換一次。這些S-盒輸入6位,輸出4位。</p><p>  3.子密鑰生成過程 </p><p>  鑰通常表示為64位的自然數(shù),首先通過壓縮換位PC-1去掉每個(gè)字節(jié)的第8位,用作奇偶校

42、驗(yàn),因此,密鑰去掉第8、16、24……64位減至56位,所以實(shí)際密鑰長度為56位,而每輪要生成48位的子密鑰。 </p><p><b>  4.解密處理過程 </b></p><p>  從密文到明文的解密過程可采用與加密完全相同的算法。不過解密要用加密的逆變換,就是把上面的最后換位表和初始換位表完全倒過來變換。這里不再贅述。</p><p>

43、;<b>  2.5 程序代碼</b></p><p>  由于代碼過長,此處只列出部分關(guān)鍵代碼。</p><p>  #include <iostream></p><p>  #include <fstream></p><p>  using namespace std;</p>

44、<p>  const static char ip[] = { //IP置換</p><p>  58, 50, 42, 34, 26, 18, 10, 2,</p><p>  60, 52, 44, 36, 28, 20, 12, 4,</p><p>  62, 54, 46, 38, 30, 22, 1

45、4, 6,</p><p>  64, 56, 48, 40, 32, 24, 16, 8,</p><p>  57, 49, 41, 33, 25, 17, 9, 1,</p><p>  59, 51, 43, 35, 27, 19, 11, 3,</p><p>  61, 53, 45, 37, 29, 21, 13,

46、5,</p><p>  63, 55, 47, 39, 31, 23, 15, 7</p><p>  }; </p><p>  const static char fp[] = {//zuizhongzhihuan </p><p>  40,

47、 8, 48, 16, 56, 24, 64, 32,</p><p>  39, 7, 47, 15, 55, 23, 63, 31,</p><p>  38, 6, 46, 14, 54, 22, 62, 30,</p><p>  37, 5, 45, 13, 53, 21, 61, 29,</p><p>  36, 4,

48、 44, 12, 52, 20, 60, 28,</p><p>  35, 3, 43, 11, 51, 19, 59, 27,</p><p>  34, 2, 42, 10, 50, 18, 58, 26,</p><p>  33, 1, 41, 9, 49, 17, 57, 25</p><p><b>  };&

49、lt;/b></p><p>  const static char sbox[8][64] = {//s_box</p><p><b>  /* S1 */</b></p><p>  14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,</p&g

50、t;<p>  0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,</p><p>  4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,</p><p>  15, 12, 8, 2, 4, 9, 1, 7, 5,

51、 11, 3, 14, 10, 0, 6, 13,</p><p><b>  /* S2 */</b></p><p>  15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,</p><p>  3, 13, 4, 7, 15, 2, 8, 14, 12

52、, 0, 1, 10, 6, 9, 11, 5,</p><p>  0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,</p><p>  13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,</p><p>

53、;<b>  /* S3 */</b></p><p>  10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,</p><p>  13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,</p><p&

54、gt;  13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,</p><p>  1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,</p><p><b>  /* S4 */</b></p><p

55、>  7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,</p><p>  13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,</p><p>  10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3,

56、 14, 5, 2, 8, 4,</p><p>  3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,</p><p><b>  /* S5 */</b></p><p>  2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3,

57、 15, 13, 0, 14, 9,</p><p>  14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,</p><p>  4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,</p><p>  11, 8

58、, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,</p><p><b>  /* S6 */</b></p><p>  12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,</p><p>  10,

59、15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,</p><p>  9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,</p><p>  4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0

60、, 8, 13,</p><p><b>  /* S7 */</b></p><p>  4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,</p><p>  13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 1

61、5, 8, 6,</p><p>  1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,</p><p>  6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,</p><p><b>  /* S8 */

62、</b></p><p>  13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,</p><p>  1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,</p><p>  7, 11, 4, 1,

63、9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,</p><p>  2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11</p><p><b>  };</b></p><p>  const static char rar[]

64、 = {//ya suo zhi huan</p><p>  14, 17, 11, 24, 1, 5,</p><p>  3, 28, 15, 6, 21, 10,</p><p>  23, 19, 12, 4, 26, 8,</p><p>  16, 7, 27, 20, 13, 2,</p>

65、<p>  41, 52, 31, 37, 47, 55,</p><p>  30, 40, 51, 45, 33, 48,</p><p>  44, 49, 39, 56, 34, 53,</p><p>  46, 42, 50, 36, 29, 32</p><p><b>  };</b></

66、p><p>  const static char ei[] = {//kuo zhan zhi huan</p><p>  32, 1, 2, 3, 4, 5,</p><p>  4, 5, 6, 7, 8, 9,</p><p>  8, 9, 10, 11, 12, 13,</p><p

67、>  12, 13, 14, 15, 16, 17,</p><p>  16, 17, 18, 19, 20, 21,</p><p>  20, 21, 22, 23, 24, 25,</p><p>  24, 25, 26, 27, 28, 29,</p><p>  28, 29, 30, 31, 32, 1</p&g

68、t;<p><b>  };</b></p><p>  const static char Pzh[]={//P置換</p><p>  16, 7, 20, 21,</p><p>  29, 12, 28, 17,</p><p>  1, 15, 23, 26,</p>&

69、lt;p>  5, 18, 31, 10,</p><p>  2, 8, 24, 14,</p><p>  32, 27, 3, 9,</p><p>  19, 13, 30, 6,</p><p>  22, 11, 4, 25</p><p><b>  };</b>&l

70、t;/p><p>  const static char Keyrar[]={</p><p>  57, 49, 41, 33, 25, 17, 9,</p><p>  1, 58, 50, 42, 34, 26, 18,</p><p>  10, 2, 59, 51, 43, 35, 27,</p><p> 

71、 19, 11, 3, 60, 52, 44, 36,</p><p>  63, 55, 47, 39, 31, 23, 15,</p><p>  7, 62, 54, 46, 38, 30, 22,</p><p>  14, 6, 61, 53, 45, 37, 29,</p><p>  21, 13, 5, 28, 20,

72、12, 4</p><p><b>  };</b></p><p>  bool key[16][48]={0},/*rekey[16][48],*/</p><p>  char key_in[8];</p><p>  void ByteToBit(bool *Out,char *In,int bits)//

73、字節(jié)到位的轉(zhuǎn)換</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<bits;i++)</p><p>  Out[i]=(In[i/8]>>(i%8))&1;</p><p&

74、gt;<b>  }</b></p><p>  void BitToByte(char *Out,bool *In,int bits)//位到字節(jié)轉(zhuǎn)換</p><p><b>  {</b></p><p>  for(int i=0;i<bits/8;i++)</p><p><

75、;b>  Out[i]=0;</b></p><p>  for(i=0;i<bits;i++)</p><p>  Out[i/8]|=In[i]<<(i%8);//"|="組合了位操作符和賦值操作符的功能</p><p><b>  }</b></p><p&

76、gt;  void Xor(bool *InA,const bool *InB,int len) //按位異或</p><p><b>  {</b></p><p>  for(int i=0;i<len;i++)</p><p>  InA[i]^=InB[i];</p><p><b>  }

77、</b></p><p>  void keyfc(char *In) //獲取密鑰函數(shù)</p><p><b>  {</b></p><p>  int i,j=0,mov,k;</p><p>  bool key0[56],temp,keyin[64];</p>

78、<p>  ByteToBit(keyin,In,64); //字節(jié)到位的轉(zhuǎn)換</p><p>  for(i=0;i<56;i++) //密鑰壓縮為56位</p><p>  key0[i]=keyin[Keyrar[i]-1];</p><p>  for(i=0;i<16;i

79、++) //16輪密鑰產(chǎn)生</p><p><b>  {</b></p><p>  if(i==0||i==1||i==8||i==15)</p><p><b>  mov=1;</b></p><p><b>  else</b></p>&l

80、t;p><b>  mov=2;</b></p><p>  for(k=0;k<mov;k++) //分左右兩塊循環(huán)左移</p><p><b>  {</b></p><p>  for(int m=0;m<8;m++)</p><p><b>  {</

81、b></p><p>  temp=key0[m*7];</p><p>  for(j=m*7;j<m*7+7;j++)</p><p>  key0[j]=key0[j+1];</p><p>  key0[m*7+6]=temp;</p><p><b>  }</b></

82、p><p>  temp=key0[0];</p><p>  for(m=0;m<27;m++)</p><p>  key0[m]=key0[m+1];</p><p>  key0[27]=temp;</p><p>  temp=key0[28];</p><p>  for(m=28

83、;m<55;m++)</p><p>  key0[m]=key0[m+1];</p><p>  key0[55]=temp;</p><p><b>  }</b></p><p>  for(j=0;j<48;j++) //壓縮置換并儲(chǔ)存</p><p>  ke

84、y[i][j]=key0[rar[j]-1];</p><p><b>  }</b></p><p><b>  }</b></p><p>  void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0時(shí)加密,反之解密</p><p><b&

85、gt;  {</b></p><p>  bool MW[64],tmp[32],PMW[64];//注意指針</p><p>  bool kzmw[48],keytem[48],ss[32];</p><p>  int hang,lie;</p><p>  ByteToBit(PMW,In,64);</p>

86、<p>  for(int j=0;j<64;j++)</p><p><b>  {</b></p><p>  MW[j]=PMW[ip[j]-1]; //初始置換</p><p><b>  }</b></p><p>  bool *Li=&MW[

87、0],*Ri=&MW[32];</p><p>  for(int i=0;i<48;i++)//右明文擴(kuò)展置換</p><p>  kzmw[i]=Ri[ei[i]-1];//注意指針</p><p>  if(MS==0)//DES加密過程</p><p><b>

88、  {</b></p><p>  for(int lun=0;lun<16;lun++)</p><p><b>  {</b></p><p>  for(i=0;i<32;i++)</p><p>  ss[i]=Ri[i];</p><p>  for(i=0;i&

89、lt;48;i++)//右明文擴(kuò)展置換</p><p>  kzmw[i]=Ri[ei[i]-1];//注意指針</p><p>  for(i=0;i<48;i++)</p><p>  keytem[i]=key[lun][i];//輪密鑰</p><p>  Xor(kzmw,keytem,

90、48);</p><p><b>  /*S盒置換*/</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  hang=kzmw[i*6]*2+kzmw[i*6+5];</p><p>  lie =k

91、zmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];</p><p>  tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;</p><p>  tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;</p><p>  tmp[i*4+1]=(sbox[i

92、][(hang+1)*16+lie]/4)%2;</p><p>  tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;</p><p><b>  }</b></p><p>  for(int i=0;i<32;i++)//P置換</p><p>  Ri[i]=tmp[P

93、zh[i]-1];</p><p>  Xor(Ri,Li,32);//異或</p><p>  for(i=0;i<32;i++)//交換左右明文</p><p><b>  {</b></p><p>  Li[i]=ss[i];</p><p><b>  }&l

94、t;/b></p><p><b>  }</b></p><p>  for(i=0;i<32;i++)</p><p><b>  {</b></p><p>  tmp[i]=Li[i];</p><p>  Li[i]=Ri[i];</p>

95、<p>  Ri[i]=tmp[i];</p><p><b>  }</b></p><p>  for(i=0;i<64;i++)</p><p>  PMW[i]=MW[fp[i]-1];</p><p>  BitToByte(Out,PMW,64);//位到字節(jié)的轉(zhuǎn)換</p>

96、<p><b>  }</b></p><p>  else//DES解密過程</p><p><b>  {</b></p><p>  for(int lun=15;lun>=0;lun--)</p><p><b>  {</b>&l

97、t;/p><p>  for(i=0;i<32;i++)</p><p>  ss[i]=Ri[i];</p><p>  for(int i=0;i<48;i++)//右明文擴(kuò)展置換</p><p>  kzmw[i]=Ri[ei[i]-1];//注意指針</p><p>  fo

98、r(i=0;i<48;i++)</p><p>  keytem[i]=key[lun][i];//輪密鑰</p><p>  Xor(kzmw,keytem,48);</p><p><b>  /*S盒置換*/</b></p><p>  for(i=0;i<8;i++)</p>

99、<p><b>  {</b></p><p>  hang=kzmw[i*6]*2+kzmw[i*6+5];</p><p>  lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];</p><p>  tmp[i*4+3]=sbox[i][(hang+1)*16+

100、lie]%2;</p><p>  tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;</p><p>  tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;</p><p>  tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;</p><p>

101、;<b>  }</b></p><p>  for(i=0;i<32;i++)//P置換</p><p>  Ri[i]=tmp[Pzh[i]-1];</p><p>  Xor(Ri,Li,32);//異或</p><p>  for(i=0;i<32;i++)//交換左右明文<

102、/p><p><b>  {</b></p><p>  Li[i]=ss[i];</p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=0;i<32;i++)</p><p

103、><b>  {</b></p><p>  tmp[i]=Li[i];</p><p>  Li[i]=Ri[i];</p><p>  Ri[i]=tmp[i];</p><p><b>  }</b></p><p>  for(i=0;i<64;i++)&

104、lt;/p><p>  PMW[i]=MW[fp[i]-1];</p><p>  BitToByte(Out,PMW,64);//位到字節(jié)的轉(zhuǎn)換</p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()<

105、;/p><p><b>  {</b></p><p>  char Ki[8],jm[8],final[8];</p><p><b>  int i0;</b></p><p>  cout<<"請輸入密鑰(8字節(jié)):"<<endl;</p>

106、<p>  for(i0=0;i0<8;i0++)</p><p>  cin>>Ki[i0];</p><p>  //if(i0<8)</p><p>  //for(i0=0;i0<8;i0++)</p><p>  //cin//[i0];</p><p> 

107、 keyfc(Ki);</p><p>  cout<<"請輸入明文:"<<endl;</p><p>  for(i0=0;i0<8;i0++)</p><p>  cin>>jm[i0];</p><p>  DES(final,jm,0);</p><p&

108、gt;  cout<<"加密后:"<<endl;//加密</p><p>  for(i0=0;i0<8;i0++)</p><p>  cout<<final[i0];</p><p>  cout<<endl;</p><p>  cout<<"

109、;解密后:"<<endl;</p><p>  DES(jm,final,1);//解密</p><p>  for(i0=0;i0<8;i0++)</p><p>  cout<<jm[i0];</p><p>  cout<<endl;</p><p>&l

110、t;b>  }</b></p><p><b>  2.6結(jié)果分析</b></p><p>  代碼通過des分組密碼,對明文順利進(jìn)行了加密和解密。</p><p><b>  2.7實(shí)驗(yàn)總結(jié)</b></p><p>  通過實(shí)驗(yàn),我對des加密過程有了比較全面的認(rèn)識(shí),在編程中,首

111、先弄清楚加密的流程,然后知道每個(gè)函數(shù)的功能,就能夠?qū)崿F(xiàn)了??梢妶?jiān)固的理論基礎(chǔ)是實(shí)踐的前提。</p><p>  DES數(shù)據(jù)加密標(biāo)準(zhǔn)是對稱密碼體制的杰出代表。DES算法綜合多次組合迭代算法和換位算法,利用分散和錯(cuò)亂的相互作用,把明文編制成密碼強(qiáng)度很高的密文。DES算法的加密和解密的流程是完全相同的, 區(qū)別僅僅是加密與解密使用子密鑰序列的順序正好相反。 </p><p>  3.實(shí)驗(yàn)三 實(shí)現(xiàn)一

112、個(gè)大素?cái)?shù)生成算法</p><p><b>  3.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  進(jìn)一步掌握大素?cái)?shù)分解的一般原理和實(shí)現(xiàn)方法。</p><p><b>  3.2實(shí)驗(yàn)要求</b></p><p>  能用間接方法實(shí)現(xiàn)大素?cái)?shù)分解。</p><p><b>  3

113、.3實(shí)驗(yàn)內(nèi)容</b></p><p>  用代碼實(shí)現(xiàn)Solovay-Strassen素性測試法或Miller-Rabin素性測試法。</p><p>  3.4 Miller-Rabin素性測試法</p><p>  米勒和拉賓的素性測試方法是在費(fèi)馬定理的基礎(chǔ)上進(jìn)行研究的。新的測試基于下面的定理:如 果p是素?cái)?shù),x是小于p的正整數(shù),且x^2 mod p

114、= 1,那么要么x=1,要么x=p-1。這是顯然的,因?yàn)閤^2 mod p = 1相當(dāng)于p能整除x^2-1,也即p能整除(x+1)(x-1)。由于p是素?cái)?shù),那么只可能是x-1能被p整除(此時(shí)x=1)或x+1能被p整除(此時(shí)x =p-1)。 </p><p>  其基本方法是不斷地提取指數(shù)n-1中的因子2,把n-1表示成d*2^r(其中d是一個(gè)奇數(shù))。那么我們需要計(jì)算的東西就 變成了a的d*2^r次方除以n的余數(shù)。

115、于是,a^(d * 2^(r-1))要么等于1,要么等于n-1。如果a^(d * 2^(r-1))等于1,定理繼續(xù)適用于a^(d * 2^(r-2)),這樣不斷開方開下去,直到對于某個(gè)i滿足a^(d * 2^i) mod n = n-1或者最后指數(shù)中的2用完了得到的a^d mod n=1或n-1。 </p><p>  Miller-Rabin算法是一個(gè)RP算法。RP是時(shí)間復(fù)雜度的一種,主要 針對判定性問題。一個(gè)

116、算法是RP算法表明它可以在多項(xiàng)式的時(shí)間里完成,對于答案為否定的情形能夠準(zhǔn)確做出判斷,但同時(shí)它也有可能把對的判成錯(cuò)的(錯(cuò)誤概率 不能超過1/2)。RP算法是基于隨機(jī)化的,因此多次運(yùn)行該算法可以降低錯(cuò)誤率。 </p><p><b>  3.5 程序代碼</b></p><p><b>  關(guān)鍵部分:</b></p><p>

117、  function pow( a, d, n:longint ):longint;begin if d=0 then exit(1) else if d=1 then exit(a) else if d and 1=0 then exit( pow( a*a mod n, d div 2, n) mod n) else exit( (pow( a*a mod n, d div 2, n) * a) m

118、od n);end;function IsPrime( a,n:longint ):boolean;var d,t:longint;begin if n=2 then exit(true); if (n=1) or (n and 1=0) then exit(false); d:=n-1; while d and 1=0 do d:=d shr 1; t:=pow( a, d,

119、n ); while ( d<>n-1 ) and ( t<>1 ) and ( t<>n-1 ) do b</p><p><b>  3.6 結(jié)果分析</b></p><p>  程序順利運(yùn)行,進(jìn)行大素?cái)?shù)的生成。</p><p><b>  3.7 實(shí)驗(yàn)總結(jié)</b>&

120、lt;/p><p>  RSA公鑰密碼體制在加密和解密變換中存在大量的數(shù)值運(yùn)算,其加密和解密運(yùn)算時(shí)間比較長,開銷更大,在某種程度上限制了其應(yīng)用范圍。由于產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而很難做到一次一密。RSA公鑰加密技術(shù)已成為確保信息安全性的關(guān)鍵技術(shù),目前為止還是一種被人們認(rèn)可的安全技術(shù)。它的安全性基于數(shù)論中大整數(shù)分解的困難性。實(shí)際上,人們推測RSA的安全性依賴于大整數(shù)的因式分解問題,但誰也沒有在數(shù)學(xué)上證

121、明從c和e計(jì)算m需要對n進(jìn)行因式分解??梢韵胂罂赡軙?huì)有完全不同的方式去分析RSA。然而,如果這種方法能讓密碼解析員推導(dǎo)出d,則它也可以用作大整數(shù)因式分解的新方法。最難以令人置信的是,有些RSA變體已經(jīng)被證明與因式分解同樣困難。甚至從RSA加密的密文中恢復(fù)出某些特定的位也與解密整個(gè)消息同樣困難。另外,對RSA的具體實(shí)現(xiàn)存在一些針對協(xié)議而不是針對基本算法的攻擊方法。雖然大整數(shù)的因子分解很困難,隨著科學(xué)技術(shù)的發(fā)展,因子分解的能力在不斷提高,而

122、且分解所需要的成本不斷下降。</p><p><b>  結(jié)束語</b></p><p>  經(jīng)過將近半個(gè)學(xué)期的密碼學(xué)課程設(shè)計(jì)的學(xué)習(xí),我們從中學(xué)到了很多關(guān)于古典密碼加密算法,des加密算法,rsa公鑰密碼體制的加密算法。這次的課程設(shè)計(jì)由張亞楠,何孝玉和藺光達(dá)三人共同完成。</p><p>  藺光達(dá)負(fù)責(zé)古典密碼的程序編寫及結(jié)果分析,何孝玉負(fù)責(zé)d

123、es加密算法的程序編寫及結(jié)果分析,張亞楠負(fù)責(zé)rsa公鑰密碼算法的程序編寫及結(jié)果分析等相關(guān)工作。</p><p>  多表古典密碼通過構(gòu)造多個(gè)對應(yīng)明文的密文字母表,在密鑰的控制下使用相應(yīng)的密文字母表中的某個(gè)字母來代替明文字母表中的一個(gè)字母。達(dá)到隱藏明文的目的。解密的時(shí)候?qū)@個(gè)過程進(jìn)行逆操作,得到明文。一個(gè)明文字母有多種代替。而Vernam密碼就是著名的多表代替密碼。對des加密過程有了比較全面的認(rèn)識(shí),在編程中,首先

124、弄清楚加密的流程,然后知道每個(gè)函數(shù)的功能,就能夠?qū)崿F(xiàn)了??梢妶?jiān)固的理論基礎(chǔ)是實(shí)踐的前提。DES數(shù)據(jù)加密標(biāo)準(zhǔn)是對稱密碼體制的杰出代表。DES算法綜合多次組合迭代算法和換位算法,利用分散和錯(cuò)亂的相互作用,把明文編制成密碼強(qiáng)度很高的密文。DES算法的加密和解密的流程是完全相同的, 區(qū)別僅僅是加密與解密使用子密鑰序列的順序正好相反。RSA公鑰加密技術(shù)已成為確保信息安全性的關(guān)鍵技術(shù),目前為止還是一種被人們認(rèn)可的安全技術(shù)。它的安全性基于數(shù)論中大整數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論