基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文

上傳人:good****022 文檔編號:116787693 上傳時間:2022-07-06 格式:DOC 頁數(shù):38 大小:413KB
收藏 版權(quán)申訴 舉報 下載
基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第1頁
第1頁 / 共38頁
基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第2頁
第2頁 / 共38頁
基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第3頁
第3頁 / 共38頁

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文》由會員分享,可在線閱讀,更多相關(guān)《基于JAVA的RSA文件加密軟件的設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、摘 要分析RSA算法的應(yīng)用現(xiàn)狀,論證文件加密應(yīng)用RSA算法的可行性和意義。設(shè)計一套完整實用的RSA文件加密解決方案,具體編碼實現(xiàn)。對RSA算法進行研究,從常規(guī)RSA算法出發(fā),用C+實現(xiàn)RSA加密算法類庫,并在32位windows平臺封裝成組件。在.Net平臺引用此組件,實現(xiàn)可以對任意文件進行RSA加密操作的窗體應(yīng)用程序。經(jīng)過加密的文件以及密鑰文件都是文本文件。給出關(guān)鍵類類圖、整個應(yīng)用程序的結(jié)構(gòu)描述文檔、關(guān)鍵模塊流程圖、較詳細的接口文檔、所有源代碼。對應(yīng)用程序進行測試,對測試結(jié)果進行分析研究,進而對應(yīng)用程序進行改進,對關(guān)鍵算法進行盡可能的優(yōu)化,最終得到一個在windows運行的可以用指定密鑰對任

2、意文件進行RSA加密并可解密的完整應(yīng)用程序,和一些相關(guān)的可移植組件。關(guān)鍵詞 RSA RSA算法 文件加密 加密成文本AbstractDo research about the application area of RSA encryption and reason that RSA can be used for file encryption. Design a RSA file-encrypt solution and complete an application on Microsoft Windows. Design a C+ class based on normal RSA a

3、lgorithm. And make a DLL module based on the class. Then complete a .Net Framework window-application using that DLL. The application can encrypt any file and decrypt them. The file after encryption can be saved as a text file. And the encryption-keys also can be saved as text.Provide pivotal classe

4、s chart, project description, core algorithm flowchart, all source code, and module interfaces document. Do application performance test and record the performance data. Analyze the result then optimize core algorithm and improve the application. Finally, create a practical application using RSA alg

5、orithm that can encrypt and decrypt any file. And several modules in the project can be reuse by other applications. For instance, the C+ class can be cross-compiled for handheld devices, the DLL can be referenced by other win32 applications, and the .Net class can be easily referenced by web server

6、 applications or web services.Keywords RSA RSA algorithm file encryption encrypt to text 目 錄前 言1第1章 RSA應(yīng)用現(xiàn)狀及應(yīng)用于文件加密的分析21.1 RSA算法介紹與應(yīng)用現(xiàn)狀21.2 RSA應(yīng)用于文件加密的分析31.2.1 文件加密使用RSA的可行性31.2.2 文件加密使用RSA的意義4第2章 RSA文件加密軟件的設(shè)計與實現(xiàn)62.1 需求分析與總體設(shè)計62.1.1 功能分析62.1.2 工程方案選擇72.2 各部分的設(shè)計與開發(fā)82.2.1 實現(xiàn)RSA加密算法的C+核心類庫82.2.2 封裝C+核心

7、類庫的DLL組件182.2.3 引用DLL的.Net類與實現(xiàn)文件操作功能的窗體應(yīng)用程序19第3章 軟件整體測試與分析改進203.1 編寫測試各項性能需要的精確計時類203.2 測試數(shù)據(jù)與分析改進203.2.1 密鑰生成測試203.2.2 數(shù)據(jù)輸入輸出測試233.2.3 加密解密測試233.2.4 性能分析與改進優(yōu)化263.3 使用中國余數(shù)定理27第4章 可移植模塊的簡要說明與開發(fā)前景29結(jié)束語30謝 辭31參考文獻32附 錄33前 言RSA公鑰加密算法是第一個既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也十分流行。算法的名字以發(fā)明者的姓氏首字母命名:Ron Rivest, Adi

8、 Shamir 和Leonard Adleman。雖然自1978年提出以來,RSA的安全性一直未能得到理論上的證明,但它經(jīng)歷了各種攻擊,至今(2006年)未被完全攻破。隨著越來越多的商業(yè)應(yīng)用和標準化工作,RSA已經(jīng)成為最具代表性的公鑰加密技術(shù)。VISA、MasterCard、IBM、Microsoft等公司協(xié)力制定的安全電子交易標準(Secure Electronic Transactions,SET)就采用了標準RSA算法,這使得RSA在我們的生活中幾乎無處不在。網(wǎng)上交易加密連接、網(wǎng)上銀行身份驗證、各種信用卡使用的數(shù)字證書、智能移動電話和存儲卡的驗證功能芯片等,大多數(shù)使用RSA技術(shù)。當(dāng)今公鑰

