版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 密碼學(xué)課程設(shè)計(jì)報(bào)告
- 密碼學(xué)課程設(shè)計(jì)報(bào)告
- 應(yīng)用密碼學(xué)課程設(shè)計(jì)報(bào)告
- 密碼學(xué)課程設(shè)計(jì)
- 密碼學(xué)課程設(shè)計(jì)—網(wǎng)頁加密技術(shù)
- 密碼學(xué)課程設(shè)計(jì)-- 簡單的保密通信系統(tǒng)
- 應(yīng)用密碼學(xué)課程設(shè)計(jì)-rsa加密解密的設(shè)計(jì)與實(shí)現(xiàn)
- 密碼學(xué)實(shí)驗(yàn)報(bào)告
- 密碼學(xué)實(shí)驗(yàn)報(bào)告
- 《應(yīng)用密碼學(xué)》課程教學(xué)大綱
- 密碼學(xué)實(shí)驗(yàn)----
- 密碼學(xué)答案
- 數(shù)字簽名系統(tǒng)-現(xiàn)代密碼學(xué)課程設(shè)計(jì)任務(wù)書
- 古典密碼學(xué)之希爾密碼
- aes密碼學(xué)課程設(shè)計(jì)(c語言實(shí)現(xiàn))--aes加密解密軟件的實(shí)現(xiàn)
- 現(xiàn)代密碼學(xué)論文
- 現(xiàn)代密碼學(xué)基礎(chǔ)課程教學(xué)大綱
- 天津大學(xué)密碼學(xué)課程教學(xué)大綱
- 密碼學(xué)復(fù)習(xí)題
- 《密碼學(xué)》教學(xué)大綱
評(píng)論
0/150
提交評(píng)論