rsa算法課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論