9、加密更廣泛應(yīng)用于互聯(lián)網(wǎng)身份認證,本課題將公鑰加密算法RSA應(yīng)用于小型文件加密。將任意文件加密成文本的解決方案,使其使用更加靈活。整個工程的分層設(shè)計,給引用移植和后續(xù)開發(fā)帶來便利。第1章 RSA應(yīng)用現(xiàn)狀及應(yīng)用于文件加密的分析1.1 RSA算法介紹與應(yīng)用現(xiàn)狀RSA算法可以簡單敘述如下:取素數(shù)p,q,令n=pq.取與(p-1)(q-1)互素的整數(shù)e,由方程de=1 (mod (p-1)(q-1)解出d,二元組(e,n)作為公開密鑰,二元組(d,n)作為私有密鑰b=ae mod n,c=bd mod n.附錄中給出了證明a=c (mod n).(具體的RSA算法協(xié)議見http:/www.di-.au/

10、rsa_alg.html ,提及的算法中的字母與協(xié)議文檔中的一致,不再另做解釋)RSA公開密鑰加密算法自20世紀70年代提出以來,已經(jīng)得到了廣泛認可和應(yīng)用。發(fā)展至今,電子安全領(lǐng)域的各方面已經(jīng)形成了較為完備的國際規(guī)范。RSA作為最重要的公開密鑰算法,在各領(lǐng)域的應(yīng)用數(shù)不勝數(shù)。RSA在硬件方面,以技術(shù)成熟的IC應(yīng)用于各種消費類電子產(chǎn)品。RSA在軟件方面的應(yīng)用,主要集中在Internet上。加密連接、數(shù)字簽名和數(shù)字證書的核心算法廣泛使用RSA。日常應(yīng)用中,有比較著名的工具包Open SSL(SSL,Security Socket Layer,是一個安全傳輸協(xié)議,在Internet上進行數(shù)據(jù)保護和身份確

11、認。Open SSL是一個開放源代碼的實現(xiàn)了SSL及相關(guān)加密技術(shù)的軟件包,由加拿大的Eric Yang等發(fā)起編寫的。相關(guān)詳細介紹見http:/www.openssl.org/about/ )。Open SSL應(yīng)用RSA實現(xiàn)簽名和密鑰交換,已經(jīng)在各種操作系統(tǒng)得到非常廣泛的應(yīng)用。另外,家喻戶曉的IE瀏覽器,自然也實現(xiàn)了SSL協(xié)議,集成了使用RSA技術(shù)的加密功能,結(jié)合MD5和SHA1,主要用于數(shù)字證書和數(shù)字簽名,對于習(xí)慣于使用網(wǎng)上購物和網(wǎng)上銀行的用戶來說,幾乎天天都在使用RSA技術(shù)。RSA更出現(xiàn)在要求高度安全穩(wěn)定的企業(yè)級商務(wù)應(yīng)用中。在當(dāng)今的企業(yè)級商務(wù)應(yīng)用中,不得不提及使用最廣泛的平臺j2ee。事實上

12、,在j2se的標準庫中,就為安全和加密服務(wù)提供了兩組API:JCA和JCE。 JCA (Java Cryptography Architecture)提供基本的加密框架,如證書、數(shù)字簽名、報文摘要和密鑰對產(chǎn)生器; JCA由幾個實現(xiàn)了基本的加密技術(shù)功能的類和接口組成,其中最主要的是java.security包,此軟件包包含的是一組核心的類和接口,Java中數(shù)字簽名的方法就集中在此軟件包中。JCE(Java Cryptography Extension) 在JCA的基礎(chǔ)上作了擴展,JCE也是由幾個軟件包組成,其中最主要的是javax.crypto包,此軟件包提供了JCE加密技術(shù)操作API。java

13、x.crypto中的Cipher類用于具體的加密和解密。在上述軟件包的實現(xiàn)中,集成了應(yīng)用RSA算法的各種數(shù)據(jù)加密規(guī)范(RSA算法應(yīng)用規(guī)范介紹參見: http:/ ,這些API內(nèi)部支持的算法不僅僅只有RSA,但是RSA是數(shù)字簽名和證書中最常用的),用戶程序可以直接使用java標準庫中提供的API進行數(shù)字簽名和證書的各種操作。單機應(yīng)用程序使用RSA加密尚比較少見,例如使用RSA加密任意一個文件。1.2 RSA應(yīng)用于文件加密的分析1.2.1 文件加密使用RSA的可行性通過1.1節(jié)的論述,不難看出RSA當(dāng)今的應(yīng)用多在于數(shù)字簽名和證書等方面。之所以只應(yīng)用于這些短小數(shù)據(jù)的加密解密,是因為RSA算法加密極慢

14、,速度是DES對稱密鑰加密速度的千分之一左右。正是因為這樣,把RSA應(yīng)用于普通文件加密的想法一直被忽略。通常文件被想象成大數(shù)據(jù)塊,但是實際上在日常應(yīng)用中,有些極其重要的文本資料是并不太大的,比如因擔(dān)心遺忘而用普通文本記錄的銀行帳號和密碼、不應(yīng)被陌生人知道的重要電話號碼、幾千字節(jié)大的重要小圖片等。雖然RSA加密運算的速度十分慢,但是在PC性能越來越好的今天,對于幾千字節(jié)的數(shù)據(jù)進行一次幾百位密鑰的RSA加密,所消耗的時間應(yīng)該是可以接受的。下面結(jié)合大數(shù)運算程序的調(diào)試,從理論上簡單的分析消耗時間。在一臺普通配置的PC機上對一個整數(shù)進行冪模運算,因為公開密鑰的e通常取的較小,所以指數(shù)取一個小整數(shù),比如C

15、353,模一個70字節(jié)長的整數(shù)(140位十六進制,大數(shù)單元以線性組方式實現(xiàn),對應(yīng)到RSA算法中,這相當(dāng)于約560bit的n),調(diào)試一個函數(shù)測試,按初等數(shù)論中的知識對程序進行算法優(yōu)化,最終在一臺配置為AMD Athron2800+,外頻333MHZ,物理內(nèi)存512MB的PC上測試需要約45毫秒時間。如果按這種速度,逐字節(jié)對1KB的數(shù)據(jù)進行同樣的運算,所消耗的時間理論上為45毫秒的1024倍即約45秒。這個時間并不是非常長。其實從一個簡單的角度來說,既然RSA用于數(shù)字簽名可行,那就完全可以用于同樣大小的普通文件。對于較大的文件,如果分成與數(shù)字簽名同樣大小的段(這里假設(shè)數(shù)字簽名較短,不分段一次計算加

16、密完成),分開的各段逐一進行加密運算,那所需要的時間也只是按文件大小線性的增長。通常數(shù)字簽名為幾十字節(jié),加密運算并不需要很長的等待,這就說明對于幾百字節(jié)或一兩K字節(jié)大小的文件來說,如果進行RSA加密,并不會是非常漫長的工作。當(dāng)然,如果文件更大,加密就顯得十分漫長了。比如按前面敘述的45毫秒大數(shù)運算程序推理,加密1M字節(jié)大小的文件需要約1天的時間。所以,要在普通PC用幾百位以上的長密鑰RSA加密文件,文件不能過大,一般可以接受的上限是幾KB。如果要在較短時間內(nèi)加密大文件,需要縮短密鑰長度以減小運算量,這將帶來安全性隱患。本文的第3章將根據(jù)實際調(diào)試好的軟件,測試給出具體的時間消耗數(shù)據(jù)。例如,在一臺

17、配置為AMD Athron2800+,外頻333MHZ,物理內(nèi)存512MB的PC上測試實現(xiàn)的軟件,以560bit的n逐字節(jié)加密一個1KB大小的文件需要55秒。通常記錄如銀行帳號密碼等重要數(shù)據(jù)的文本文件大小不足百字節(jié),加密只需要數(shù)秒鐘。所以對于小型文件,進行較長密鑰的RSA加密是完全可行的。1.2.2 文件加密使用RSA的意義如1.2.1節(jié)所述,小型文件加密可以使用RSA。比如,因擔(dān)心遺忘而用普通文本記錄的銀行帳號和密碼、不應(yīng)被陌生人知道的重要電話號碼、幾千字節(jié)大的重要小圖片等??尚械姆椒ㄎ幢厥潜匾?,本小節(jié)討論何種文件適合用非對稱密鑰加密,即RSA加密文件的意義所在。對于前面敘述的帶有重要信息

18、的小型文本和二進制數(shù)據(jù)的維護,如果不加密,將無法放心的保存在計算機上,尤其是連網(wǎng)的或機房里的公共計算機。如果借助功能強大的大型多用戶數(shù)據(jù)保護程序維護幾個小型文件,顯得十分煩瑣,好比殺雞用牛刀。如果采用對稱密鑰加密,即加密解密的密鑰相同,只適合部分情況。在某些情況下,使用對稱密鑰加密文件,交流使用不夠方便。比如,張三由于某種原因,需要將自己的某個文件在公共計算機上留給李四,而不希望別人看到內(nèi)容。如果采用對稱密鑰加密,張三和李四提前約好一個密碼就可以。但是如果張三想要在同一臺公共計算機上再留一個秘密文件給王五,而不希望別人看到,就要和王五另外約定一個密碼。如果需要在這臺公共計算機上留十個文件給不同

19、的人,自己就要記和十個人約定好的密碼,這樣以來交流起來不夠方便,因為對于張三,要自己維護太多的密鑰。非對稱密鑰(公開密鑰方式)恰好解決這樣的問題。只要大家都在這臺計算機或這臺計算機可以訪問到的地方,留下自己的公開密鑰,一切就變的容易解決了。張三要留給李四的文件,就用李四的公開密鑰加密,要留給王五的文件,就用王五的公開密鑰加密。李四和王五只要把留給自己的文件用自己的私有密鑰解密,就可以得到留給自己的文件了。顯然,非對稱密鑰體制更適合多用戶交流,而將這種加密方式直接應(yīng)用于文件加密,使我們在公開場合的交流更加靈活方便。一種更實際的情況是,我們想通過Internet上的公眾論壇或郵件發(fā)送重要保密信息給

20、某人。例如發(fā)送一個銀行帳號和密碼給某人。這種情況要保證安全,在當(dāng)今互聯(lián)網(wǎng)絡(luò)上是比較棘手的。如果用公眾論壇直接留言給指定用戶,論壇管理員和服務(wù)器管理員通常有方法看到數(shù)據(jù)。如果發(fā)送郵件,雖然傳送過程是加密的,但是密碼畢竟是由郵件服務(wù)器維護,所以系統(tǒng)管理員通常也有辦法看到內(nèi)容。問題的關(guān)鍵在于我們所有的數(shù)據(jù)包括密鑰保存在服務(wù)器之上。在這種情況下,我們需要使用公開密鑰方式,并自己維護私有密鑰。RSA文件加密可以靈活的解決這些問題。例如,我們可以將任意一個文件用某人的公開密鑰加密變換成一段可以復(fù)制粘貼的文本,然后粘貼在公眾互聯(lián)網(wǎng)上,對方只需把需要解密的文本復(fù)制保存成一個文本文件,在本地機用自己的私有密鑰解

21、密即可。我們可以將自己的私有密鑰通過DES加密后保存在自己的移動磁盤上,使用的時候只要將其解密讀取即可,用完后立即從當(dāng)前操作環(huán)境清除。這樣,我們自己維護自己的私有密鑰,利用簡單并且公開的方式,可以安全傳送任意小型數(shù)據(jù),包括一切二進制文件。所以,對于使用小型文件進行數(shù)據(jù)交換的情況,更好的方案是通過一個小型應(yīng)用程序?qū)@些文件進行非對稱密鑰加密。為了適合前面敘述的在公共BBS與特定的某人交流重要保密信息的情況,加密生成的數(shù)據(jù)應(yīng)該是文本,這樣可以方便復(fù)制粘貼。綜上所述,使用前面敘述的方式加密文件有兩點重要意義:應(yīng)用非對稱密鑰加密任意文件,使非對稱密鑰的應(yīng)用不僅僅局限于互聯(lián)網(wǎng)絡(luò)。非對稱加密后的數(shù)據(jù)變換成

