版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課 程 設 計</b></p><p> 課程名稱 微機原理課程設計 </p><p> 題目名稱 學生成績的統計 </p><p> 學生學院 應用數學學院 </p><p> 專業(yè)班級__ 信息安全(1)_______</p>
2、<p> 學 號___ ______</p><p> 學生姓名_____ _________</p><p> 學 號______________________</p><p> 學生姓名______________________</p><p> 學 號_______
3、_______________</p><p> 學生姓名______________________</p><p> 學 號______________________</p><p> 學生姓名______________________</p><p> 指導教師 </p>
4、<p> 2014 年 1 月 3 日</p><p><b> 摘要: </b></p><p> RSA公鑰密碼體制是由美國麻省理工學院的Rivest,Shami和Adleman于1978年提出的。它的安全性基礎是數論中的歐拉定理和計算復雜性理論中的論斷:求兩個大素數的乘積是計算上容易的,但要分解兩個大素數的乘積求出它的素因子是計算上困難的
5、,即其安全性是基礎大數因子分解的困難性。RSA是最具代表性的公鑰密碼體制,由于算法既可用于加密又可用于數字簽名,加上安全性良好,也非常便于實現和理解,使得RSA成為目前應用最普遍的公鑰密碼系統之一,RSA體制是最具代表性的公鑰密碼體制。 </p><p> RSA算法的缺點是運算速度慢,且隨著模數n的長度的增長,加解密的核心運算冪模運算所需要的時間就越長,算法的效率也就越低。因此,在保證RSA體制安全性的
6、基礎上,國內外RSA密碼研究人員對RSA體制的核心運算冪模運算進行優(yōu)化,以達到提高RSA效率的目的。目前比較有效的算法有基于乘同余對稱特性的SMM算法、2k進制法、滑動窗口取冪法、利用中國剩余定理降低指數法。</p><p> 本論文基于RSA算法來制作RSA通信系統。</p><p> 關鍵詞:RSA算法;RSA通信系統;公鑰密碼體制;加解密.</p><p>
7、; 第一章 RSA開篇4</p><p> 1.1實現RSA算法所要做的工作4</p><p> 1.2 數論知識4</p><p> 1.2.1 數和互為素數4</p><p> 1.2.2 模運算4</p><p> 1.2.3 費馬定理4</p><p> 1.2
8、.4 歐拉定理5</p><p> 1.2.5 模反元素5</p><p> 1.3 密鑰生成5</p><p> 1.4 加密和解密6</p><p> 1.5 私鑰解密證明6</p><p> 1.6 RSA的可靠性7</p><p> 第二章 RSA數學基礎8&l
9、t;/p><p> 2.1 數論的基礎知識8</p><p> 2.1.1 最大公約數8</p><p> 2.1.2 素數9</p><p> 2.1.3 互質數9</p><p> 2.2 模算術運算9</p><p> 2.2.1 模運算的概念9</p>
10、<p> 2.2.2 模運算的性質10</p><p> 2.2.3 逆元的求解:10</p><p> 2.3 歐拉定理及相關概念10</p><p> 第三章 RSA密碼體制10</p><p> 3.1公鑰密碼體制10</p><p> 3.1.1公鑰密碼系統具有以下一般性質:1
11、0</p><p> 3.2 RSA算法11</p><p> 3.2.1 RSA算法描述11</p><p> 3.2.2 RSA公鑰密碼體制安全性分析11</p><p> 3.3 實現分析:13</p><p> 第四章 RSA實現14</p><p> 4.1 大數
12、的存儲和運算14</p><p> 4.2 隨機大素數的產生15</p><p> 4.3 RSA加密與解密15</p><p> 4.3.1 RSA的加密與解密過程15</p><p> 4.3.2 密鑰產生15</p><p> 4.4 RSA通信實現設計15</p><p
13、> 4.4.1 偽隨機數設計15</p><p> 4.4.2 增強保密RSA通信系統方案16</p><p> 第五章 運行與測試16</p><p> 5.1 RSA保密通信軟件安裝過程16</p><p> 5.2 用戶登錄界面20</p><p> 5.3 RSA通信系統界面21&
14、lt;/p><p> 第六章 重要代碼附錄22</p><p> 6.1 登錄界面22</p><p> 6.2 RSA通信系統界面25</p><p> 第七章 學習感悟32</p><p> 7.1 陳文韜32</p><p> 7.2 袁澤寧32</p>
15、<p><b> 7.3 陳舜32</b></p><p> 7.4 仇劍豪33</p><p> 第八章 參考文獻33</p><p><b> 第一章 RSA開篇</b></p><p> 1.1實現RSA算法所要做的工作</p><p> (
16、1)學習RSA體制的基本原理及數學基礎:RSA算法的理論研究包括RSA算法的原理及組成。RSA體制的基礎是數論中的歐拉定理,其安全性是基于大數因子分解困難性。RSA體制的重要內容包括大素數的產生、密鑰對的產生和信息的加解密處理。對RSA原理及數學基礎的學習為后面進一步深入學習和實現RSA的算法打下基礎。</p><p> (2)學習RSA的具體算法:RSA的實現包含各種具體的算法,在實現具體算法前必</p
17、><p> 須要熟悉它使用到的各種算法,找出自己可以編程實現的算法。RSA中使用到的算法有素性檢測算法、公私鑰產生算法、冪模運算算法三大類。</p><p> 實現了一個以RSA密碼為基礎的簡單通信系統:在上述研究的基礎上對RSA進行編程實現,并將上述的研究成果應用到程序中。</p><p><b> 1.2 數論知識</b></p&g
18、t;<p> 1.2.1 數和互為素數</p><p> 任何大于1的整數a能被因式分解為如下唯一形式:</p><p> a=p1p2…pl(p1,p2,…,pl為素數)</p><p><b> 1.2.2 模運算</b></p><p> ①{[a(mod n)]×[b(mod n
19、)]}modn≡(a×b)(mod n)</p><p> ?、谌绻╝×b)=(a×c)(mod n),a與n互素,則b=c(mod n)</p><p> 1.2.3 費馬定理</p><p> 若p是素數,a與p互素,則a^(p-1)≡1 (mod p)</p><p> 1.2.4 歐拉定理<
20、/p><p> 歐拉函數φ(n)表示不大于n且與n互素的正整數的個數。</p><p> 當n是素數,φ(n)=n-1。n=pq,p,q均為素數時,則φ(n)= φ(p)φ(q)=(p-1)(q-1)。</p><p> 對于互素的a和n,有a^φ(n)≡1(mod n)</p><p> 1.2.5 模反元素</p>&l
21、t;p> 如果兩個正整數a和n互質,那么一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的余數是1。即</p><p> ab≡1 mod n</p><p> 這時,b就叫做a的"模反元素"。</p><p><b> 1.3 密鑰生成</b></p><p> 第一步
22、,隨機選擇兩個不相等的質數p和q。</p><p> 比如和53。(實際應用中,這兩個質數越大,就越難破解。)</p><p> 第二步,計算p和q的乘積n。</p><p> n = 61×53 = 3233</p><p> n的長度就是密鑰長度。3233寫成二進制是110010100001,一共有12位,所以這個密鑰就
23、是12位。實際應用中,RSA密鑰一般是1024位,重要場合則為2048位。</p><p> 第三步,計算n的歐拉函數φ(n)。</p><p> 根據公式:φ(n) = (p-1)(q-1)</p><p> 算出φ(3233)等于60×52,即3120。</p><p> 第四步,隨機選擇一個整數e,條件是1< e
24、 < φ(n),且e與φ(n) 互質。</p><p> 在1到3120之間,隨機選擇了17。</p><p> 第五步,計算e對于φ(n)的模反元素d。</p><p> 根據公式ab≡1 mod n</p><p> 隨機生成一個范圍在1~n之間的d,然后代入公式中檢驗是否成立,如果不成立則加1并檢驗,以此循環(huán)下去,直到找到
25、使公式成立的d。</p><p> 第六步,將n和e封裝成公鑰,n和d封裝成私鑰。 </p><p> 在上述例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。</p><p><b> 1.4 加密和解密</b></p><p> 有了公鑰和密鑰,
26、就能進行加密和解密了。</p><p> ?。?)加密要用公鑰 (n,e)</p><p> 假設要發(fā)送信息m,就要用公鑰 (n,e) 對m進行加密。這里需要注意,m必須是整數(字符串可以取ascii值或unicode值),且m必須小于n。</p><p> 所謂"加密",就是算出下式的c:</p><p> m^e
27、 ≡ c (mod n)</p><p> 公鑰是 (3233, 17), m假設是65,那么可以算出下面的等式:</p><p> 6517 ≡ 2790 (mod 3233)</p><p> 于是,c等于2790。</p><p> (2)解密要用私鑰(n,d)</p><p> 得到2790以后,就用
28、私鑰(3233, 2753) 進行解密??梢宰C明,下面的等式一定成立:</p><p> c^d ≡ m (mod n)</p><p> 也就是說,c的d次方除以n的余數為m。現在,c等于2790,私鑰是(3233, 2753),那么,算出:2790^2753 ≡ 65 (mod 3233)</p><p> 因此,得到了加密前的原文就是65。</p&
29、gt;<p> 至此,"加密--解密"的整個過程全部完成。</p><p> 我們可以看到,如果不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難做到的,所以RSA算法保證了通信安全。</p><p> 你可能會問,公鑰(n,e) 只能加密小于n的整數m,那么如果要加密大于n的整數,該怎么辦?有兩種解決方法:一種是把長信息
30、分割成若干段短消息,每段分別加密;另一種是先選擇一種"對稱性加密算法"(比如DES),用這種算法的密鑰加密信息,再用RSA公鑰加密DES密鑰</p><p> 1.5 私鑰解密證明</p><p> 證明下式成立c^d ≡ m (mod n)</p><p> 因為,根據加密規(guī)則m^e ≡ c (mod n)</p><
31、p> 于是,c可以寫成下面的形式c = me - kn將c代入要我們要證明的那個解密規(guī)則:</p><p> (me - kn)d ≡ m (mod n)</p><p> 它等同于求證med ≡ m (mod n)</p><p> 由于ed ≡ 1 (mod φ(n))</p><p> 所以ed = hφ(n)+1<
32、;/p><p> 將ed代入:mhφ(n)+1 ≡ m (mod n)</p><p> 接下來,分成兩種情況證明上面這個式子。</p><p> ?。?)m與n互質。根據歐拉定理,此時mφ(n) ≡ 1 (mod n)</p><p><b> 得到</b></p><p> (mφ(n))
33、h × m ≡ m (mod n)</p><p><b> 原式得到證明。</b></p><p> (2)m與n不是互質關系。</p><p> 此時,由于n等于質數p和q的乘積,所以m必然等于kp或kq。</p><p> 以 m = kp為例,考慮到這時k與q必然互質,則根據歐拉定理,下面的式子
34、成立:</p><p> (kp)q-1 ≡ 1 (mod q)</p><p><b> 進一步得到</b></p><p> [(kp)q-1]h(p-1) × kp ≡ kp (mod q)</p><p><b> 即</b></p><p> (
35、kp)ed ≡ kp (mod q)</p><p> 將它改寫成下面的等式</p><p> (kp)ed = tq + kp</p><p> 這時t必然能被p整除,即 t=t'p</p><p> (kp)ed = t'pq + kp</p><p> 因為 m=kp,n=pq,所以&l
36、t;/p><p> med ≡ m (mod n)</p><p><b> 原式得到證明。</b></p><p> 1.6 RSA的可靠性</p><p> 回顧上面的密鑰生成步驟,一共出現六個數字:</p><p> p,q,n,φ(n),e,d</p><p>
37、; 這六個數字之中,公鑰用到了兩個(n和e),其余四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d泄漏,就等于私鑰泄漏。那么,有無可能在已知n和e的情況下,推導出d?</p><p> ?。?)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。</p><p> ?。?)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。</p&g
38、t;<p> ?。?)n=pq。只有將n因數分解,才能算出p和q。</p><p> 結論:如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。</p><p> 可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發(fā)現別的有效方法。維基百科這樣寫道:</p><p> "對極大整數做因數分解的難度決定了RSA
39、算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。</p><p> 第二章 RSA數學基礎</p><p> 目前,大多數的公鑰密碼體制都是以數學難題為基礎的加密解密體制,RSA是以大整數分解困難問題為基礎的公鑰密碼體制。同大多數的公鑰密碼體制一樣,RSA的安全性主要取決于其加密算法的數學函數求逆的困難性,即求兩個大素數的乘積是非常容易的,但將一個大數分解為兩個素
40、數的乘積是非常困難的。我們稱這樣的函數為單向函數。單向函數在密碼學中起一個中心作用,它是公鑰密碼體制構造的關鍵。目前單向函數的研究是公鑰密碼體制理論研究的一個重要分支。但是,到目前為止還沒有一個函數被證明是單向的,只能被認為或被相信是單向的。為了更好的理解RSA體制,本章對與RSA相關的數論知識中的基本概念做一些簡單的介紹。</p><p> 2.1 數論的基礎知識</p><p>
41、2.1.1 最大公約數</p><p> 推論2.1:如果gcd(a,b)=d,則存在x, y,使得xa+yb=d</p><p><b> 證明: </b></p><p> 由gcd(ab)=d得a=md b=nd</p><p> gcd(m,n)=1,由定理2.3得存在x,</p>&
42、lt;p> 且gcd(m,n)=1。xa+yb=xmd+ynd=(xm+yn)d,又Y使得xm+yn=1,所以存在x, y使得xa+yb=d。</p><p> 定理一:a,b為兩個整數,若a=qb+r,用b去除a,即得商q,余數r,r<b,則gcd(a,b)=gcd(b,r)——(gcd(a,b)為a,b最大公約數)</p><p> 證明:令d=gcd(a,b),d
43、1=gcd(b,c),</p><p> 所以有:d|a,d|b,d1|b,d1|r</p><p> 由a=qb+r,則d|r。</p><p><b> 由d|r和d1|r</b></p><p> 得:d|d1 (1)</p><p> 同理:由r=a-qb,則d1|a</
44、p><p><b> 由d|a和d1|a</b></p><p> 得:d1|d (2)</p><p> 由(1)(2)得:d=d1</p><p><b> 2.1.2 素數</b></p><p> 對于整數p>1,若p的因子僅為1和p本身,則我們稱p為
45、素數</p><p> 早在2300多年前,希臘數學家歐幾里得就用反證法證明了素數的個數是無限的,并且任意一個正整數都可以分解為一系列素數的乘積。公式2.1稱為整數n的標準分解式:</p><p><b> 其中:</b></p><p> 在2.1式中當n非常大時,要得出n的標準分解式是非常難的,這也正是RSA密碼體制安全性的基礎。&l
46、t;/p><p><b> 2.1.3 互質數</b></p><p> 對于兩個正整數a, b,若它們僅有公約數1,則稱正整數a, b互質。</p><p> 如果兩個正整數都與另一個正整數p互質,則創(chuàng)門的乘積也與p互質,即若</p><p> gcd(a,p)=1,gcd(b,p)=1,則gcd(ab,p)=1。
47、</p><p><b> 2.2 模算術運算</b></p><p> 2.2.1 模運算的概念</p><p> 對任意整數a和正整數n,存在唯一的整數q和r,滿足0<=r<n,并且a=qn+r,則稱r是a對n的模運算,記做r=a mod n</p><p> 對整數a和b,若a mod n=b
48、mod n,則稱整數a和整數b模n同余,記做</p><p> 2.2.2 模運算的性質</p><p> 模的主要性質可以把冪模運算看成m次的模n運算 </p><p> 2.2.3 逆元的求解: </p><p> 定義2.4:對于整數a,p,如果存在整數b,滿足ab mod p=1,則說b是a的模p乘法逆元。</p
49、><p> 定理2.3:對于整數a和p, a存在模p的乘法逆元的充要條件是gcd(a,p)=l ,即a和p互素。</p><p> 2.3 歐拉定理及相關概念</p><p> RSA密碼體制的理論基礎是數論中的歐拉定理。</p><p> 定義2.3:設m是正整數,1, 2, 3, ..., m中與m互素的數的個數記做,叫做歐拉函數。&
50、lt;/p><p> 當m為素數時,=m-1</p><p> 定理2.2(歐拉定理):若整數a與m互素,則</p><p> 特別的,若m為素數p, = p-1,對于任意整數a都有,此時歐拉定理又稱為Fermat小定理。</p><p> 第三章 RSA密碼體制</p><p><b> 3.1公鑰密
51、碼體制</b></p><p> 公鑰密碼體制是相對私鑰密碼體制的,又叫非對稱性密碼體制。下面對公鑰密碼的發(fā)展、原理及目前普遍使用的幾種公鑰密碼進行簡單的闡述。目前被公認安全實用的公鑰密碼體制主要有三類,它們分別是:基于大整數因子分解困難問題的密碼體制、基于離散對數困難問題的密碼體制和近年來新提出的基于橢圓曲線離散對數的橢圓曲線密碼體制(ECC)。</p><p> 3.1
52、.1公鑰密碼系統具有以下一般性質:</p><p> (1)僅僅由密碼算法和加密密鑰要確定解密密鑰是不可能的,或在計算上是不可能的;</p><p> (2)系統的任何一端都產生一對用于加密和解密的密鑰對,并公布加密密鑰,保存解密密鑰;發(fā)送信息的一方必須用接收方公布的密鑰對明文進行加密,接收方用保存的解密密鑰對密文進行解密;</p><p><b>
53、 3.2 RSA算法</b></p><p> 基于大整數因子分解困難問題的密碼體制。具有代表性的有RSA, Rabin-</p><p> Williams體制、LUC體制及其推廣。目前使用的比較普遍的是本課題研究的RSA,它既可被用于加密,又可以用于數字簽名。</p><p> 3.2.1 RSA算法描述</p><p>
54、; RSA算法是利用陷門單向函數的一種可逆模指數運算,它的安全性是基于大數因子分解的困難性。下面給出RSA體制的算法描述:</p><p> (1)用戶A任選大素數p,q(保密),計算n=pq(公開), =(p-1)(q-1)(保密);</p><p> (2)任選e滿足gcd(, e) =1,令e為A的加密密鑰(公開),計算d使</p><p> ,d保密
55、,e的公開不影響d的安全;</p><p> (3 )用戶B欲將信息保密發(fā)送給A,先將信息數字化為m(m<n),查看A的公鑰(e,n),計算,將C發(fā)送給A;</p><p> (4)A收到C后用只有他自己掌握的解密密鑰d,作計算解密出m。</p><p> 3.2.2 RSA公鑰密碼體制安全性分析</p><p> 上述步驟便是
56、RSA公鑰體制的大致步驟,其中e, n作為公鑰公開發(fā)布,d作為私鑰由自己保密,e, n的公布不會影響d的安全性。又因為e和d是互逆的,所以RSA公鑰體制也可以使用d, n作為密鑰進行數字簽名,接受方使用公布的公鑰e, n作為密鑰進行解密,可以確認簽名不是偽造的。</p><p> RSA體制中,加密密鑰e與大整數n是公開的,而解密密鑰d與大素數P和q是保密的。雖然在RSA的加密與解密密鑰建立后,P和q不再需要,
57、但P和q也絕不能泄露。若n被分解,則也就不保密,e公開,d就可以計算出來,RSA便被破譯。</p><p> 己知n,求得,則p和q可以求得。因為根據歐拉定理, ,又有,據此列出方程:</p><p> 由以上方程組據現在己知的結果可以求得p和q。因為p和q都是大素數,根因子分解n是最好的算法,此時復雜性為:</p><p> 定理3.1:若p,q為素數,n=
58、pq,任意給整數j和a (0<a<n),則</p><p> 證明:(1)若整數與n互素,由歐拉定理,,即,所以,故,即</p><p> ?。?)若與n不互素,由n=pq,則a必然包含p或q。假設=cp(0<c<q),則整數a與q互素,由歐拉定理,。易知,即,所以,故,即</p><p><b> 證畢。</b>&
59、lt;/p><p> 由定理3.1,可以容易證明密文解密后的信息和加密前的明文是一樣的。證明RSA算法正確性的證明如下:</p><p> 信息在使用RSA算法加密前需要數字化,也就是所謂的編碼,解密時需要做相應的解碼。圖3.3為信息傳遞流程圖,圖3.4為RSA加密解密的流程圖。</p><p><b> (圖3.3)</b></p&g
60、t;<p><b> (圖3.4)</b></p><p><b> (圖3.4)</b></p><p><b> 3.3 實現分析:</b></p><p> RSA算法的核心運算是大整數模冪運算,而模冪運算是由一系列的模乘運算構成。因此本文主要針對RSA公鑰密碼體制中大整數
61、模指數算法進行了深入的研究,將該問題分解為對乘法算法、模乘法算法、模指數算法的研究并使用流行的面向對象軟件開發(fā)工具Visual C++進行了相應的軟件實現。</p><p> 對RSA公鑰密碼算法的原理進行了詳細描述,RSA公鑰密碼系統的實現。詳細的討論了大素數的生成與實現,密鑰對的產生,模冪運算的實現以及大整數的四則運算。</p><p><b> 第四章 RSA實現<
62、;/b></p><p> 4.1 大數的存儲和運算</p><p> 為了保證RSA的安全性,在RSA加密算法中要求公鑰n是達到512位二進制的大數,甚至1024或更大的數。目前編程語言提供的各種標準數據類型及定義在這些類型上的運算,32位機器上能表示的最大整數只有,在64位上的最大也只有,遠遠不能滿足RSA加密算法中的大數的要求。因此,為了滿足RSA加密算法中大數的要求,必須
63、自己定義特定的數據結構來表示大數,并根據大數特定的數據結構來定義大數的相關運算,本章介紹大數的存儲和運算,并在此基礎上實現了一個簡單的RSA加密通信系統</p><p> 4.2 隨機大素數的產生</p><p> 正確的生成大素數的方法是對生成的隨機數先測試它是否為素數,得多,而不是對它進行因子分解。這種素性測試比因子分解要容易己經有許多素性測試方法能夠確定一個隨機數是否為素數。這里
64、選擇Miller-Rabin素數檢測方法來產生大素數。</p><p> 4.3 RSA加密與解密</p><p> 4.3.1 RSA的加密與解密過程</p><p> RSA的加密、解密過程都為求一個整數的整數次冪,再取模。如果按其含義直接計算,則中中間結果非常大,有可能超出計算機所允許的整數取值范圍。如上例中解密運算,先求再取模,則明顯結果就已遠遠超出了
65、計算機允許的整數取值范圍。而用模運算的性質:</p><p> ?。╝*b) mod n=[(a mod n)x(b mod n)] mod n</p><p> 就可減小中間結果再者,考慮如何提高加、解密運算中指數運算的有效性。</p><p> 4.3.2 密鑰產生</p><p> 1)加密密鑰的產生:</p>&l
66、t;p> 選一整數e,滿足1<e<φ(n),且gcd(φ(n),e)=1</p><p> 2)解密密鑰的產生:</p><p> 求乘法逆元:推廣的Euclid算法先求出gcd(a, b),當gcd(a, b)=1時,則返回b的逆元。</p><p> Extcndcd Euclid(f, d)(設f>d)</p>
67、<p> (Xl,X2,X3)->(l,0,f);(Yl,Y2,Y3)->(0,1,d);</p><p> if Y3=0 then return X3=gcd(f, d);no inverse;</p><p> if Y3=1 then return Y3=gcd(f, d);Y2=d-1 mod f;</p><p>&l
68、t;b> Q=X3Y3;</b></p><p> (T1,T2,T3)<-(X1-QY1,X2-QY2,X3-QY3);</p><p> (X1,X2,X3)-(Y1,Y2,Y3);</p><p> (Y1,Y2,Y3}<-(T1,T2,T3);</p><p><b> gota②。&
69、lt;/b></p><p> 4.4 RSA通信實現設計</p><p> 4.4.1 偽隨機數設計</p><p> 由于電腦配置問題,且在mfc中實現,避免時間上的消耗,故限定p和q值范圍0至100;可以更改限定值范圍0至10000或更高,為了體現方便,則以100為限。</p><p> 4.4.2 增強保密RSA通信系統
70、方案</p><p> 1)設置登錄界面,登錄需要密碼。 </p><p> 2)將生成的可運行相關文件封裝成一個安裝軟件,安裝該軟件需要序列號。</p><p><b> 第五章 運行與測試</b></p><p> 5.1 RSA保密通信軟件安裝過程</p><p> 5.2
71、用戶登錄界面</p><p> 5.3 RSA通信系統界面</p><p><b> (加密圖)</b></p><p><b> (解密圖)</b></p><p> 第六章 重要代碼附錄</p><p><b> 6.1 登錄界面</b>&
72、lt;/p><p> //控件變量初始化和綁定</p><p> void CLogin::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p>
73、 //{{AFX_DATA_MAP(CLogin)</p><p> DDX_Text(pDX, IDC_PASSKEY, m_user);</p><p> DDX_Text(pDX, IDC_USERNAME, m_passkey);</p><p> //}}AFX_DATA_MAP</p><p><b> }&l
74、t;/b></p><p> BEGIN_MESSAGE_MAP(CLogin, CDialog)</p><p> //{{AFX_MSG_MAP(CLogin)</p><p> ON_BN_CLICKED(IDC_EXIT, OnExit)</p><p> ON_BN_CLICKED(IDC_OK, OnOk)</
75、p><p> ON_WM_PAINT()</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> //為對話框添加背景圖片</p><p> void CLogin::OnPaint() </p><p><b>
76、 {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> // TODO: Add your message handler code here</p><p> //CPaintDC dc(this);</p><p> CR
77、ect rect;</p><p> GetClientRect(&rect);</p><p> CDC dcMem;</p><p> dcMem.CreateCompatibleDC(&dc);</p><p> CBitmap bmpBackground;</p><p> bmpBa
78、ckground.LoadBitmap(IDB_BITMAPLOGIN);</p><p> BITMAP bitmap;</p><p> bmpBackground.GetBitmap(&bitmap);</p><p> CBitmap *pbmp=dcMem.SelectObject(&bmpBackground);</p>
79、<p> dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);</p><p> // Do not call CDialog::OnPaint() for painting messages</p><p><b&g
80、t; }</b></p><p><b> //密碼登錄設置</b></p><p> void CLogin::OnOk() </p><p><b> {</b></p><p> // TODO: Add your control notification handler
81、 code here</p><p> UpdateData(TRUE);</p><p><b> user="";</b></p><p> passkey="";</p><p> if(user==m_user && passkey==m_passk
82、ey)</p><p><b> {</b></p><p> MessageBox("合法用戶!");</p><p> MessageBox("歡迎進入RSA加密解密系統!");</p><p> CRSADlg obj;</p><p> o
83、bj.DoModal();</p><p><b> }</b></p><p> if(user==m_user && passkey!=m_passkey)</p><p><b> { </b></p><p> MessageBox("密碼錯誤!"
84、);</p><p><b> n--;</b></p><p><b> }</b></p><p> if(user!=m_user && passkey==m_passkey||user!=m_user && passkey!=m_passkey)</p><
85、p><b> {</b></p><p> MessageBox("沒有此用戶或者密碼錯誤!"); </p><p><b> n--;</b></p><p><b> }</b></p><p><b> if(n<=0)
86、</b></p><p><b> {</b></p><p> MessageBox("已經出錯3次,請重新運行后輸入!");</p><p> MessageBox("非法用戶!");</p><p> CDialog::OnOK();</p>
87、<p><b> }</b></p><p><b> }</b></p><p> 6.2 RSA通信系統界面</p><p> //控件變量初始化和綁定</p><p> CRSADlg::CRSADlg(CWnd* pParent /*=NULL*/):: CDi
88、alog(CRSADlg::IDD, pParent)</p><p><b> {</b></p><p> //{{AFX_DATA_INIT(CRSADlg)</p><p><b> m_p = 0;</b></p><p><b> m_q = 0;</b>&
89、lt;/p><p><b> m_n = 0;</b></p><p> m_code = 0;</p><p> m_decode = 0;</p><p> m_dtxt = _T("");</p><p> m_etxt = _T("");<
90、;/p><p> m_ptxt = _T("");</p><p> //}}AFX_DATA_INIT</p><p> // Note that LoadIcon does not require a subsequent DestroyIcon in Win32</p><p> m_hIcon = AfxGet
91、App()->LoadIcon(IDR_MAINFRAME);</p><p><b> }</b></p><p> void CRSADlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialo
92、g::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CRSADlg)//變量綁定控件ID</p><p> DDX_Text(pDX, IDC_EDIT_P, m_p);</p><p> DDX_Text(pDX, IDC_EDIT_Q, m_q);</p><p> DDX_Text
93、(pDX, IDC_EDIT_N, m_n);</p><p> DDX_Text(pDX, IDC_EDIT_CODE, m_code);</p><p> DDX_Text(pDX, IDC_EDIT_DECODE, m_decode);</p><p> DDX_Text(pDX, IDC_EDIT_DecryptText, m_dtxt);</p
94、><p> DDX_Text(pDX, IDC_EDIT_EncryptText, m_etxt);</p><p> DDX_Text(pDX, IDC_EDIT_PLAINTEXT, m_ptxt);</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p>
95、<p> //添加背景圖片代碼</p><p> CPaintDC dc(this);//定義dc對象</p><p> CRect rect;</p><p> GetClientRect(&rect);</p><p> CDC dcMem;</p><p> dcMem.Create
96、CompatibleDC(&dc);</p><p> CBitmap bmpBackground;</p><p> bmpBackground.LoadBitmap(IDB_BITMAPRSA);</p><p> BITMAP bitmap;</p><p> bmpBackground.GetBitmap(&b
97、itmap);</p><p> CBitmap *pbmp=dcMem.SelectObject(&bmpBackground);</p><p> c.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);</p><
98、;p> void CRSADlg::OnButtonProduce() //隨機生成密鑰</p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> UpdateData(true);</p>
99、<p> while(true)</p><p><b> {</b></p><p> srand(time(0));</p><p> m_p = rand() % 100;</p><p> m_q = rand() % 100;</p><p> if (isPr
100、ime(m_p) && isPrime(m_q))</p><p><b> break;</b></p><p><b> }</b></p><p> m_n = m_p * m_q;</p><p> int fiN = (m_p - 1) * (m_q - 1);&l
101、t;/p><p><b> //int e;</b></p><p> for (int i = 3; i < fiN; i++)</p><p> //隨機選擇一個整數e(即i)//條件是1< e < φ(n)(即fiN),且e與φ(n) 互質。</p><p><b> {</b
102、></p><p> if (isPrime(i) && gcd(fiN, i) == 1)</p><p><b> {</b></p><p> m_code = i;</p><p><b> break;</b></p><p><
103、b> }</b></p><p><b> }</b></p><p> Euler(m_code, fiN);//調用Euler函數找出m_decodc,m_decode由m_code和fiN決定</p><p> UpdateData(false);</p><p><b> }
104、</b></p><p> //求出a的n次方模m的值</p><p> int CRSADlg::power(int a, int n, int m)</p><p><b> {</b></p><p> int z=1, t;</p><p> for(t=a; n&
105、gt;0; n>>=1)//n右移動一位,相當于除2</p><p><b> { </b></p><p> if (n%2==1) z=(z*t) % m;</p><p> t=(t*t) % m;</p><p><b> }</b></p><p&g
106、t; return(z);</p><p><b> }</b></p><p><b> //判斷是否為素數</b></p><p> BOOL CRSADlg::isPrime(int x)</p><p><b> {</b></p><p
107、><b> int i;</b></p><p> for (i = 2; i <= (int)sqrt(x); i++)</p><p><b> {</b></p><p> if (x % i == 0)</p><p><b> break;</b>
108、;</p><p><b> }</b></p><p> if (i > (int)sqrt(x))</p><p> return true;</p><p> return false;</p><p><b> }</b></p><
109、;p> //求最大(a,b)最大公因子</p><p> int CRSADlg::gcd(int a, int b)</p><p><b> {</b></p><p> if (a == 0)</p><p><b> {</b></p><p><
110、;b> return b;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> return gcd(b % a, a);//遞歸</p>&
111、lt;p><b> }</b></p><p><b> }</b></p><p> //歐拉函數,求m_decode(解密密鑰)</p><p> void CRSADlg::Euler(int e, int fin)</p><p><b> {</b>&
112、lt;/p><p> //歐拉定理:若a和n互素,則aφ(n)=1 mod n</p><p> int p=gcd(e,fin);//調用求最大公因數的函數,最大公因數為1的話,才求逆元</p><p> if (p!=1) //否則返回</p><p><b> return;</b></p&
113、gt;<p> int u1 = 1;</p><p> int u2 = 0;</p><p> int u3 = fin;</p><p> int v1 = 0;</p><p> int v2 = 1;</p><p> int v3 = e;</p><p>
114、 int v = 1;</p><p> int t1, t2, t3;</p><p><b> int q;</b></p><p> int uu, vv;</p><p> int inverse, z;</p><p> while (v3 != 0)</p>
115、<p> t3 = u3 - q * v3;</p><p><b> u1 = v1;</b></p><p><b> u2 = v2;</b></p><p><b> u3 = v3;</b></p><p><b> v1 = t1;&l
116、t;/b></p><p><b> v2 = t2;</b></p><p><b> v3 = t3;</b></p><p><b> z = 1;</b></p><p><b> }</b></p><p&g
117、t;<b> uu = u1;</b></p><p><b> vv = u2;</b></p><p> if (vv < 0)</p><p> inverse = vv + fin;</p><p><b> else</b></p>&l
118、t;p> inverse = vv;</p><p> m_decode = inverse;</p><p><b> }</b></p><p> //加密明文(加密函數)</p><p> void CRSADlg::OnCode() </p><p><b>
119、{</b></p><p> CString temp;</p><p> UpdateData(true);</p><p> CString encSt = "";</p><p> if (m_ptxt.IsEmpty())//判斷明文文本框是否為空,為空則返回</p><p&
120、gt;<b> return;</b></p><p> for (int i = 0; i < m_ptxt.GetLength(); i++)</p><p><b> {</b></p><p> //取出明文的每個宇符,將其裝換為數字,通過加密函數power轉換后,生成的數字字符用"+&qu
121、ot;號相連,即為密文。</p><p> temp = encSt;</p><p> encSt.Format("%s%d%s",temp,power((int)m_ptxt.GetAt(i), m_code, m_n),"+");</p><p><b> }</b></p>&
122、lt;p> m_etxt = encSt;</p><p> UpdateData(false);</p><p><b> }</b></p><p> //解密密文(解密函數)</p><p> void CRSADlg::OnDecode() </p><p><b&g
123、t; {</b></p><p><b> int ptr;</b></p><p> int numstr;</p><p> CString temp = "";</p><p> UpdateData(true);</p><p> CString
124、 DecSt = "";</p><p> //int t = m_etxt.GetLength();</p><p> for (int i = 0; i < m_etxt.GetLength();)</p><p><b> {</b></p><p> //計算出密文宇符串的長度
125、,循環(huán)尋找以宇符“+”分隔得數字字符串,并將其//轉換問數字,然后調用powcr函數處理,將得出的數字轉換為字符,將得出的字符連//接起來就解密出了明文</p><p> ptr = m_etxt.Find("+", i);</p><p> numstr= atoi(m_etxt.Mid(i, ptr - i));//atoi函數功能是把字符串轉換成整型數。ASC
126、II to integer 的縮寫//numstr整數代表一個明文字符</p><p> temp = DecSt;</p><p> DecSt.Format("%s%c", temp, char(power(numstr, m_decode, m_n)));</p><p> i = i + num(numstr) + 1;//進行下一
127、個定位字符解密</p><p><b> }</b></p><p> m_dtxt = DecSt;</p><p> UpdateData(false);</p><p><b> }</b></p><p> int CRSADlg::num(int x)//
128、計算整數x有多少位</p><p><b> {</b></p><p> int n = 0;</p><p><b> while (x)</b></p><p><b> {</b></p><p><b> n++;</
129、b></p><p><b> x /= 10;</b></p><p><b> }</b></p><p><b> return n;</b></p><p><b> }</b></p><p><b&g
130、t; 第七章 學習感悟</b></p><p><b> 7.1 陳文韜</b></p><p> 我主要負責的是代碼的編寫,之所以選擇RSA算法就是因為其有挑戰(zhàn)性,自己我先前也收集到關于密碼學的相關算法,所以還算得上是有所選擇和準備。通過這次密碼學課程設計,我獲益匪淺,除了在對mfc的深入了解之外,還讓我學會了如何去封裝一個軟件,還有封裝軟件的相關
131、語言,這是我剛開始未曾預料到隨著對這個問題的深入而去收獲到的;在實現過程中,第一步是碰到電腦硬件配置問題,所以在產生隨機大素數方面出現電腦藍屏,后經過縮小位數來解決這個問題,但又考慮到保密性,故只能通過利用系統時間為隨機生成種子,和設置登錄窗口頁面,最后又考慮到如果封裝成一個軟件,并需要序列號才能安裝到系統里的話,安全性會大大增強,所以在這方面我又學習了相關的封裝語言和操作!</p><p> 這里,要感謝我的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 統計學生成績課程設計
- c語言課程設計-學生成績統計管理
- c++語言課程設計 ----學生成績統計
- c語言課程設計學生成績統計設計報告
- c語言課程設計報告-- 學生成績統計系統
- 學生成績管理---課程設計
- 課程設計---學生成績管理系統的設計和實現
- 課程設計--《學生成績管理系統》的設計與實現
- 學生成績課程設計報告
- 課程設計--- 學生成績管理系統設計與實現
- 學生成績管理系統課程設計
- 課程設計——學生成績管理系統
- 課程設計---學生成績管理系統
- 學生成績管理系統課程設計
- 學生成績管理匯編課程設計
- 學生成績管理系統課程設計
- 學生成績管理課程設計
- 學生成績管理課程設計
- 學生成績管理系統課程設計
- 學生成績管理系統課程設計
評論
0/150
提交評論