版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘要:</b></p><p> RSA算法是基于數(shù)論的公鑰密碼體制,是公鑰密碼體制中最優(yōu)秀的加密算法,同時(shí)也是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。 RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA的安全性依賴于大數(shù)的因子分解,但并沒(méi)有從理論上證明破譯
2、RSA的難度與大數(shù)分解難度等價(jià)。本文主要研究的內(nèi)容包括:第一,對(duì)RSA算法進(jìn)行了全面系統(tǒng)的介紹,包括RSA算法的應(yīng)用現(xiàn)狀和原理—大素?cái)?shù)的產(chǎn)生、密鑰對(duì)的產(chǎn)生、對(duì)明文的加密運(yùn)算和密文的解密運(yùn)算,為具體實(shí)現(xiàn)打下了理論基礎(chǔ);第二,介紹了RSA機(jī)密體制的一些基本概念及原理;第三,詳述了RSA加密的設(shè)計(jì)與實(shí)現(xiàn),主要實(shí)現(xiàn)的模塊包括RSA密鑰的產(chǎn)生(一對(duì)公鑰和私鑰),RSA加密算法和解密算法的實(shí)現(xiàn);第五,對(duì)該系統(tǒng)進(jìn)行了整體的測(cè)試和分析改進(jìn); </
3、p><p> 關(guān)鍵詞:RSA算法;公鑰密碼體制;加密;解密;VC++</p><p><b> 目錄</b></p><p><b> 1 課題綜述1</b></p><p> 1.1 課題來(lái)源1</p><p> 1.2 課題意義1</p>
4、<p> 1.3 預(yù)期目標(biāo)1</p><p><b> 2 系統(tǒng)分析1</b></p><p> 2.1 基礎(chǔ)知識(shí)2</p><p> 2.2 總體方案4</p><p> 2.3 功能模塊4</p><p><b> 3 系統(tǒng)設(shè)計(jì)5<
5、;/b></p><p> 3.1 算法描述5</p><p> 3.2 流程圖7</p><p><b> 4 代碼編寫(xiě)9</b></p><p> 5 運(yùn)行與測(cè)試14</p><p> 5.1 產(chǎn)生公鑰和密鑰14</p><p>
6、5.2 加密與解密14</p><p><b> 總 結(jié)16</b></p><p><b> 致 謝17</b></p><p><b> 參考文獻(xiàn)18</b></p><p><b> 1 課題綜述</b></p>&
7、lt;p><b> 1.1 課題來(lái)源</b></p><p> 隨著電子信息技術(shù)的迅速發(fā)展,人類(lèi)已步入信息社會(huì)。但是由于整個(gè)社會(huì)形成了一個(gè)巨大的計(jì)算機(jī)網(wǎng)絡(luò),任何一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)出現(xiàn)的安全問(wèn)題,都會(huì)影響整個(gè)國(guó)家的網(wǎng)絡(luò)安全,所以信息安全、計(jì)算機(jī)網(wǎng)絡(luò)安全問(wèn)題已引起了人類(lèi)的高度重視。無(wú)論是在局域網(wǎng)還是在廣域網(wǎng)中,都存在著自然和人為等諸多因素的脆弱性和潛在威脅。故此,網(wǎng)絡(luò)的安全措施應(yīng)是能全方
8、位地針對(duì)各種不同的威脅和脆弱性,這樣才能確保網(wǎng)絡(luò)信息的保密性、完整性和可用性。現(xiàn)代密碼學(xué)已成為信息安全技術(shù)的核心,密碼學(xué)是以研究通信安全保密的學(xué)科,即研究對(duì)傳輸信息采用何種秘密的變換以防止第三者對(duì)信息的竊取。公鑰密碼體制的特點(diǎn)是:接收方B產(chǎn)生一對(duì)密鑰(PK和SK);PK公開(kāi),SK保密;從PK推出SK是很困難的;A、B雙方通信時(shí),A通過(guò)任何途徑取得B的公鑰,用B的公鑰加密信息,加密后的信息可通過(guò)任何不安全信道發(fā)送。B收到密文信息后,用自己
9、私鑰解密恢復(fù)出明文。公鑰密碼體制已成為確保信息的安全性的關(guān)鍵技術(shù)。RSA公鑰密碼體制到目前為止還是一種被認(rèn)可為安全的體制。</p><p><b> 1.2 課題意義</b></p><p> RSA公鑰加密算法是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也十分流行。算法的名字以發(fā)明者的姓氏首字母命名:Ron Rivest, Adi Sha
10、mir 和Leonard Adleman。雖然自1978年提出以來(lái),RSA的安全性一直未能得到理論上的證明,但它經(jīng)歷了各種攻擊,至今未被完全攻破。隨著越來(lái)越多的商業(yè)應(yīng)用和標(biāo)準(zhǔn)化工作,RSA已經(jīng)成為最具代表性的公鑰加密技術(shù)。VISA、MasterCard、IBM、Microsoft等公司協(xié)力制定的安全電子交易標(biāo)準(zhǔn)(Secure Electronic Transactions,SET)就采用了標(biāo)準(zhǔn)RSA算法,這使得RSA在我們的生活中幾乎無(wú)
11、處不在。網(wǎng)上交易加密連接、網(wǎng)上銀行身份驗(yàn)證、各種信用卡使用的數(shù)字證書(shū)、智能移動(dòng)電話和存儲(chǔ)卡的驗(yàn)證功能芯片等,大多數(shù)使用RSA技術(shù)。應(yīng)用了RSA加密體制保證了秘密信息的安全。</p><p><b> 1.3 預(yù)期目標(biāo)</b></p><p> 在充分理解RSA加密體制概念和原理的基礎(chǔ)上,用Microsoft Visual C++ 6.0實(shí)現(xiàn)RSA加密與解密,演示
12、公鑰與密鑰的生成及加密與解密的過(guò)程。</p><p><b> 2 系統(tǒng)分析</b></p><p><b> 2.1 基礎(chǔ)知識(shí)</b></p><p><b> 2.1.1 素?cái)?shù)</b></p><p> 稱(chēng)整數(shù)p(p>1)是素?cái)?shù),如果p的因子只有±
13、;1,±p。</p><p> 稱(chēng)c是兩個(gè)整數(shù)a、b的最大公因子,如果</p><p> ① c是a的因子也是b 的因子,即c是a、b的公因子。</p><p> ② a和b的任一公因子,也是c的因子。</p><p> 表示為c=gcd(a, b)。</p><p> 由于要求最大公因子為正,所以
14、gcd(a,b)=gcd(a,-b)=gcd(-a,b)=gcd(-a,-b)。一般gcd(a,b)=gcd(|a|,|b|)。由任一非0整數(shù)能整除0,可得gcd(a,0)=|a|。如果將a,b都表示為素?cái)?shù)的乘積,則gcd(a, b)極易確定。</p><p> 一般由c=gcd(a,b)可得: 對(duì)每一素?cái)?shù)p,cp=min(ap,bp)。</p><p> 由于確定大數(shù)的素因子不很容易
15、,所以這種方法不能直接用于求兩個(gè)大數(shù)的最大公因子,如何求兩個(gè)大數(shù)的最大公因子在下面介紹。</p><p> 如果gcd(a,b)=1,則稱(chēng)a和b互素。</p><p><b> 2.1.2 模運(yùn)算</b></p><p> 設(shè)n是一正整數(shù),a是整數(shù),如果用n除a,得商為q,余數(shù)為r,則</p><p> a=qn
16、+r,0≤r<n, </p><p> 其中x為小于或等于x的最大整數(shù)。</p><p> 用a mod n表示余數(shù)r</p><p> 如果(a mod n)=(b mod n),則稱(chēng)兩整數(shù)a和b模n同余,記為a≡b mod n。稱(chēng)與a模n同余的數(shù)的全體為a的同余類(lèi),記為[a],稱(chēng)a為這個(gè)同余類(lèi)的表示元素。</p>&l
17、t;p> 2.2.3 歐拉函數(shù)和歐拉定理</p><p> 歐拉函數(shù):設(shè)n是一正整數(shù),小于n且與n互素的正整數(shù)的個(gè)數(shù)稱(chēng)為n的歐拉函數(shù),記為φ(n)。若n是素?cái)?shù),則顯然有φ(n)=n-1。若n是兩個(gè)素?cái)?shù)p和q的乘積,則φ(n)=φ(p)×φ(q)=(p-1)×(q-1)。</p><p> 歐拉定理:若a和n互素,則aφ(n)≡1 mod n。</p
18、><p> 2.1.4 歐幾里德算法</p><p> 歐幾里得(Euclid)算法是數(shù)論中的一個(gè)基本技術(shù),是求兩個(gè)正整數(shù)的最大公因子的簡(jiǎn)化過(guò)程。而推廣的Euclid算法不僅可求兩個(gè)正整數(shù)的最大公因子,而且當(dāng)兩個(gè)正整數(shù)互素時(shí),還可求出其中一個(gè)數(shù)關(guān)于另一個(gè)數(shù)的乘法逆元。</p><p> 1. 求最大公因子:Euclid算法是基于下面一個(gè)基本結(jié)論: </p&
19、gt;<p> 對(duì)任意非負(fù)整數(shù)a和正整數(shù)b,有g(shù)cd(a, b)=gcd(b, a mod b)。</p><p><b> 2. 求乘法逆元:</b></p><p> 如果gcd(a, b)=1 ,則b在mod a下有乘法逆元(不妨設(shè)b<a),即存在一x (x<a),使得bx≡1 mod a。</p><p>
20、; 2.1.5 RSA算法中的計(jì)算問(wèn)題</p><p> 1. RSA的加密與解密過(guò)程</p><p> RSA的加密、解密過(guò)程都為求一個(gè)整數(shù)的整數(shù)次冪,再取模。如果按其含義直接計(jì)算,則中間結(jié)果非常大,有可能超出計(jì)算機(jī)所允許的整數(shù)取值范圍。如上例中解密運(yùn)算6677 mod 119,先求6677再取模,則中間結(jié)果就已遠(yuǎn)遠(yuǎn)超出了計(jì)算機(jī)允許的整數(shù)取值范圍。而用模運(yùn)算的性質(zhì):</p&g
21、t;<p> (a×b) mod n=[(a mod n)×(b mod n)] mod n</p><p> 就可減小中間結(jié)果再者,考慮如何提高加、解密運(yùn)算中指數(shù)運(yùn)算的有效性。例如求x16,直接計(jì)算的話需做15次乘法。然而如果重復(fù)對(duì)每個(gè)部分結(jié)果做平方運(yùn)算即求x,x2,x4,x8,x16則只需4次乘法。</p><p> 2. RSA密鑰的產(chǎn)生<
22、;/p><p> 產(chǎn)生密鑰時(shí),需要考慮兩個(gè)大素?cái)?shù)p、q的選取,以及e的選取和d的計(jì)算。</p><p> 因?yàn)閚=pq在體制中是公開(kāi)的,因此為了防止敵手通過(guò)窮搜索發(fā)現(xiàn)p、q,這兩個(gè)素?cái)?shù)應(yīng)是在一個(gè)足夠大的整數(shù)集合中選取的大數(shù)。如果選取p和q為10100左右的大素?cái)?shù),那么n的階為10200,每個(gè)明文分組可以含有664位(10200≈2664),即83個(gè)8比特字節(jié),這比DES的數(shù)據(jù)分組(8個(gè)8比
23、特字節(jié))大得多,這時(shí)就能看出RSA算法的優(yōu)越性了。因此如何有效地尋找大素?cái)?shù)是第一個(gè)需要解決的問(wèn)題。尋找大素?cái)?shù)時(shí)一般是先隨機(jī)選取一個(gè)大的奇數(shù)(例如用偽隨機(jī)數(shù)產(chǎn)生器),然后用素性檢驗(yàn)算法檢驗(yàn)這一奇數(shù)是否為素?cái)?shù),如果不是則選取另一大奇數(shù),重復(fù)這一過(guò)程,直到找到素?cái)?shù)為止。素性檢驗(yàn)算法通常都是概率性的,但如果算法被多次重復(fù)執(zhí)行,每次執(zhí)行時(shí)輸入不同的參數(shù),算法的檢驗(yàn)結(jié)果都認(rèn)為被檢驗(yàn)的數(shù)是素?cái)?shù),那么就可以比較有把握地認(rèn)為被檢驗(yàn)的數(shù)是素?cái)?shù)。</p
24、><p> 2.1.6公鑰密碼體制的基本概念</p><p> 在公鑰密碼體制以前的整個(gè)密碼學(xué)史中,所有的密碼算法,包括原始手工計(jì)算的、由機(jī)械設(shè)備實(shí)現(xiàn)的以及由計(jì)算機(jī)實(shí)現(xiàn)的,都是基于代換和置換這兩個(gè)基本工具。而公鑰密碼體制則為密碼學(xué)的發(fā)展提供了新的理論和技術(shù)基礎(chǔ),一方面公鑰密碼算法的基本工具不再是代換和置換,而是數(shù)學(xué)函數(shù);另一方面公鑰密碼算法是以非對(duì)稱(chēng)的形式使用兩個(gè)密鑰,兩個(gè)密鑰的使用對(duì)保密
25、性、密鑰分配、認(rèn)證等都有著深刻的意義??梢哉f(shuō)公鑰密碼體制的出現(xiàn)在密碼學(xué)史上是一個(gè)最大的而且是惟一真正的革命。公鑰密碼體制的概念是在解決單鑰密碼體制中最難解決的兩個(gè)問(wèn)題時(shí)提出的,這兩個(gè)問(wèn)題是密鑰分配和數(shù)字簽字。單鑰密碼體制在進(jìn)行密鑰分配時(shí)(看第5章),要求通信雙方或者已經(jīng)有一個(gè)共享的密鑰,或者可籍助于一個(gè)密鑰分配中心。對(duì)第一個(gè)要求,常??捎萌斯し绞絺魉碗p方最初共享的密鑰,這種方法成本很高,而且還完全依賴信使的可靠性。第二個(gè)要求則完全依賴于
26、密鑰分配中心的可靠性。第二個(gè)問(wèn)題數(shù)字簽字考慮的是如何為數(shù)字化的消息或文件提供一種類(lèi)似于為書(shū)面文件手書(shū)簽字的方法。1976年W.Diffie和M.Hellman對(duì)解決上述兩個(gè)問(wèn)題有了突破,從而提出了公鑰密碼體制。</p><p><b> 2.2 總體方案</b></p><p> 要實(shí)現(xiàn)生成公鑰和密鑰的功能,必須先生成兩個(gè)大素?cái)?shù)。方法是先設(shè)定隨機(jī)種子為系統(tǒng)當(dāng)前時(shí)
27、間,然后隨即生成兩個(gè)100以內(nèi)的隨機(jī)數(shù),并判斷其是否為素?cái)?shù),取出這兩個(gè)素?cái)?shù)。然后通過(guò)調(diào)用函數(shù)生成公鑰對(duì)和密鑰對(duì),同時(shí)顯示出結(jié)果到屏幕上。隨后可以用公鑰對(duì)明文進(jìn)行加密,將加密后的秘聞顯示出來(lái)。然后可以演示用密鑰對(duì)密文進(jìn)行解密,并將結(jié)果顯示到屏幕上。</p><p><b> 2.3 功能模塊</b></p><p> 本系統(tǒng)含有兩個(gè)功能模塊:</p>
28、<p> ?。?)公鑰和密鑰生成模塊:可以生成個(gè)100以內(nèi)的素?cái)?shù)p和q,以及n、e、d;</p><p> ?。?)加密和解密模塊:可以顯示加密后的數(shù)據(jù),點(diǎn)擊解密可顯示解密后數(shù)據(jù)。</p><p> 系統(tǒng)功能界面圖如下:</p><p> 圖2-1 系統(tǒng)功能界面圖</p><p><b> 3 系統(tǒng)設(shè)計(jì)</
29、b></p><p><b> 3.1 算法描述</b></p><p><b> RSA算法描述:</b></p><p><b> (1) 密鑰的產(chǎn)生</b></p><p> ?、?選兩個(gè)保密的大素?cái)?shù)p和q。</p><p> ?、?
30、計(jì)算n=p×q,φ(n)=(p-1)(q-1),其中φ(n)是n的歐拉函數(shù)值。</p><p> ?、?選一整數(shù)e,滿足1<e<φ(n),且gcd(φ(n),e)=1。</p><p> ?、?計(jì)算d,滿足d·e≡1 mod φ(n),即d是e在模φ(n)下的乘法逆元,因e與φ(n)互素,由模運(yùn)算可知,它的乘法逆元一定存在。</p><p
31、> ?、?以{e,n}為公開(kāi)鑰,{d,n}為秘密鑰。</p><p><b> (2) 加密</b></p><p> 加密時(shí)首先將明文比特串分組,使得每個(gè)分組對(duì)應(yīng)的十進(jìn)制數(shù)小于n,即分組長(zhǎng)度小于log2n。然后對(duì)每個(gè)明文分組m,作加密運(yùn)算: c≡me mod n</p><p><b> (3) 解密</b>
32、</p><p> 對(duì)密文分組的解密運(yùn)算為: </p><p> m≡cd mod n</p><p> 下面證明RSA算法中解密過(guò)程的正確性。</p><p> 證明: 由加密過(guò)程知c≡me mod n,所以</p><p> cd mod n≡med mod n≡m1 mod φ(n) mod n≡mkφ
33、(n)+1 mod n</p><p> 要獲得兩個(gè)隨機(jī)的小于100的素?cái)?shù),可以首先將系統(tǒng)當(dāng)前時(shí)間設(shè)置為隨機(jī)數(shù)種子,然后對(duì)生成的隨機(jī)數(shù)取100模,然后調(diào)用判斷素?cái)?shù)的函數(shù)。要判斷一個(gè)屬實(shí)否為素?cái)?shù),可以判斷數(shù)n從2到n的開(kāi)方,是否能整除n。偽代碼如下:</p><p> for(i從 2 到 n的開(kāi)方 ; i++)</p><p><b> {</
34、b></p><p><b> if(n被i整除)</b></p><p> 則n不是素?cái)?shù)終止循環(huán);</p><p> if(i > n的開(kāi)方 )</p><p><b> 返回n為宿舍;</b></p><p><b> }</b>
35、;</p><p> 求最大公因子的算法:Euclid算法就是用這種方法,因gcd(a, b)=gcd(|a|, |b|),因此可假定算法的輸入是兩個(gè)正整數(shù),設(shè)為d,f,并設(shè)f >d。</p><p> Euclid(f, d)</p><p> ?、賆←f; Y←d;</p><p> ?、?if Y=0 then return
36、X=gcd(f,d);</p><p> ?、?R=X mod Y;</p><p><b> ④ X=Y;</b></p><p><b> ?、?Y=R;</b></p><p><b> ?、?goto ②。</b></p><p> 求乘法逆
37、元:推廣的Euclid算法先求出gcd(a, b),當(dāng)gcd(a, b)=1時(shí),則返回b的逆元。</p><p> Extended Euclid(f, d) (設(shè) f >d) </p><p> ?、?(X1,X2,X3)←(1,0,f);(Y1,Y2,Y3)←(0,1,d);</p><p> ?、?if Y3=0 then return X3=gcd
38、(f, d);no inverse;</p><p> ?、?if Y3=1 then return Y3=gcd(f, d);Y2=d-1 mod f;</p><p> ?、?Q=X3Y3 ;</p><p> ⑤ (T1,T2,T3)←(X1-QY1,X2-QY2,X3-QY3);</p><p> ?、?(X1,X2,X3)←(
39、Y1,Y2,Y3);</p><p> ?、?(Y1,Y2,Y3)←(T1,T2,T3);</p><p><b> ⑧ goto ②。</b></p><p> 處理明文:將明文的每個(gè)字符提取出來(lái)將其裝換為數(shù)字。進(jìn)行加密處理,將處理后的數(shù)字字符用“+”號(hào)相連。其中加密的算法為:求am可如下進(jìn)行,其中a,m是正整數(shù): </p>
40、<p> 將m表示為二進(jìn)制形式bk bk-1…b0,即</p><p> m=bk2k+bk-12k-1+…+b12+b0</p><p><b> 因此:</b></p><p> 例如:19=1×24+0×23+0×22+1×21+1×20,所以</p>&
41、lt;p> a19=((((a1)2a0)2a0)2a1)2a1</p><p> 從而可得以下快速指數(shù)算法:</p><p><b> c=0; d=1;</b></p><p> For i=k downto 0 d0 {</p><p><b> c=2×c;</b>
42、;</p><p> d=(d×d) mod n;</p><p> if bi=1 then {</p><p><b> c=c+1;</b></p><p> d=(d×a) mod n</p><p><b> }</b></p&
43、gt;<p><b> }</b></p><p><b> return d.</b></p><p> 其中d是中間結(jié)果,d的終值即為所求結(jié)果。c在這里的作用是表示指數(shù)的部分結(jié)果,其終值即為指數(shù)m,c對(duì)計(jì)算結(jié)果無(wú)任何貢獻(xiàn),算法中完全可將之去掉。</p><p> 解密過(guò)程:將“+”連接的數(shù)字字符轉(zhuǎn)
44、換為數(shù)字并相加,用密鑰做與加密相同的算法,即可得出明文。</p><p><b> 3.2 流程圖</b></p><p> 圖3-1 生成公鑰和私鑰流程圖 </p><p> 圖3-2 明文加密流程圖</p><p> 圖3-3 密文解密流程圖</p><p><b> 4
45、 代碼編寫(xiě)</b></p><p> 在RSADlg.h中聲明成員變量:</p><p><b> intm_p;</b></p><p><b> intm_q;</b></p><p><b> intm_n;</b></p>
46、<p> intm_code;</p><p> intm_decode;</p><p> CStringm_dtxt;</p><p> CStringm_etxt;</p><p> CStringm_ptxt;</p><p> 1.產(chǎn)生公鑰和密鑰:</p>
47、<p> void CRSADlg::OnButtonProduce() //產(chǎn)生公鑰和密鑰函數(shù)</p><p><b> {</b></p><p> UpdateData(true);</p><p> while(true)</p><p><b> {</b></
48、p><p> srand(time(0));</p><p> m_p = rand() % 100;</p><p> m_q = rand() % 100;</p><p> if (isPrime(m_p) && isPrime(m_q))</p><p><b> break;&
49、lt;/b></p><p><b> }</b></p><p> m_n = m_p * m_q;</p><p> int fiN = (m_p - 1) * (m_q - 1);</p><p><b> //int e;</b></p><p> f
50、or (int i = 3; i < fiN; i++)</p><p><b> {</b></p><p> if (isPrime(i) && gcd(fiN, i) == 1)</p><p><b> {</b></p><p> m_code = i;<
51、;/p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> Euler(m_code, fiN);</p><p> UpdateData(false);</p
52、><p><b> }</b></p><p> 代碼分析:首先設(shè)置系統(tǒng)的當(dāng)前時(shí)間為隨機(jī)種子,循環(huán)找出p和q并且調(diào)用判斷素?cái)?shù)的函數(shù)isPrime(int)使p,q都為小于100的素?cái)?shù),然后fiN = (m_p - 1) * (m_q - 1)產(chǎn)生fiN,產(chǎn)生m_n = m_p * m_q,通過(guò)調(diào)用gcd(fiN, i)找出與fiN互素的數(shù)m_code,調(diào)用uler(m
53、_code, fiN)找出m_decode,最后UpdateData(false)刷新文本框顯示出結(jié)果。</p><p><b> 2.加密明文:</b></p><p> void CRSADlg::OnCode() //加密函數(shù)</p><p><b> {</b></p><p>
54、 CString temp;</p><p> UpdateData(true);</p><p> CString encSt = "";</p><p> CString e2st = "";</p><p> if (m_ptxt.IsEmpty())</p><p&g
55、t;<b> return;</b></p><p> for (int i = 0; i < m_ptxt.GetLength(); i++)</p><p><b> {</b></p><p> temp = encSt;</p><p> encSt.Format("
56、;%s%d%s",temp,power((int)m_ptxt.GetAt(i), m_code, m_n),"+");</p><p><b> }</b></p><p> m_etxt = encSt;</p><p> UpdateData(false);</p><p>&l
57、t;b> }</b></p><p> 代碼分析:首先判斷明文文本框是否為空,若為空則返回。取出明文的每個(gè)字符,將其裝換為數(shù)字,通過(guò)加密函數(shù)power轉(zhuǎn)換后,生成的數(shù)字字符用“+”號(hào)相連,即為密文。調(diào)用UpdateData(false)刷新文本框,顯示加密后的結(jié)果。</p><p><b> 3.解密密文</b></p><
58、p> void CRSADlg::OnDecode() // 解密函數(shù)</p><p><b> {</b></p><p><b> int ptr;</b></p><p><b> int tok;</b></p><p> CString temp
59、= "";</p><p> UpdateData(true);</p><p> CString DecSt = "";</p><p> //int t = m_etxt.GetLength();</p><p> for (int i = 0; i < m_etxt.GetLeng
60、th();)</p><p><b> {</b></p><p> ptr = m_etxt.Find("+", i);</p><p> tok = atoi(m_etxt.Mid(i, ptr - i));</p><p> temp = DecSt;</p><p&
61、gt; DecSt.Format("%s%c", temp, char(power(tok, m_decode, m_n)));</p><p> i = i + num(tok) + 1;</p><p><b> }</b></p><p> m_dtxt = DecSt;</p><p>
62、; UpdateData(false);</p><p><b> }</b></p><p> 代碼分析:計(jì)算出密文字符串的長(zhǎng)度,循環(huán)尋找以字符“+”分隔得數(shù)字字符串,并將其轉(zhuǎn)換問(wèn)數(shù)字,然后調(diào)用power函數(shù)處理,將得出的數(shù)字轉(zhuǎn)換為字符,將得出的字符連接起來(lái)就解密出了明文,最后調(diào)用UpdateData(false)刷新文本框,顯示出解密出的結(jié)果。</p&
63、gt;<p><b> 4.其他函數(shù):</b></p><p> int CRSADlg::power(int a, int n, int m) //求出a的n次方模m的值</p><p><b> {</b></p><p> int z=1, t;</p><p> fo
64、r(t=a; n>0; n>>=1)</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> r
65、eturn(z);</p><p><b> }</b></p><p> BOOL CRSADlg::isPrime(int x) //判斷整數(shù)i是否為素?cái)?shù)</p><p><b> {</b></p><p><b> int i;</b></p>
66、<p> for (i = 2; i <= (int)sqrt(x); i++)</p><p><b> {</b></p><p> if (x % i == 0)</p><p><b> break;</b></p><p><b> }</b&g
67、t;</p><p> if (i > (int)sqrt(x))</p><p> return true;</p><p> return false;</p><p><b> }</b></p><p> int CRSADlg::gcd(int a, int b) //
68、求出a與b的公因子</p><p><b> {</b></p><p> if (a == 0)</p><p><b> {</b></p><p><b> return b;</b></p><p><b> }</b&
69、gt;</p><p><b> else</b></p><p><b> {</b></p><p> return gcd(b % a, a);</p><p><b> }</b></p><p><b> }</b&g
70、t;</p><p> void CRSADlg::Euler(int e, int fin) //求出e相對(duì)模fin的乘法逆元</p><p><b> {</b></p><p> int u1 = 1;</p><p> int u2 = 0;</p><p> int u3 =
71、 fin;</p><p> int v1 = 0;</p><p> int v2 = 1;</p><p> int v3 = e;</p><p> int v = 1;</p><p> int t1, t2, t3;</p><p><b> int q;<
72、/b></p><p> int uu, vv;</p><p> int inverse, z;</p><p> while (v3 != 0)</p><p><b> {</b></p><p> q = (int)(u3 /v3);</p><p>
73、; t1 = u1 - q * v1;</p><p> t2 = u2 - q * v2;</p><p> t3 = u3 - q * v3;</p><p><b> u1 = v1;</b></p><p><b> u2 = v2;</b></p><p>
74、;<b> u3 = v3;</b></p><p><b> v1 = t1;</b></p><p><b> v2 = t2;</b></p><p><b> v3 = t3;</b></p><p><b> z = 1;&
75、lt;/b></p><p><b> }</b></p><p><b> uu = u1;</b></p><p><b> vv = u2;</b></p><p> if (vv < 0)</p><p> inverse
76、= vv + fin;</p><p><b> else</b></p><p> inverse = vv;</p><p> m_decode = inverse;</p><p><b> }</b></p><p><b> 5 運(yùn)行與測(cè)試&l
77、t;/b></p><p> 5.1 產(chǎn)生公鑰和密鑰</p><p> 點(diǎn)擊密鑰生成,運(yùn)行效果如下圖:</p><p> 圖5-1 產(chǎn)生公鑰和密鑰效果圖</p><p> 5.2 加密與解密</p><p> 1.點(diǎn)擊加密,運(yùn)行效果如下圖:</p><p> 圖5-2 加密
78、效果圖</p><p> 2.點(diǎn)擊解密,運(yùn)行效果如下圖:</p><p> 圖5-3 解密效果圖</p><p><b> 總 結(jié)</b></p><p> 通過(guò)這次課程設(shè)計(jì),我對(duì)RSA加密體制有了更進(jìn)一步的了解。遇到的主要問(wèn)題是如何將明文按照比特分組并對(duì)其實(shí)現(xiàn)RSA加密,以及對(duì)大素?cái)?shù)的處理。最終大素?cái)?shù)的處理得以
79、實(shí)現(xiàn),但明文分組并沒(méi)有找到合適的方法,這就要求我在課程設(shè)計(jì)后去學(xué)習(xí)怎樣為明文分組機(jī)密。要想學(xué)好現(xiàn)代密碼學(xué)不僅要學(xué)習(xí)好密碼學(xué)相關(guān)知識(shí),還要有很好的數(shù)學(xué)基礎(chǔ),還有很強(qiáng)的編程能力,這個(gè)課程設(shè)計(jì)是用Microsoft Visual C++ 6.0的開(kāi)發(fā)環(huán)境寫(xiě)的,這對(duì)編程要求很高,不僅要會(huì)密碼學(xué)中RSA的加密機(jī)制,算法還要熟知VC++的編程方法,要對(duì)微軟的MFC的基本編程方法要熟悉。課程設(shè)計(jì)時(shí)對(duì)學(xué)生個(gè)人綜合能力的檢驗(yàn)。任何知識(shí)和技術(shù)都不是孤立的。
80、要學(xué)習(xí)好密碼學(xué)要牽扯到線性代數(shù),離散數(shù)學(xué),概率統(tǒng)計(jì)等數(shù)學(xué)知識(shí),為了驗(yàn)證加密解密算法的正確性,還要?jiǎng)邮志幹瞥绦?,這就要求學(xué)生要對(duì)至少一種編程技術(shù)有所熟知。對(duì)RSA加密體制還可以運(yùn)用到手機(jī)等終端設(shè)備的加密,也可嵌入到其他小型化的設(shè)備中去,下一步我們講進(jìn)一步對(duì)這些方向進(jìn)行研究。</p><p><b> 致 謝</b></p><p> 感謝老師給了這次機(jī)會(huì)給我們做這次
81、課程設(shè)計(jì),讓我們能夠把平時(shí)所學(xué)的東西用上,不至于讓我們覺(jué)得平時(shí)學(xué)的東西沒(méi)什么用,在這短短的時(shí)間里完成了本次課程設(shè)計(jì),要感謝朋友們的幫忙,在我困惑的時(shí)候要不是你們,我可能早就放棄了,因?yàn)槟銈兊膸兔?,我才能順利的完成這次系統(tǒng)。其實(shí)最辛苦的還是老師,請(qǐng)?jiān)试S我向你們說(shuō)聲謝謝,感謝你們對(duì)我們的教誨。</p><p> 在這次課程設(shè)計(jì)的過(guò)程中,我覺(jué)得我真的是獲得了很多的東西,不僅僅是動(dòng)手能力及編程能力得到了很大的提高,也不
82、僅僅是在修改程序錯(cuò)誤方面,主要是在程序編寫(xiě)過(guò)程中獲得了大量的寶貴的經(jīng)驗(yàn)。此外,在這次實(shí)踐過(guò)程中發(fā)現(xiàn)數(shù)據(jù)庫(kù)是一門(mén)十分實(shí)用的課程,也體會(huì)到學(xué)好數(shù)據(jù)庫(kù)對(duì)我們以后的學(xué)習(xí),工作是十分重要的。因而在此,我要感謝那些在實(shí)踐過(guò)程中給過(guò)我?guī)椭凸膭?lì)的人。</p><p> 最后對(duì)所有在課程設(shè)計(jì)中幫助過(guò)我的老師和同學(xué)說(shuō)一聲謝謝。</p><p><b> 參考文獻(xiàn)</b></p
83、><p> 1 楊波.現(xiàn)代密碼學(xué).第2版.北京:清華大學(xué)出版社,2008</p><p> 2 谷利澤,鄭世慧,楊義先.現(xiàn)代密碼學(xué)教程.北京:北京郵電大學(xué)出版社,2009</p><p> 3丁存生,肖國(guó)鎮(zhèn).流密碼學(xué)及其應(yīng)用. 北京:國(guó)防工業(yè)出版社,1994</p><p> 4馮登國(guó),吳文玲.分組密碼的設(shè)計(jì)與分析. 北京:清華大學(xué)出版社
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- rsa算法課程設(shè)計(jì)報(bào)告
- rsa算法實(shí)現(xiàn)課程設(shè)計(jì)報(bào)告
- 蟻群算法課程設(shè)計(jì)報(bào)告
- 算法分析與設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 蟻群算法課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)---電梯調(diào)度算法設(shè)計(jì)報(bào)告
- rsa實(shí)現(xiàn)課程設(shè)計(jì)--學(xué)生成績(jī)的統(tǒng)計(jì)
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 算法課程設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告----內(nèi)排序算法比較
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 算法課程設(shè)計(jì)
- c實(shí)現(xiàn)關(guān)鍵路徑算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮算法
- 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論