22、文本,使得我們可以通過幾乎任何方式安全傳遞任意文件,比如在只有http的環(huán)境使用xml方式。第2章 RSA文件加密軟件的設(shè)計與實現(xiàn)2.1 需求分析與總體設(shè)計2.1.1 功能分析經(jīng)過1.2.2節(jié)的論述,我們可以將對軟件的要求總結(jié)如下:可以按要求的位數(shù)生成非對稱密鑰??梢员4婷荑€和裝載密鑰,密鑰保存為純文本。可以用指定密鑰以RSA算法加密任意一個文件,加密生成的數(shù)據(jù)為純文本。可以裝載加密過的文件,并用指定的密鑰解密還原出原文件。提示信息完整、操作舒適、圖形界面雅觀按上述描述,給出Use Case和Statechart如圖2-1。圖2-1 本項目的 Use Case和Statechart根據(jù)以上分析

23、,一般來說,需要進行編碼的程序有 RSA密鑰生成 RSA加密解密 任意文件的讀取和保存操作 各環(huán)節(jié)必要的數(shù)據(jù)編碼轉(zhuǎn)換 圖形操作界面。2.1.2 工程方案選擇結(jié)合現(xiàn)有的常見開發(fā)模式綜合分析,有多種實現(xiàn)方案,下面陳述其中幾種,并分析選擇一種解決方案,并給出工程框架。1.整個工程使用java平臺實現(xiàn)RSA密鑰生成、RSA加密解密的功能實現(xiàn)十分簡單,因為標準庫中集成幾乎所有功能,不需要從RSA算法出發(fā)進行編碼。在j2se標準庫中,javax.crypto中的Cipher類用于具體的加密和解密,java.security包直接提供了數(shù)字簽名的相關(guān)方法。因為有強大的標準庫支持,文件的讀取和保存操作、各環(huán)節(jié)

24、必要的數(shù)據(jù)編碼轉(zhuǎn)換、圖形操作界面的實現(xiàn)也很簡單(使用java.io java.awt或javax.swing 等包),如果結(jié)合一種快速開發(fā)的IDE,比如JBuilder,整個軟件可以在很短的時間內(nèi)編碼完成。如果不考慮非PC設(shè)備和機器效率等問題,java平臺幾乎是最佳解決方案。但是缺點也很明顯,如果想把核心算法和功能應(yīng)用到非PC設(shè)備(例如嵌入式手持設(shè)備),則要求設(shè)備上有支持前面提及的加密類庫的CVM;對于在PC上運行,JVM的數(shù)據(jù)運算速度要遠遠落后于本地化代碼在PC上的運算速度,本軟件需要進行大量運算,這一點不適合由java完成。2.整個工程使用.Net平臺實現(xiàn)與使用java平臺完全類似,加密等

25、有.Net基礎(chǔ)類庫的支持,不需要大量編碼實現(xiàn),另外由于Visual Studio的強大便利,這種規(guī)模的工程可以十分迅速的完成。缺點是只能在有微軟.Net Framework的環(huán)境運行,在Windows操作系統(tǒng),.Net Framework的機器效率好于java平臺,但是相比于本地化的代碼,還是十分拖沓的。3.整個工程使用Windows本地化程序?qū)崿F(xiàn)在不應(yīng)用Windows或第三方現(xiàn)成組件的情況下,需從RSA算法出發(fā)編碼實現(xiàn)。其他各功能的設(shè)計開發(fā),如文件操作、數(shù)據(jù)編碼轉(zhuǎn)換和圖形界面等,可以使用ATL、MFC或Windows API實現(xiàn)。這種工程幾乎是為Windows量身訂做,執(zhí)行效率最好。但是對于

26、非PC設(shè)備,只能方便的移植到運行Windows嵌入式操作系統(tǒng)的設(shè)備,向其他操作系統(tǒng)移植困難,需要重新編寫大量代碼。通常解決本地化代碼的移植問題,都是使用C+標準庫,即功能盡量多的由C+標準庫完成,這樣在移植的時候,只需要重新編寫操作系統(tǒng)相關(guān)的代碼即可。這種開發(fā)方式比起前兩種,缺點就是設(shè)計開發(fā)模式陳舊,代碼煩瑣,不方便維護;流行的.Net上的語言引用各種功能比較麻煩。4.考慮可能的復(fù)用,針對具體情況分層開發(fā)實現(xiàn)綜合考慮復(fù)用性、可維護性和執(zhí)行效率,較妥當(dāng)?shù)姆椒ㄊ欠謱釉O(shè)計。核心的RSA算法由C+類庫實現(xiàn),針對用戶所在的操作系統(tǒng)封裝成本地化組件。其他各功能如文件操作、數(shù)據(jù)編碼轉(zhuǎn)換和圖形界面等,由托管代

27、碼借助虛擬機平臺標準庫的功能快速開發(fā)實現(xiàn)(本文針對選用.Net上的C#論述,選用java由JNI或其他方式調(diào)用本地組件,設(shè)計模式上是完全類似的)。這種開發(fā)方式,核心功能集中在最底層,在不斷的封裝中針對具體環(huán)境對組件功能不斷擴充,任意一個層面的封裝都可以被直接應(yīng)用到其他項目,比如在Web使用以前為某窗體程序?qū)懙慕M件、給嵌入式設(shè)備交叉編譯算法庫等。但是每一層都需要依賴底層的所有組件。圖2-2形象的說明了分層設(shè)計給復(fù)用帶來的好處。圖2-2 綜合考慮復(fù)用性、可維護性和執(zhí)行效率的分層設(shè)計選用第四種設(shè)計方案,上層使用C#,底層算法使用C+,可以由一個Visual Studio解決方案管理,給調(diào)試帶來極大的

28、方便。整個工程分四層,實現(xiàn)RSA加密算法的C+核心類庫、封裝C+核心類庫的DLL組件、引用DLL的.Net類、實現(xiàn)文件操作功能的.Net窗體應(yīng)用程序。2.2節(jié)詳細介紹各部分的設(shè)計與開發(fā)??紤]到工作量,本軟件加解密數(shù)據(jù)沒有嚴格遵從RSA標準PKCS #1,而是在滿足設(shè)計要求的前提下,以一種盡可能簡單的方式實現(xiàn)加密和解密。2.2 各部分的設(shè)計與開發(fā)2.2.1 實現(xiàn)RSA加密算法的C+核心類庫1. 大數(shù)存儲和四則運算根據(jù)RSA算法的要求,為了實現(xiàn)大數(shù)的各種復(fù)雜運算,需要首先實現(xiàn)大數(shù)存儲和基本四則運算的功能。當(dāng)今開源的大數(shù)運算C+類有很多,多用于數(shù)學(xué)分析、天文計算等,本文選用了一個流行的大數(shù)類型,并針

29、對RSA算法和本項目的具體需要對其進行了擴充和改進。下面簡單介紹大數(shù)存儲和四則運算的實現(xiàn)原理。最先完成的功能是大數(shù)的存儲,存儲功能由flex_unit類提供。和普通的類型一樣,每一個大數(shù)對應(yīng)一個flex_unit的實例。類flex_unit中,用一個無符號整數(shù)指針unsigned * a指向一塊內(nèi)存空間的首地址,這塊內(nèi)存空間用來存儲一個大數(shù),所以可以說,大數(shù)是被存儲在一個以unsigned為單元的線性組中。在方法void reserve( unsigned x )中通過C+的new來給a開辟空間,當(dāng)flex_unit的實例中被存入比當(dāng)前存儲的數(shù)更大的數(shù)時,就會調(diào)用reserve來增加存儲空間,

30、但是當(dāng)flex_unit的實例中被存入比當(dāng)前存儲的數(shù)更小的數(shù)時,存儲空間并不會自動緊縮,這是為了在運算的時候提高執(zhí)行效率。結(jié)合指針a,有兩個重要的無符號整數(shù)來控制存儲,unsigned z和unsigned n,z是被分配空間的單元數(shù),隨數(shù)字變大不斷增大,不會自己緊縮,而n是當(dāng)前存儲的大數(shù)所占的單元數(shù),組成一個大數(shù)的各unsigned單元的存入和讀出由set、get方法完成,變量n是只讀的。類型unsigned在32位機是32位的,所以對于flex_unit這個大數(shù)類來說,每個大數(shù)最大可以達到 個字節(jié)長,這已經(jīng)超過了32位機通常的最大內(nèi)存容量,所以是足夠進行RSA所需要的各種運算的。圖2-3形

31、象的說明了大數(shù)存儲類flex_unit對大數(shù)的管理。 *a unsigned類型的指針大數(shù)占n個單元開辟了z個單元大的內(nèi)存內(nèi)存空間圖2-3 flex_unit對大數(shù)的管理在flex_unit的存儲功能基礎(chǔ)上,將其派生,得到vlong_value,在vlong_value中實現(xiàn)四則運算函數(shù),并實現(xiàn)強制轉(zhuǎn)換運算符unsigned,以方便大數(shù)類型和普通整數(shù)的互相賦值。當(dāng)大數(shù)被強制轉(zhuǎn)換為unsigned時,將取其最低四字節(jié)的值。四則運算實現(xiàn)的原理十分簡單,都是按最基本的算術(shù)原理實現(xiàn)的,四則運算過程的本質(zhì)就是按一定數(shù)制對數(shù)字的計算,比如相加,就是低位單元對齊,逐單元相加并進位,減法同理。而乘除法和取余也

32、都是按照豎式運算的原理實現(xiàn),并進行了必要的優(yōu)化。雖然實現(xiàn)了四則運算函數(shù),但是若是程序里的運算都要調(diào)用函數(shù),顯得煩瑣而且看起來不美觀,所以我們另寫一個類vlong,關(guān)聯(lián)(Associate,即使用vlong_value類型的對象或其指針作為成員)vlong_value,在vlong重載運算符。這樣,當(dāng)我們操作vlong大數(shù)對象的時候,就可以像使用一個簡單類型一樣使用各種運算符號了。之所以將vlong_value的指針作為成員而不是直接構(gòu)造的對象,也是為了提高執(zhí)行效率,因為大型對象的拷貝要消耗不少機器時間。2. 大數(shù)冪模與乘模運算Montgomery冪模算法在實現(xiàn)了vlong類型后,大數(shù)的存儲和四

33、則運算的功能都完成了。考慮到RSA算法需要進行冪模運算,需要準備實現(xiàn)這些運算的方法。所以寫一個vlong的友元,完成冪模運算功能。冪模運算是RSA 算法中比重最大的計算,最直接地決定了RSA 算法的性能,針對快速冪模運算這一課題,西方現(xiàn)代數(shù)學(xué)家提出了很多的解決方案。經(jīng)查閱相關(guān)數(shù)學(xué)著作,發(fā)現(xiàn)通常都是依據(jù)乘模的性質(zhì),先將冪模運算化簡為乘模運算。通常的分解習(xí)慣是指數(shù)不斷的對半分,如果指數(shù)是奇數(shù),就先減去一變成偶數(shù),然后再對半分,例如求D=,E=15,可分解為如下6個乘模運算。歸納分析以上方法,對于任意指數(shù)E,可采用如圖2-4的算法流程計算 。開始D=1;P=C mod nE0?E為奇數(shù)?E=E-1E

34、為偶數(shù)?E=E/2YesNoResult=D結(jié)束YesYesNoNo圖2-4 冪模運算分解為乘模運算的一種流程按照上述流程,列舉兩個簡單的冪模運算實例來形象的說明這種方法。求的值開始D = 1P = 2 mod 17 = 2E = 15E奇數(shù)D = DP mod n = 2P = PP mod n = 4E = (E-1)/2 =7E奇數(shù)D = DP mod n = 8P = PP mod n = 16E = (E-1)/2 =3E奇數(shù)D = DP mod n = 9P = PP mod n = 1E = (E-1)/2 =1E奇數(shù)D = DP mod n = 9P = PP mod n =

35、1E = (E-1)/2 =0最終D = 9 即為所求。求的值開始D = 1P = 2 mod 17 = 2E = 8E偶數(shù)D = 1P = PP mod n = 4E = E/2 =4E偶數(shù)D = 1P = PP mod n = 3E = E/2 =2E偶數(shù)D = 1P = PP mod n = 9E = E/2 =1E奇數(shù)D = DP mod n = 9P = 不需要計算E = (E-1)/2 =0最終D = 9 即為所求。觀察上述算法,發(fā)現(xiàn)E根據(jù)奇偶除以二或減一除以二實際就是二進制的移位操作,所以要知道需要如何乘模變量,并不需要反復(fù)對E 進行除以二或減一除以二的操作,只需要驗證E 的二進

36、制各位是0 還是1 就可以了。同樣是計算,下面給出從右到左掃描二進制位進行的冪模算法描述,設(shè)中間變量D,P,E的二進制各位下標從左到右為u,u-1,u-2,0。Powmod(C,E,n) D=1; P=C mod n; for i=0 to u do if(Ei=1)D=D*P(mod n); P=P*P(mod n); return D;有些文獻將上述算法稱為平方乘積二進制快速算法,例如參考文獻中的基于RSA算法的一種新的加密核設(shè)計,其實這種算法本質(zhì)上和圖2-4的流程完全一致,只是把根據(jù)指數(shù)奇偶分開的減一和除以二合并成對指數(shù)二進制各位的判斷而已。在本軟件的代碼中采用直接掃描vlong二進制各

37、位的辦法。剩下的問題就是乘模運算了。提高乘模運算的速度是提高模冪運算速度的關(guān)鍵。一般情況下,n是數(shù)百位乃至千位以上的二進制整數(shù),用普通的除法求模而進行乘模運算是不能滿足速度的要求的。為此,Montgomery在1983年提出了一種模加右移的乘模算法(主要著作發(fā)表于1985年),從而避免了通常求模算法中費時的除法步驟。本軟件僅僅是應(yīng)用Montgomery(蒙哥馬利)算法,算法的具體推導(dǎo)證明需要頗多數(shù)論知識,不在本文的討論范圍內(nèi),如需了解可參見蒙哥馬利的相關(guān)著作。下面簡單描述RSA中常用的Montgomery(蒙哥馬利)算法供參考理解源程序。選擇與模數(shù)n互素的基數(shù)R=2k,n滿足2k1n2k, n

38、應(yīng)為奇數(shù)。并且選擇R-1及n,滿足0 R-1n, 0 nn,使得 RR-1-nn1。對于0mRn的任意整數(shù),Montgomery給出求模乘法mR-1 mod n 的快速算法M(m):M(m) if (tn) return (t-n); else return t;因為,故t為整數(shù);同時,得。由于,M(m) 中t結(jié)果范圍是0t=n) x -= n;return x;exp(C,E,n) D=R-n; P=C*R mod n;i=0; while(true) if(E的當(dāng)前二進制位Ei=1)D=M(D*P); /從低位到高位檢測二進制位i+=1;if(i=E的二進制位數(shù))break; P=M(P*

39、P);return D*R-1 (mod n);在具體的實現(xiàn)中,對應(yīng)monty類的mul和exp方法。全局函數(shù)modexp初始化monty對象并調(diào)用其exp方法,使用的時候直接調(diào)用modexp即可。3. 尋找素數(shù)Eratosthenes篩選與Fermat素數(shù)測試首先要說明的是,事實上,當(dāng)今的計算機還不足以聰明到立刻計算生成一個很大的隨機素數(shù)。一般來說,要得到100%準確的大素數(shù),都是通過查已經(jīng)計算好的素數(shù)表的方式。但是素數(shù)表的方式給RSA的安全性帶來隱患,因為攻擊者如果得到了密鑰生成時所使用的素數(shù)表,攻破RSA加密的難度將會大大降低。本程序起初使用素數(shù)表的方式,后來考慮到安全性問題,生成密鑰的

40、方式改為隨機計算生成。這樣,短時間內(nèi)如果要得到一個100%準確的大素數(shù)是很困難的,只能以盡可能高的概率得到一個大素數(shù)。經(jīng)過2.2.1.1和2.2.1.2小節(jié),所有的大數(shù)運算功能都準備完畢,在此基礎(chǔ)上,本工程將尋找素數(shù)的功能置于類Prime_factory_san之中。外部只要調(diào)用本類實例的成員vlong find_prime( vlong & start )就可以以大數(shù)start為起點,得到一個數(shù),這個數(shù)是素數(shù)的概率很大。下面介紹尋找素數(shù)的原理。首先在需要尋找素數(shù)的整數(shù)范圍內(nèi)對整數(shù)進行篩選,把所有確知為合數(shù)的整數(shù)排除出去。程序中構(gòu)造了一個數(shù)組b,大小為一輪素數(shù)搜索的范圍,記搜索范圍大小為SS。

41、b0到bSS分別對應(yīng)大數(shù)start到start+SS。b中所有元素先初始化為1,如果對應(yīng)的大數(shù)確定為合數(shù),就將b中對應(yīng)的元素置為0。最后,只需對那些b中為1的元素對應(yīng)的大數(shù)進行比較確切的素數(shù)測試即可,只要被測試的數(shù)是素數(shù)概率達到一定門限,就判這個數(shù)為素數(shù)。這樣做既保證了這段程序可以在短時間內(nèi)執(zhí)行完,又保證了可以以比較高的準確度得到素數(shù)。函數(shù)find_prime先把b的所有元素賦值為1,然后按參數(shù)start給標記數(shù)組b的各元素賦0值。下面描述標記數(shù)組b的賦0值算法。首先,在類Prime_factory_san被構(gòu)造的時候,構(gòu)造函數(shù)中從2開始搜尋一些小素數(shù),記錄在數(shù)組pl中,共記錄NP個。這些小素

42、數(shù)用來當(dāng)作因子,他們的倍數(shù)將被從大素數(shù)搜索范圍內(nèi)剔除(即把數(shù)組b的對應(yīng)元素標記為0),剔除的程序代碼如下。 for (i=0;inp;i+) unsigned p = pli; unsigned r = start % vlong(p); if (r) r = p - r; while ( r 0 x=r圖2-5 在素數(shù)搜索范圍內(nèi)剔除小素數(shù)因子p的倍數(shù)接下來,對可能為素數(shù)的數(shù)(即標記數(shù)組b中值為1的元素對應(yīng)的數(shù))進行素數(shù)測試。數(shù)論學(xué)家利用費馬小定理研究出了多種素數(shù)測試方法,本程序使用一種最簡單的方式,直接應(yīng)用費馬小定理。取一個與p互素的整數(shù)A,對于大素數(shù)p來說應(yīng)該滿足Ap-1mod p=1,但

43、是我們把p代入一個大整數(shù),滿足這個關(guān)系的數(shù)不一定是素數(shù)。這時我們改變A,進行多次測試,如果多次測試都通過,這個數(shù)是素數(shù)的概率就比較大。按這種原理,我們編寫素數(shù)測試函數(shù)如下。int is_probable_prime_san( const vlong &p ) const rep = 4; /測試次數(shù) const unsigned anyrep = 2,3,5,7 ; /測試用的底數(shù) for ( unsigned i=0; irep; i+=1 )if ( modexp( anyi, p-vlong(1), p ) != vlong(1) ) return 0; /modexp是冪模函數(shù),按上一

44、小節(jié)敘述的算法編碼。/這里modexp計算anyip-1mod p。 return 1;測試通過,程序就判定這個數(shù)為找到的素數(shù),將找到的素數(shù)返回給上層程序使用。在這里其實有一個不可忽視的問題,就是得到一個測試通過的合數(shù)。對于這種情況,RSA算法加密解密是否還可以實現(xiàn),是一個需要從數(shù)學(xué)角度論證的問題。因為得到素數(shù)的概率很高,經(jīng)過一整天的生成密鑰和加密操作,沒有發(fā)現(xiàn)失敗的密鑰, 所以本文暫沒有對這個問題進行討論。綜上所述,總結(jié)素數(shù)尋找的流程,如圖2-6所示。 開始按start參數(shù)初始化標記數(shù)組bSS ; i=0計數(shù)iSS?bi=1?判定為素數(shù)?start+=1;i+=1結(jié)束返回素數(shù)尋找結(jié)果star

45、tYesYesYesNoNoNo圖2-6 函數(shù)find_prime尋找素數(shù)的流程框圖得到了大素數(shù),即RSA算法中的p、q,我們就可以計算出密鑰,進行加密等操作了。4. 二元一次不定方程在RSA 算法中,往往要在已知A、M的情況下,求B的最小值,使得 (AB) mod M = 1。即相當(dāng)于求解B、N都是未知數(shù)的二元一次不定方程 AB-MN=1的最小整數(shù)解。而針對不定方程ax-by=1 的最小整數(shù)解,古今中外都進行過詳盡的研究,西方有著名的歐幾里德算法,即一種輾轉(zhuǎn)相除法,中國有秦九韶的“大衍求一術(shù)”。歐幾里德算法是一種遞歸算法,較容易理解。下面舉例說明用歐幾里德算法求解二元一次不定方程的最小整數(shù)解

46、。給定不定方程11x-49y=1,求最小的x(1) 11 x - 49 y = 1 49 mod 11 = 5(2) 11 x - 5 y = 1 11 mod 5 = 1(3)x - 5 y = 1 5 mod 1 = 0逆向代入:令y=0 代入(3)得x=1令x=1 代入(2)得y=2令y=2 代入(1)得x=9x=9;y=2即為所求。程序中,全局函數(shù)vlong modinv( const vlong &a, const vlong &m )用來完成這種算法。對應(yīng)前面的敘述,參數(shù)a對應(yīng)A,參數(shù)m對應(yīng)M,函數(shù)返回值即為B的最小值。5. 按常規(guī)RSA算法實現(xiàn)加密與解密最后,類RSA_san基于

47、前面的準備工作,實現(xiàn)RSA密鑰生成和加解密的功能(算法在此不再贅述,RSA算法協(xié)議見http:/www.di-.au/rsa_alg.html)。為了方便閱讀,整個類的源程序中,所使用的變量字母均和RSA算法協(xié)議中一致。在類RSA_san的構(gòu)造函數(shù)里,執(zhí)行準備一對隨機密鑰的操作。之后可以直接使用類的其他成員進行RSA加解密操作,也可以載入以前保存的密鑰或再次隨機生成密鑰。類中各成員頻繁的用到字符串和vlong類型的轉(zhuǎn)換,因為大數(shù)是用字符串置入的,而把大數(shù)讀出,也是保存在字符指針指向的一段內(nèi)存空間里,所以也是字符串。所以,需要實現(xiàn)一系列的編碼轉(zhuǎn)換函數(shù),比如將unsigned指針指向的一段空間里保

48、存的一個大數(shù),表示成十六進制形式的字符串文本。編碼轉(zhuǎn)換通常是用C風(fēng)格的指針操作和sprintf函數(shù)來完成。需要加密和解密的數(shù)據(jù)也是通過字符串參數(shù)置入的。由于字符串的結(jié)尾字符“0”實際上也可能是需要加密的數(shù)據(jù),所以置入的串長度并不能以“0”來決定,程序里引入一個unsigned類型的參數(shù)來決定置入的串長度,這樣就解決了加密連0數(shù)據(jù)時候被截斷的問題。因為是對文件加密的軟件,需要加密的數(shù)據(jù)通常并不止幾字節(jié),這時由上層程序?qū)?shù)據(jù)按用戶的設(shè)置分塊,分別加密或解密。本軟件默認的分塊大小是1字節(jié),即逐個字節(jié)作為參數(shù),調(diào)用C+核心模塊中的方法。加密解密流程均為標準RSA算法,具體過程和使用方法參見源程序和接口

49、文檔。6. 核心類庫綜述綜上幾小節(jié)所述,實現(xiàn)RSA加密算法的C+核心類庫由六個類組成,類名和對應(yīng)的功能描述總結(jié)如表2-1所示。各個類之間的關(guān)系如圖2-7所示。表2-1 RSA加密算法的C+類庫中的類class flex_unit大數(shù)運算和存儲最基本的類,主要實現(xiàn)超大整數(shù)的存儲和索引管理。class vlong_value是flex_unit的派生類,在靈活大數(shù)存儲的基礎(chǔ)上實現(xiàn)四則運算函數(shù)。class vlong以vlong_value為基礎(chǔ)(將一個vlong_value指針作成員),重載運算符。class monty為RSA準備大數(shù)求冪模運算的函數(shù),vlong的友元。class Prime_f

50、actory_san素數(shù)工廠,尋找大素數(shù)的類。class RSA_san在前5個類的基礎(chǔ)上,實現(xiàn)RSA核心算法的類。圖2-7 C+核心功能類圖另外需要說明的是,程序中有幾個不屬于任何類的全局函數(shù),比如應(yīng)用輾轉(zhuǎn)相除法求最大公約數(shù)的函數(shù)gcd、解同余方程的函數(shù)modinv等。按常規(guī)設(shè)計模式來說,不應(yīng)當(dāng)出現(xiàn)類之外的函數(shù),但是因為這些函數(shù)使用頻繁,考慮到機器效率,直接置于全局,不再另行包裝。2.2.2 封裝C+核心類庫的DLL組件在Visual Studio當(dāng)前的解決方案中以VC+創(chuàng)建一個win32dll工程,將測試好的實現(xiàn)RSA加密算法的C+核心類庫中的所有文件加入到此工程下,新建一對cpp和h文件

51、,把可能用到的功能全部規(guī)劃為新文件中的全局函數(shù),并以C接口導(dǎo)出,即_declspec(dllexport)。由于核心類庫的對外功能都使由RSA_san類提供的,所以在新cpp文件中全局的聲明一個RSA_san類的對象指針(RSA_san *WRSA),全局函數(shù)int start_RSA_san()初始化*WRSA對象,在初始化成功后,其他全局函數(shù)通過調(diào)用*WRSA對象的公開方法實現(xiàn)各種功能,如加密、讀取密鑰等。在關(guān)閉上層引用程序以前,應(yīng)執(zhí)行int finish_RSA_san()來釋放WRSA,該函數(shù)執(zhí)行delete WRSA的操作。其他接口函數(shù)的使用見DLL接口文檔。另外,DLL組件可以自己

52、在全局函數(shù)中實現(xiàn)一些其他功能,作為對核心類庫功能的補充。C接口的DLL組件可以被諸如VB、Delphi等開發(fā)環(huán)境方便的引用。2.2.3 引用DLL的.Net類與實現(xiàn)文件操作功能的窗體應(yīng)用程序在C#編寫的.Net類里,使用特性DllImport(sanpack_rsa.dll)引用C接口的DLL組件。類中接口DLL的函數(shù)都以靜態(tài)成員的方式對外公開,其他.Net程序可以直接使用。在類庫中還提供了任意長度隨機串的生成函數(shù),此函數(shù)用于生成尋找素數(shù)的大數(shù)起點。文件操作使用.Net基礎(chǔ)類庫中的System.IO中的類實現(xiàn)。一般因為文件操作十分簡單,用流輸入輸出的方式包裝完成,程序中將文件操作直接放在菜單項

53、關(guān)聯(lián)的事件處理函數(shù)中。窗體等圖形操作界面直接由Visual Studio的所見即所得的方式完成,不需要編碼實現(xiàn)。最終實現(xiàn)的應(yīng)用程序,結(jié)構(gòu)如圖2-8所示。圖2-8 本軟件的Visual Studio解決方案第3章 軟件整體測試與分析改進3.1 編寫測試各項性能需要的精確計時類由于.Net基礎(chǔ)類庫提供的計時功能十分不精確,無法勝任軟件性能測試的工作,這里使用Windows API 函數(shù)QueryPerformanceCounter和QueryPerformanceFrequency進行精確計時。功能被封裝在C#類HighResolutionTimer中,使用時只需構(gòu)造一個此類的對象,在計時開始的時

54、候調(diào)用其Start方法,計時結(jié)束時調(diào)用其Stop方法,然后訪問其ElapsedTime屬性,就可以得到一個以秒為單位的float型精確的計時值了。API 函數(shù)QueryPerformanceCounter和QueryPerformanceFrequency是靠查詢CPU的高精度計時器來計時的,所以可以輕松的精確到毫秒級計時。附錄中給出了這個類的源代碼。3.2 測試數(shù)據(jù)與分析改進3.2.1 密鑰生成測試生成密鑰運算最費時的工作是尋找素數(shù)。如2.2.1.3小節(jié)所敘述,尋找素數(shù)是一項頗為復(fù)雜的工作,其速度可能受以下變量的影響:RSA加密需要的n的位數(shù)(尋找素數(shù)的整數(shù)起點大小start)、大素數(shù)測試時

55、底數(shù)A的個數(shù)(針對一個整數(shù)的素數(shù)測試次數(shù))、小素數(shù)因子p的個數(shù)NP、一輪尋找遍歷的整數(shù)個數(shù)SS等。其中最具影響力的因素顯然是RSA加密需要的n的位數(shù)。以下對各變量分別進行測試,暫且忽略操作系統(tǒng)調(diào)度對測試的影響。1. 測試加密使用的n的位數(shù)對耗時的影響即 在固定A、NP、SS等變量的情況下,改變加密位數(shù)n,測試密鑰生成的時間消耗情況。測試時,A取4個值,分別為2、3、5、7,NP取200,SS取1000。測試PC配置為CPU CR1.7GHZ/外頻100MHZ/物理內(nèi)存512MDDR/MSI6398主板845 Ultra-AD芯片組,下文測試中,未說明PC配置的也都在同一PC完成,不再重復(fù)。統(tǒng)計

56、數(shù)據(jù)如表3-1所示。表中各項對應(yīng)的全部測試數(shù)據(jù)見http:/ ,包括兩個作為素數(shù)搜索起點的隨機數(shù)和生成的素數(shù)p、q以及e、d、n。表3-1 RSA加密模數(shù)n與密鑰生成耗時的關(guān)系加密位數(shù)n (bit)對應(yīng)的搜索起點字節(jié)數(shù)測試5次獲得隨機密鑰消耗的時間(秒)平均時間消耗(秒)第一次第二次第三次第四次第五次256160.79680.54480.60000.60240.78990.6668384241.38581.81301.40652.25141.41371.6541512322.53462.40672.67564.56831.95422.8279640404.32643.53197.37165.8

57、3402.84864.78257684810.19566.95215.37326.69584.10916.6652896566.63075.144314.049514.739611.394410.38631024646.294117.100312.398911.531111.092211.683311527220.309715.827123.709416.260113.130417.847312808026.651411.500454.193713.337118.309424.7973不同顏色的單元格表示每行中的最大值和最小值這種顏色代表行中最大值這種顏色代表行中最小值觀察表3-1上的統(tǒng)計數(shù)據(jù)

58、,很容易發(fā)現(xiàn)隨著加密位數(shù)的增加,密鑰生成需要的時間顯著增加。在測試范圍內(nèi),隨著加密位數(shù)增大,每一行中的最大最小值差距也呈粗略的增大趨勢。也就是說對于長密鑰來說,RSA隨機生成密鑰消耗時間的可能范圍較大。這是因為對于大整數(shù)來說,可能出現(xiàn)在較長一段區(qū)間中沒有素數(shù)的情況。在較常用的1024位RSA加密時,用本軟件的算法,測試時最長出現(xiàn)了17秒多的計算,雖然這對于用戶來說時漫長的等待,但是考慮到安全性,還是舍棄了素數(shù)表和密鑰庫的方案,而使用大素數(shù)隨機生成,用戶可以把生成的私鑰單獨加密保存在可靠的存儲空間內(nèi),以獲得更高的安全性。表3-1僅能從實驗的角度直觀理解,具體到一次密鑰生成的運算,所需要的時間是很

59、不確定的,比如,一次1280位的密鑰生成,需要的時間完全可能比一次896位的密鑰生成時間短,由于素數(shù)分布規(guī)律非常奧妙,加上測試運算需要的時間頗長,這里很難給出對于一個具體位數(shù)的密鑰生成所需時間的統(tǒng)計模型。另外需要說明的是,表3-1的加密位數(shù)在實際軟件設(shè)置時并不嚴格。這是因為,實際作為參數(shù)設(shè)置的是兩個大素數(shù)的搜索起點。如果隨機生成的起點整數(shù)大小比較接近更長一位的整數(shù)的話(例如FFFF很接近10000),向后尋找所得到的素數(shù)很可能長出一位。而且,兩個k位長的整數(shù)相乘的結(jié)果也未必是2k位,比如100*100=10000,相乘結(jié)果是2k-1位。所以,在表3-1實際測試填寫時,加密位數(shù)可能會有幾位的差距,但是這不礙大局。2. 測試底數(shù)A對耗時的影響為了保證生成素數(shù)的成功率,A至少要有4個。如果少于4個,則素數(shù)測試失敗的可能性比較大,經(jīng)過測試發(fā)現(xiàn)不可以忽略。2.2.1.3小節(jié)曾經(jīng)提到,如果素數(shù)測試通過了合數(shù),就可能產(chǎn)生錯誤的密鑰,使加密解密操作失敗。所以測試A的時候,最少有讓其取4個值。而取6個值以上,測試算法失敗的概率已經(jīng)非常小,沒有什么實用意義,所以這里測試A從4個到6個的情況。固定其他變量:n取512位和1024位(即素數(shù)搜索起點位數(shù)設(shè)置為32和64),NP取200,

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!