版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、目目 錄錄 摘摘 要要 .1 前前 言言 .3 第第 1 章章 RSA 應(yīng)用現(xiàn)狀及應(yīng)用于文件加密的分析應(yīng)用現(xiàn)狀及應(yīng)用于文件加密的分析.4 1.11.1 RSARSA 算法介紹與應(yīng)用現(xiàn)狀算法介紹與應(yīng)用現(xiàn)狀.4 1.21.2 RSARSA 應(yīng)用于文件加密的分析應(yīng)用于文件加密的分析.5 第第 2 2 章章 RSARSA 文件加密軟件的設(shè)計(jì)與實(shí)現(xiàn)文件加密軟件的設(shè)計(jì)與實(shí)現(xiàn).9 2.12.1 需求分析與總體設(shè)計(jì)需求分析與總體設(shè)計(jì).9 2.22.2 各部分的設(shè)計(jì)與開發(fā)各部分的設(shè)計(jì)與開發(fā).12 第第 3 3 章章 軟件整體測試與分析改進(jìn)軟件整體測試與分析改進(jìn).28 3.13.1 編寫測試各項(xiàng)性能需要的精確計(jì)時(shí)
2、類編寫測試各項(xiàng)性能需要的精確計(jì)時(shí)類.28 3.23.2 測試數(shù)據(jù)與分析改進(jìn)測試數(shù)據(jù)與分析改進(jìn).28 3.33.3 使用中國余數(shù)定理使用中國余數(shù)定理.40 第第 4 4 章章 可移植模塊的簡要說明與開發(fā)前景可移植模塊的簡要說明與開發(fā)前景.42 總結(jié)與體會(huì)總結(jié)與體會(huì).44 致謝詞致謝詞 .45 【參考文獻(xiàn)參考文獻(xiàn)】 .46 摘摘 要要 分析 RSA 算法的應(yīng)用現(xiàn)狀,論證文件加密應(yīng)用 RSA 算法的可行性和意義。 設(shè)計(jì)一套完整實(shí)用的 RSA 文件加密解決方案,具體編碼實(shí)現(xiàn)。對 RSA 算法進(jìn) 行研究,從常規(guī) RSA 算法出發(fā),用 C+實(shí)現(xiàn) RSA 加密算法類庫,并在 32 位 windows 平臺(tái)封
3、裝成組件。在.Net 平臺(tái)引用此組件,實(shí)現(xiàn)可以對任意文件進(jìn) 行 RSA 加密操作的窗體應(yīng)用程序。經(jīng)過加密的文件以及密鑰文件都是文本文 件。給出關(guān)鍵類類圖、整個(gè)應(yīng)用程序的結(jié)構(gòu)描述文檔、關(guān)鍵模塊流程圖、較 詳細(xì)的接口文檔、所有源代碼。對應(yīng)用程序進(jìn)行測試,對測試結(jié)果進(jìn)行分析 研究,進(jìn)而對應(yīng)用程序進(jìn)行改進(jìn),對關(guān)鍵算法進(jìn)行盡可能的優(yōu)化,最終得到 一個(gè)在 windows 運(yùn)行的可以用指定密鑰對任意文件進(jìn)行 RSA 加密并可解密的 完整應(yīng)用程序,和一些相關(guān)的可移植組件。 【關(guān)鍵詞】 RSA RSA 算法 文件加密 加密成文本 AbstractAbstract Do research about the ap
4、plication 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 algorithm. And make a DLL module based on the class. Then complete a .Net Framework window-
5、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 classes chart, project description, core algorithm flowchart, all source code, and module interf
6、aces 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 algorithm that can encrypt and decrypt any file. And several modules in the project can be re
7、use 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 applications or web services. 【Key words】 RSA RSA algorithm file encryption encrypt to te
8、xt 前前 言言 RSA 公鑰加密算法是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。 它易于理解和操作,也十分流行。算法的名字以發(fā)明者的姓氏首字母命名: Ron Rivest, Adi Shamir 和 Leonard Adleman。雖然自 1978 年提出以來, RSA 的安全性一直未能得到理論上的證明,但它經(jīng)歷了各種攻擊,至今 (2007 年)未被完全攻破。隨著越來越多的商業(yè)應(yīng)用和標(biāo)準(zhǔn)化工作,RSA 已 經(jīng)成為最具代表性的公鑰加密技術(shù)。VISA、MasterCard、IBM、Microsoft 等 公司協(xié)力制定的安全電子交易標(biāo)準(zhǔn)(Secure Electronic Transactio
9、ns,SET)就采用了標(biāo)準(zhǔn) RSA 算法,這使得 RSA 在我們的生活中幾 乎無處不在。網(wǎng)上交易加密連接、網(wǎng)上銀行身份驗(yàn)證、各種信用卡使用的數(shù) 字證書、智能移動(dòng)電話和存儲(chǔ)卡的驗(yàn)證功能芯片等,大多數(shù)使用 RSA 技術(shù)。 當(dāng)今公鑰加密更廣泛應(yīng)用于互聯(lián)網(wǎng)身份認(rèn)證,本課題將公鑰加密算法 RSA 應(yīng)用于小型文件加密。將任意文件加密成文本的解決方案,使其使用更 加靈活。整個(gè)工程的分層設(shè)計(jì),給引用移植和后續(xù)開發(fā)帶來便利。 第 1 章 RSA 應(yīng)用現(xiàn)狀及應(yīng)用于文件加密的分析 1.11.1 RSARSA 算法介紹與應(yīng)用現(xiàn)狀算法介紹與應(yīng)用現(xiàn)狀 RSA 算法可以簡單敘述如下: 取素?cái)?shù) p,q,令 n=pq. 取與(
10、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/rsa_alg.html , 提及的算法中的字母與協(xié)議文檔中的一致,不再另做解釋) RSA 公開密鑰加密算法自 20 世紀(jì) 70 年代提出以來,已經(jīng)得到了廣泛認(rèn) 可和應(yīng)用。發(fā)展至今,電子安全領(lǐng)域的各方面已經(jīng)形成了較為完備的國際規(guī) 范。RSA 作為最重要的公開密鑰算法,在各領(lǐng)域的應(yīng)用數(shù)不勝
11、數(shù)。RSA 在硬件 方面,以技術(shù)成熟的 IC 應(yīng)用于各種消費(fèi)類電子產(chǎn)品。 RSA 在軟件方面的應(yīng)用,主要集中在 Internet 上。加密連接、數(shù)字簽名 和數(shù)字證書的核心算法廣泛使用 RSA。日常應(yīng)用中,有比較著名的工具包 Open SSL(SSL,Security Socket Layer,是一個(gè)安全傳輸協(xié)議,在 Internet 上進(jìn)行數(shù)據(jù)保護(hù)和身份確認(rèn)。Open SSL 是一個(gè)開放源代碼的實(shí)現(xiàn)了 SSL 及相 關(guān)加密技術(shù)的軟件包,由加拿大的 Eric Yang 等發(fā)起編寫的。相關(guān)詳細(xì)介紹 見 /about/ )。Open SSL 應(yīng)用 RSA 實(shí)
12、現(xiàn)簽名和密鑰 交換,已經(jīng)在各種操作系統(tǒng)得到非常廣泛的應(yīng)用。另外,家喻戶曉的 IE 瀏覽 器,自然也實(shí)現(xiàn)了 SSL 協(xié)議,集成了使用 RSA 技術(shù)的加密功能,結(jié)合 MD5 和 SHA1,主要用于數(shù)字證書和數(shù)字簽名,對于習(xí)慣于使用網(wǎng)上購物和網(wǎng)上銀行 的用戶來說,幾乎天天都在使用 RSA 技術(shù)。 RSA 更出現(xiàn)在要求高度安全穩(wěn)定的企業(yè)級(jí)商務(wù)應(yīng)用中。在當(dāng)今的企業(yè)級(jí) 商務(wù)應(yīng)用中,不得不提及使用最廣泛的平臺(tái) j2ee。事實(shí)上,在 j2se 的標(biāo)準(zhǔn) 庫中,就為安全和加密服務(wù)提供了兩組 API:JCA 和 JCE。 JCA (Java Cryptography Architecture)提供基本的加密框架,如
13、證書、數(shù)字簽名、報(bào) 文摘要和密鑰對產(chǎn)生器; JCA 由幾個(gè)實(shí)現(xiàn)了基本的加密技術(shù)功能的類和接口 組成,其中最主要的是 java.security 包,此軟件包包含的是一組核心的類 和接口,Java 中數(shù)字簽名的方法就集中在此軟件包中。JCE(Java Cryptography Extension) 在 JCA 的基礎(chǔ)上作了擴(kuò)展,JCE 也是由幾個(gè)軟件 包組成,其中最主要的是 javax.crypto 包,此軟件包提供了 JCE 加密技術(shù)操 作 API。javax.crypto 中的 Cipher 類用于具體的加密和解密。在上述軟件包 的實(shí)現(xiàn)中,集成了應(yīng)用 RSA 算法的各種數(shù)據(jù)加密規(guī)范(RSA
14、算法應(yīng)用規(guī)范介紹 參見: http:/ ,這些 API 內(nèi)部支持的算法不僅僅只有 RSA,但是 RSA 是數(shù)字簽名和證書中最常用的), 用戶程序可以直接使用 java 標(biāo)準(zhǔn)庫中提供的 API 進(jìn)行數(shù)字簽名和證書的各種 操作。 單機(jī)應(yīng)用程序使用 RSA 加密尚比較少見,例如使用 RSA 加密任意一個(gè)文 件。 1.21.2 RSARSA 應(yīng)用于文件加密的分析應(yīng)用于文件加密的分析 1.2.1 文件加密使用 RSA 的可行性 通過 1.1 節(jié)的論述,不難看出 RSA 當(dāng)今的應(yīng)用多在于數(shù)字簽名和證書等 方面。之所以只應(yīng)用于這些短小數(shù)據(jù)的加密解密,是因?yàn)?RSA 算法加密極慢, 速度是 DES 對稱密鑰加
15、密速度的千分之一左右。正是因?yàn)檫@樣,把 RSA 應(yīng)用 于普通文件加密的想法一直被忽略。通常文件被想象成大數(shù)據(jù)塊,但是實(shí)際 上在日常應(yīng)用中,有些極其重要的文本資料是并不太大的,比如因擔(dān)心遺忘 而用普通文本記錄的銀行帳號(hào)和密碼、不應(yīng)被陌生人知道的重要電話號(hào)碼、 幾千字節(jié)大的重要小圖片等。 雖然 RSA 加密運(yùn)算的速度十分慢,但是在 PC 性能越來越好的今天,對于 幾千字節(jié)的數(shù)據(jù)進(jìn)行一次幾百位密鑰的 RSA 加密,所消耗的時(shí)間應(yīng)該是可以 接受的。下面結(jié)合大數(shù)運(yùn)算程序的調(diào)試,從理論上簡單的分析消耗時(shí)間。在 一臺(tái)普通配置的 PC 機(jī)上對一個(gè)整數(shù)進(jìn)行冪模運(yùn)算,因?yàn)楣_密鑰的 e 通常取 的較小,所以指數(shù)取
16、一個(gè)小整數(shù),比如 C353,模一個(gè) 70 字節(jié)長的整數(shù)(140 位十六進(jìn)制,大數(shù)單元以線性組方式實(shí)現(xiàn),對應(yīng)到 RSA 算法中,這相當(dāng)于約 560bit 的 n),調(diào)試一個(gè)函數(shù)測試,按初等數(shù)論中的知識(shí)對程序進(jìn)行算法優(yōu)化, 最終在一臺(tái)配置為 AMD Athron2800+,外頻 333MHZ,物理內(nèi)存 512MB 的 PC 上 測試需要約 45 毫秒時(shí)間。如果按這種速度,逐字節(jié)對 1KB 的數(shù)據(jù)進(jìn)行同樣的 運(yùn)算,所消耗的時(shí)間理論上為 45 毫秒的 1024 倍即約 45 秒。這個(gè)時(shí)間并不是 非常長。 其實(shí)從一個(gè)簡單的角度來說,既然 RSA 用于數(shù)字簽名可行,那就完全可 以用于同樣大小的普通文件。對
17、于較大的文件,如果分成與數(shù)字簽名同樣大 小的段(這里假設(shè)數(shù)字簽名較短,不分段一次計(jì)算加密完成),分開的各段逐 一進(jìn)行加密運(yùn)算,那所需要的時(shí)間也只是按文件大小線性的增長。通常數(shù)字 簽名為幾十字節(jié),加密運(yùn)算并不需要很長的等待,這就說明對于幾百字節(jié)或 一兩 K 字節(jié)大小的文件來說,如果進(jìn)行 RSA 加密,并不會(huì)是非常漫長的工作。 當(dāng)然,如果文件更大,加密就顯得十分漫長了。比如按前面敘述的 45 毫秒大 數(shù)運(yùn)算程序推理,加密 1M 字節(jié)大小的文件需要約 1 天的時(shí)間。所以,要在普 通 PC 用幾百位以上的長密鑰 RSA 加密文件,文件不能過大,一般可以接受的 上限是幾 KB。如果要在較短時(shí)間內(nèi)加密大文
18、件,需要縮短密鑰長度以減小運(yùn) 算量,這將帶來安全性隱患。 本文的第 3 章將根據(jù)實(shí)際調(diào)試好的軟件,測試給出具體的時(shí)間消耗數(shù)據(jù)。 例如,在一臺(tái)配置為 AMD Athron2800+,外頻 333MHZ,物理內(nèi)存 512MB 的 PC 上測試實(shí)現(xiàn)的軟件,以 560bit 的 n 逐字節(jié)加密一個(gè) 1KB 大小的文件需要 55 秒。通常記錄如銀行帳號(hào)密碼等重要數(shù)據(jù)的文本文件大小不足百字節(jié),加密 只需要數(shù)秒鐘。所以對于小型文件,進(jìn)行較長密鑰的 RSA 加密是完全可行的。 1.2.2 文件加密使用 RSA 的意義 如 1.2.1 節(jié)所述,小型文件加密可以使用 RSA。比如,因擔(dān)心遺忘而用 普通文本記錄的銀
19、行帳號(hào)和密碼、不應(yīng)被陌生人知道的重要電話號(hào)碼、幾千 字節(jié)大的重要小圖片等??尚械姆椒ㄎ幢厥潜匾?,本小節(jié)討論何種文件適 合用非對稱密鑰加密,即 RSA 加密文件的意義所在。 對于前面敘述的帶有重要信息的小型文本和二進(jìn)制數(shù)據(jù)的維護(hù),如果 不加密,將無法放心的保存在計(jì)算機(jī)上,尤其是連網(wǎng)的或機(jī)房里的公共計(jì)算 機(jī)。如果借助功能強(qiáng)大的大型多用戶數(shù)據(jù)保護(hù)程序維護(hù)幾個(gè)小型文件,顯 得十分煩瑣,好比殺雞用牛刀。如果采用對稱密鑰加密,即加密解密的密 鑰相同,只適合部分情況。在某些情況下,使用對稱密鑰加密文件,交流使 用不夠方便。比如,張三由于某種原因,需要將自己的某個(gè)文件在公共計(jì)算 機(jī)上留給李四,而不希望別人看
20、到內(nèi)容。如果采用對稱密鑰加密,張三和李 四提前約好一個(gè)密碼就可以。但是如果張三想要在同一臺(tái)公共計(jì)算機(jī)上再留 一個(gè)秘密文件給王五,而不希望別人看到,就要和王五另外約定一個(gè)密碼。 如果需要在這臺(tái)公共計(jì)算機(jī)上留十個(gè)文件給不同的人,自己就要記和十個(gè)人 約定好的密碼,這樣以來交流起來不夠方便,因?yàn)閷τ趶埲?,要自己維護(hù)太 多的密鑰。非對稱密鑰(公開密鑰方式)恰好解決這樣的問題。只要大家都在 這臺(tái)計(jì)算機(jī)或這臺(tái)計(jì)算機(jī)可以訪問到的地方,留下自己的公開密鑰,一切就 變的容易解決了。張三要留給李四的文件,就用李四的公開密鑰加密,要留 給王五的文件,就用王五的公開密鑰加密。李四和王五只要把留給自己的文 件用自己的私有
21、密鑰解密,就可以得到留給自己的文件了。顯然,非對稱密 鑰體制更適合多用戶交流,而將這種加密方式直接應(yīng)用于文件加密,使我們 在公開場合的交流更加靈活方便。 一種更實(shí)際的情況是,我們想通過 Internet 上的公眾論壇或郵件發(fā)送重 要保密信息給某人。例如發(fā)送一個(gè)銀行帳號(hào)和密碼給某人。這種情況要保證 安全,在當(dāng)今互聯(lián)網(wǎng)絡(luò)上是比較棘手的。如果用公眾論壇直接留言給指定 用戶,論壇管理員和服務(wù)器管理員通常有方法看到數(shù)據(jù)。如果發(fā)送郵件, 雖然傳送過程是加密的,但是密碼畢竟是由郵件服務(wù)器維護(hù),所以系統(tǒng)管理 員通常也有辦法看到內(nèi)容。問題的關(guān)鍵在于我們所有的數(shù)據(jù)包括密鑰保存在 服務(wù)器之上。在這種情況下,我們需要
22、使用公開密鑰方式,并自己維護(hù)私有 密鑰。RSA 文件加密可以靈活的解決這些問題。例如,我們可以將任意一個(gè) 文件用某人的公開密鑰加密變換成一段可以復(fù)制粘貼的文本,然后粘貼在公 眾互聯(lián)網(wǎng)上,對方只需把需要解密的文本復(fù)制保存成一個(gè)文本文件,在本地 機(jī)用自己的私有密鑰解密即可。我們可以將自己的私有密鑰通過 DES 加密后 保存在自己的移動(dòng)磁盤上,使用的時(shí)候只要將其解密讀取即可,用完后立即 從當(dāng)前操作環(huán)境清除。這樣,我們自己維護(hù)自己的私有密鑰,利用簡單并且 公開的方式,可以安全傳送任意小型數(shù)據(jù),包括一切二進(jìn)制文件。 所以,對于使用小型文件進(jìn)行數(shù)據(jù)交換的情況,更好的方案是通過一個(gè) 小型應(yīng)用程序?qū)@些文件進(jìn)
23、行非對稱密鑰加密。為了適合前面敘述的在公共 BBS 與特定的某人交流重要保密信息的情況,加密生成的數(shù)據(jù)應(yīng)該是文本, 這樣可以方便復(fù)制粘貼。 綜上所述,使用前面敘述的方式加密文件有兩點(diǎn)重要意義:應(yīng)用非對 稱密鑰加密任意文件,使非對稱密鑰的應(yīng)用不僅僅局限于互聯(lián)網(wǎng)絡(luò)。非對 稱加密后的數(shù)據(jù)變換成文本,使得我們可以通過幾乎任何方式安全傳遞任意 文件,比如在只有 http 的環(huán)境使用 xml 方式。 第第 2 2 章章 RSARSA 文件加密軟件的設(shè)計(jì)與實(shí)現(xiàn)文件加密軟件的設(shè)計(jì)與實(shí)現(xiàn) 2.12.1 需求分析與總體設(shè)計(jì)需求分析與總體設(shè)計(jì) 2.1.1 功能分析 經(jīng)過 1.2.2 節(jié)的論述,我們可以將對軟件的要求
24、總結(jié)如下: 可以按要求的位數(shù)生成非對稱密鑰。 可以保存密鑰和裝載密鑰,密鑰保存為純文本。 可以用指定密鑰以 RSA 算法加密任意一個(gè)文件,加密生成的數(shù)據(jù)為純 文本。 可以裝載加密過的文件,并用指定的密鑰解密還原出原文件。 提示信息完整、操作舒適、圖形界面雅觀 按上述描述,給出 Use Case 和 Statechart 如圖 2-1。 圖 2-1 本項(xiàng)目的 Use Case 和 Statechart 根據(jù)以上分析,一般來說,需要進(jìn)行編碼的程序有 RSA 密鑰生成 RSA 加密解密 任意文件的讀取和保存操作 各環(huán) 節(jié)必要的數(shù)據(jù)編碼轉(zhuǎn)換 圖形操作界面。 2.1.2 工程方案選擇 結(jié)合現(xiàn)有的常見開發(fā)
25、模式綜合分析,有多種實(shí)現(xiàn)方案,下面陳述其中幾 種,并分析選擇一種解決方案,并給出工程框架。 1. 整個(gè)工程使用 java 平臺(tái)實(shí)現(xiàn) RSA 密鑰生成、RSA 加密解密的功能實(shí)現(xiàn)十分簡單,因?yàn)闃?biāo)準(zhǔn)庫中集成幾 乎所有功能,不需要從 RSA 算法出發(fā)進(jìn)行編碼。在 j2se 標(biāo)準(zhǔn)庫中, javax.crypto 中的 Cipher 類用于具體的加密和解密,java.security 包直接 提供了數(shù)字簽名的相關(guān)方法。因?yàn)橛袕?qiáng)大的標(biāo)準(zhǔn)庫支持,文件的讀取和保存 操作、各環(huán)節(jié)必要的數(shù)據(jù)編碼轉(zhuǎn)換、圖形操作界面的實(shí)現(xiàn)也很簡單(使用 java.io java.awt 或 javax.swing 等包),如果結(jié)合一
26、種快速開發(fā)的 IDE, 比如 JBuilder,整個(gè)軟件可以在很短的時(shí)間內(nèi)編碼完成。如果不考慮非 PC 設(shè)備和機(jī)器效率等問題,java 平臺(tái)幾乎是最佳解決方案。但是缺點(diǎn)也很明顯, 如果想把核心算法和功能應(yīng)用到非 PC 設(shè)備(例如嵌入式手持設(shè)備),則要求設(shè) 備上有支持前面提及的加密類庫的 CVM;對于在 PC 上運(yùn)行,JVM 的數(shù)據(jù)運(yùn)算 速度要遠(yuǎn)遠(yuǎn)落后于本地化代碼在 PC 上的運(yùn)算速度,本軟件需要進(jìn)行大量運(yùn)算, 這一點(diǎn)不適合由 java 完成。 2. 整個(gè)工程使用.Net 平臺(tái)實(shí)現(xiàn) 與使用 java 平臺(tái)完全類似,加密等有.Net 基礎(chǔ)類庫的支持,不需要大 量編碼實(shí)現(xiàn),另外由于 Visual S
27、tudio 的強(qiáng)大便利,這種規(guī)模的工程可以十 分迅速的完成。缺點(diǎn)是只能在有微軟.Net Framework 的環(huán)境運(yùn)行,在 Windows 操作系統(tǒng),.Net Framework 的機(jī)器效率好于 java 平臺(tái),但是相比于 本地化的代碼,還是十分拖沓的。 3. 整個(gè)工程使用 Windows 本地化程序?qū)崿F(xiàn) 在不應(yīng)用 Windows 或第三方現(xiàn)成組件的情況下,需從 RSA 算法出發(fā)編碼 實(shí)現(xiàn)。其他各功能的設(shè)計(jì)開發(fā),如文件操作、數(shù)據(jù)編碼轉(zhuǎn)換和圖形界面等, 可以使用 ATL、MFC 或 Windows API 實(shí)現(xiàn)。這種工程幾乎是為 Windows 量身訂 做,執(zhí)行效率最好。但是對于非 PC 設(shè)備,
28、只能方便的移植到運(yùn)行 Windows 嵌 入式操作系統(tǒng)的設(shè)備,向其他操作系統(tǒng)移植困難,需要重新編寫大量代碼。 通常解決本地化代碼的移植問題,都是使用 C+標(biāo)準(zhǔn)庫,即功能盡量多的由 C+標(biāo)準(zhǔn)庫完成,這樣在移植的時(shí)候,只需要重新編寫操作系統(tǒng)相關(guān)的代碼即 可。這種開發(fā)方式比起前兩種,缺點(diǎn)就是設(shè)計(jì)開發(fā)模式陳舊,代碼煩瑣,不 方便維護(hù);流行的.Net 上的語言引用各種功能比較麻煩。 4. 考慮可能的復(fù)用,針對具體情況分層開發(fā)實(shí)現(xiàn) 綜合考慮復(fù)用性、可維護(hù)性和執(zhí)行效率,較妥當(dāng)?shù)姆椒ㄊ欠謱釉O(shè)計(jì)。核 心的 RSA 算法由 C+類庫實(shí)現(xiàn),針對用戶所在的操作系統(tǒng)封裝成本地化組件。 其他各功能如文件操作、數(shù)據(jù)編碼轉(zhuǎn)換
29、和圖形界面等,由托管代碼借助虛擬 機(jī)平臺(tái)標(biāo)準(zhǔn)庫的功能快速開發(fā)實(shí)現(xiàn)(本文針對選用.Net 上的 C#論述,選用 java 由 JNI 或其他方式調(diào)用本地組件,設(shè)計(jì)模式上是完全類似的)。這種開 發(fā)方式,核心功能集中在最底層,在不斷的封裝中針對具體環(huán)境對組件功能 不斷擴(kuò)充,任意一個(gè)層面的封裝都可以被直接應(yīng)用到其他項(xiàng)目,比如在 Web 使用以前為某窗體程序?qū)懙慕M件、給嵌入式設(shè)備交叉編譯算法庫等。但是每 一層都需要依賴底層的所有組件。圖 2-2 形象的說明了分層設(shè)計(jì)給復(fù)用帶來 的好處。 圖 2-2 綜合考慮復(fù)用性、可維護(hù)性和執(zhí)行效率的分層設(shè)計(jì) 選用第四種設(shè)計(jì)方案,上層使用 C#,底層算法使用 C+,可以
30、由一個(gè) Visual Studio 解決方案管理,給調(diào)試帶來極大的方便。整個(gè)工程分四層, 實(shí)現(xiàn) RSA 加密算法的 C+核心類庫、封裝 C+核心類庫的 DLL 組件、引用 DLL 的.Net 類、實(shí)現(xiàn)文件操作功能的.Net 窗體應(yīng)用程序。2.2 節(jié)詳細(xì)介紹各部分 的設(shè)計(jì)與開發(fā)。 考慮到工作量,本軟件加解密數(shù)據(jù)沒有嚴(yán)格遵從 RSA 標(biāo)準(zhǔn) PKCS #1,而 是在滿足設(shè)計(jì)要求的前提下,以一種盡可能簡單的方式實(shí)現(xiàn)加密和解密。 2.22.2 各部分的設(shè)計(jì)與開發(fā)各部分的設(shè)計(jì)與開發(fā) 2.2.1 實(shí)現(xiàn) RSA 加密算法的 C+核心類庫 1. 大數(shù)存儲(chǔ)和四則運(yùn)算 根據(jù) RSA 算法的要求,為了實(shí)現(xiàn)大數(shù)的各種復(fù)
31、雜運(yùn)算,需要首先實(shí)現(xiàn)大 數(shù)存儲(chǔ)和基本四則運(yùn)算的功能。當(dāng)今開源的大數(shù)運(yùn)算 C+類有很多,多用于 數(shù)學(xué)分析、天文計(jì)算等,本文選用了一個(gè)流行的大數(shù)類型,并針對 RSA 算法 和本項(xiàng)目的具體需要對其進(jìn)行了擴(kuò)充和改進(jìn)。下面簡單介紹大數(shù)存儲(chǔ)和四則 運(yùn)算的實(shí)現(xiàn)原理。 最先完成的功能是大數(shù)的存儲(chǔ),存儲(chǔ)功能由 flex_unit 類提供。和普通 的類型一樣,每一個(gè)大數(shù)對應(yīng)一個(gè) flex_unit 的實(shí)例。類 flex_unit 中,用 一個(gè)無符號(hào)整數(shù)指針 unsigned * a 指向一塊內(nèi)存空間的首地址,這塊內(nèi)存空 間用來存儲(chǔ)一個(gè)大數(shù),所以可以說,大數(shù)是被存儲(chǔ)在一個(gè)以 unsigned 為單元 的線性組中。在
32、方法 void reserve( unsigned x )中通過 C+的 new 來給 a 開辟空間,當(dāng) flex_unit 的實(shí)例中被存入比當(dāng)前存儲(chǔ)的數(shù)更大的數(shù)時(shí),就會(huì) 調(diào)用 reserve 來增加存儲(chǔ)空間,但是當(dāng) flex_unit 的實(shí)例中被存入比當(dāng)前存 儲(chǔ)的數(shù)更小的數(shù)時(shí),存儲(chǔ)空間并不會(huì)自動(dòng)緊縮,這是為了在運(yùn)算的時(shí)候提高 執(zhí)行效率。結(jié)合指針 a,有兩個(gè)重要的無符號(hào)整數(shù)來控制存儲(chǔ),unsigned z 和 unsigned n,z 是被分配空間的單元數(shù),隨數(shù)字變大不斷增大,不會(huì)自己 緊縮,而 n 是當(dāng)前存儲(chǔ)的大數(shù)所占的單元數(shù),組成一個(gè)大數(shù)的各 unsigned 單 元的存入和讀出由 set
33、、get 方法完成,變量 n 是只讀的。類型 unsigned 在 32 位機(jī)是 32 位的,所以對于 flex_unit 這個(gè)大數(shù)類來說,每個(gè)大數(shù)最大可 以達(dá)到 個(gè)字節(jié)長,這已經(jīng)超過了 32 位機(jī)通常的最大內(nèi)存容量,所以是足夠 進(jìn)行 RSA 所需要的各種運(yùn)算的。圖 2-3 形象的說明了大數(shù)存儲(chǔ)類 flex_unit 對大數(shù)的管理。 *a unsigned 類型的指針類型的指針 大數(shù)占大數(shù)占 n 個(gè)單元個(gè)單元 開辟了開辟了 z 個(gè)單元大的內(nèi)存?zhèn)€單元大的內(nèi)存 內(nèi)存空間內(nèi)存空間 圖 2-3 flex_unit 對大數(shù)的管理 在 flex_unit 的存儲(chǔ)功能基礎(chǔ)上,將其派生,得到 vlong_va
34、lue,在 vlong_value 中實(shí)現(xiàn)四則運(yùn)算函數(shù),并實(shí)現(xiàn)強(qiáng)制轉(zhuǎn)換運(yùn)算符 unsigned,以方 便大數(shù)類型和普通整數(shù)的互相賦值。當(dāng)大數(shù)被強(qiáng)制轉(zhuǎn)換為 unsigned 時(shí),將取 其最低四字節(jié)的值。四則運(yùn)算實(shí)現(xiàn)的原理十分簡單,都是按最基本的算術(shù)原 理實(shí)現(xiàn)的,四則運(yùn)算過程的本質(zhì)就是按一定數(shù)制對數(shù)字的計(jì)算,比如相加, 就是低位單元對齊,逐單元相加并進(jìn)位,減法同理。而乘除法和取余也都是 按照豎式運(yùn)算的原理實(shí)現(xiàn),并進(jìn)行了必要的優(yōu)化。雖然實(shí)現(xiàn)了四則運(yùn)算函數(shù), 但是若是程序里的運(yùn)算都要調(diào)用函數(shù),顯得煩瑣而且看起來不美觀,所以我 們另寫一個(gè)類 vlong,關(guān)聯(lián)(Associate,即使用 vlong_va
35、lue 類型的對象或 其指針作為成員)vlong_value,在 vlong 重載運(yùn)算符。這樣,當(dāng)我們操作 vlong 大數(shù)對象的時(shí)候,就可以像使用一個(gè)簡單類型一樣使用各種運(yùn)算符號(hào) 了。之所以將 vlong_value 的指針作為成員而不是直接構(gòu)造的對象,也是為 了提高執(zhí)行效率,因?yàn)榇笮蛯ο蟮目截愐牟簧贆C(jī)器時(shí)間。 2. 大數(shù)冪模與乘模運(yùn)算MontgomeryMontgomery 冪模算法 在實(shí)現(xiàn)了 vlong 類型后,大數(shù)的存儲(chǔ)和四則運(yùn)算的功能都完成了??紤] 到 RSA 算法需要進(jìn)行冪模運(yùn)算,需要準(zhǔn)備實(shí)現(xiàn)這些運(yùn)算的方法。所以寫一個(gè) vlong 的友元,完成冪模運(yùn)算功能。冪模運(yùn)算是 RSA
36、算法中比重最大的計(jì)算, 最直接地決定了 RSA 算法的性能,針對快速冪模運(yùn)算這一課題,西方現(xiàn)代數(shù) 學(xué)家提出了很多的解決方案。經(jīng)查閱相關(guān)數(shù)學(xué)著作,發(fā)現(xiàn)通常都是依據(jù)乘模 的性質(zhì),先將冪模運(yùn)算化簡為乘模nnbnanbamod)mod()mod(mod)( 運(yùn)算。 通常的分解習(xí)慣是指數(shù)不斷的對半分,如果指數(shù)是奇數(shù),就先減去一變 成偶數(shù),然后再對半分,例如求 D=,E=15,可分解為如下 6 個(gè)乘模nC E mod 運(yùn)算。 nCnCCCmodmod 2 1 nCnCCCmodmod 3 12 nCnCCCmodmod 6 223 nCnCCCmodmod 7 34 nCnCCCmodmod 14 445
37、 nCnCCCmodmod 15 56 歸納分析以上方法,對于任意指數(shù) E,可采用如圖 2-4 的算法流程計(jì)算 。 開始 D=1;P=C mod n E0? E 為奇數(shù)? nPDDmod)( E=E-1 nPPPmod)( E 為偶數(shù)? E=E/2 Yes No Result=D 結(jié)束 Yes Yes No No 圖 2-4 冪模運(yùn)算分解為乘模運(yùn)算的一種流程 按照上述流程,列舉兩個(gè)簡單的冪模運(yùn)算實(shí)例來形象的說明這種方法。 求的值17mod215 開始D = 1P = 2 mod 17 = 2 E = 15 E 奇數(shù)D = DP mod n = 2P = PP mod n = 4E = (E-1
38、)/2 =7 E 奇數(shù)D = DP mod n = 8P = PP mod n = 16E = (E-1)/2 =3 E 奇數(shù)D = DP mod n = 9P = PP mod n = 1E = (E-1)/2 =1 E 奇數(shù)D = DP mod n = 9P = PP mod n = 1E = (E-1)/2 =0 最終 D = 9 即為所求。 求的值13mod28 開始D = 1P = 2 mod 17 = 2 E = 8 E 偶數(shù)D = 1P = PP mod n = 4E = E/2 =4 E 偶數(shù)D = 1P = PP mod n = 3E = E/2 =2 E 偶數(shù)D = 1P
39、= PP mod n = 9E = E/2 =1 E 奇數(shù)D = DP mod n = 9P = 不需要計(jì)算 E = (E-1)/2 =0 最終 D = 9 即為所求。 觀察上述算法,發(fā)現(xiàn) E 根據(jù)奇偶除以二或減一除以二實(shí)際就是二進(jìn)制的 移位操作,所以要知道需要如何乘模變量,并不需要反復(fù)對 E 進(jìn)行除以二或 減一除以二的操作,只需要驗(yàn)證 E 的二進(jìn)制各位是 0 還是 1 就可以了。同 樣是計(jì)算,下面給出從右到左掃描二進(jìn)制位進(jìn)行的冪模算法描nCD E mod 述,設(shè)中間變量 D,P,E 的二進(jìn)制各位下標(biāo)從左到右為 u,u-1,u-2,0。 Powmod(C,E,n) D=1; P=C mod n
40、; for i=0 to u do if(Ei=1)D=D*P(mod n); P=P*P(mod n); return D; 有些文獻(xiàn)將上述算法稱為平方乘積二進(jìn)制快速算法,例如參考文獻(xiàn)中的 基于 RSA 算法的一種新的加密核設(shè)計(jì) ,其實(shí)這種算法本質(zhì)上和圖 2-4 的流 程完全一致,只是把根據(jù)指數(shù)奇偶分開的減一和除以二合并成對指數(shù)二進(jìn)制 各位的判斷而已。在本軟件的代碼中采用直接掃描 vlong 二進(jìn)制各位的辦法。 剩下的問題就是乘模運(yùn)算了。提高乘模運(yùn)算的速度是提高模冪運(yùn)算速度 的關(guān)鍵。一般情況下,n 是數(shù)百位乃至千位以上的二進(jìn)制整數(shù),用普通的除 法求模而進(jìn)行乘模運(yùn)算是不能滿足速度的要求的。為此
41、,Montgomery 在 1983 年提出了一種模加右移的乘模算法(主要著作發(fā)表于 1985 年) ,從而避免了 通常求模算法中費(fèi)時(shí)的除法步驟。本軟件僅僅是應(yīng)用 Montgomery(蒙哥馬利) 算法,算法的具體推導(dǎo)證明需要頗多數(shù)論知識(shí),不在本文的討論范圍內(nèi),如 需了解可參見蒙哥馬利的相關(guān)著作。下面簡單描述 RSA 中常用的 Montgomery(蒙哥馬利)算法供參考理解源程序。 選擇與模數(shù) n 互素的基數(shù) R=2k,n 滿足 2k1n2k, n 應(yīng)為奇數(shù)。并且 選擇 R-1及 n ,滿足 0 R-1n, 0 nn,使得 RR-1-nn1。對于 0mRn 的任意整數(shù),Montgomery 給
42、出求模乘法 mR-1 mod n 的快速算法 M(m): M(m) Rnmt RRnRm / )( 0 ;mod)mod( if (tn) return (t-n); else return t; 因?yàn)?,?t 為整數(shù);同時(shí),得RmmnnnmodnmtRmod 。由于,M(m) 中 t 結(jié)果范圍是nmRtmod 1 RnRnnm0 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)前二進(jìn)制位 Ei=1)D=M(D*P); /從低位到高位 檢測二進(jìn)制位 i+=1; if(i=E 的二進(jìn)制位
43、數(shù))break; P=M(P*P); return D*R-1 (mod n); 在具體的實(shí)現(xiàn)中,對應(yīng) monty 類的 mul 和 exp 方法。全局函數(shù) modexp 初 始化 monty 對象并調(diào)用其 exp 方法,使用的時(shí)候直接調(diào)用 modexp 即可。 3. 尋找素?cái)?shù)EratosthenesEratosthenes 篩選與 FermatFermat 素?cái)?shù)測試 首先要說明的是,事實(shí)上,當(dāng)今的計(jì)算機(jī)還不足以聰明到立刻計(jì)算生成 一個(gè)很大的隨機(jī)素?cái)?shù)。一般來說,要得到 100%準(zhǔn)確的大素?cái)?shù),都是通過查已 經(jīng)計(jì)算好的素?cái)?shù)表的方式。但是素?cái)?shù)表的方式給 RSA 的安全性帶來隱患,因 為攻擊者如果得到
44、了密鑰生成時(shí)所使用的素?cái)?shù)表,攻破 RSA 加密的難度將會(huì) 大大降低。本程序起初使用素?cái)?shù)表的方式,后來考慮到安全性問題,生成密 鑰的方式改為隨機(jī)計(jì)算生成。這樣,短時(shí)間內(nèi)如果要得到一個(gè) 100%準(zhǔn)確的大 素?cái)?shù)是很困難的,只能以盡可能高的概率得到一個(gè)大素?cái)?shù)。 經(jīng)過 和 小節(jié),所有的大數(shù)運(yùn)算功能都準(zhǔn)備完畢,在此 基礎(chǔ)上,本工程將尋找素?cái)?shù)的功能置于類 Prime_factory_san 之中。外部只 要調(diào)用本類實(shí)例的成員 vlong find_prime( vlong inp;i+) unsigned p = pli; unsigned r = start % vlong
45、(p); if (r) r = p - r; while ( r 0 x=r 圖 2-5 在素?cái)?shù)搜索范圍內(nèi)剔除小素?cái)?shù)因子 p 的倍數(shù) 接下來,對可能為素?cái)?shù)的數(shù)(即標(biāo)記數(shù)組 b中值為 1 的元素對應(yīng)的數(shù)) 進(jìn)行素?cái)?shù)測試。數(shù)論學(xué)家利用費(fèi)馬小定理研究出了多種素?cái)?shù)測試方法,本程 序使用一種最簡單的方式,直接應(yīng)用費(fèi)馬小定理。取一個(gè)與 p 互素的整數(shù) A,對于大素?cái)?shù) p 來說應(yīng)該滿足 Ap-1mod p=1,但是我們把 p 代入一個(gè)大整數(shù), 滿足這個(gè)關(guān)系的數(shù)不一定是素?cái)?shù)。這時(shí)我們改變 A,進(jìn)行多次測試,如果多 次測試都通過,這個(gè)數(shù)是素?cái)?shù)的概率就比較大。按這種原理,我們編寫素?cái)?shù) 測試函數(shù)如下。 int is
46、_probable_prime_san( const vlong /測試次數(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ù),按上一小節(jié)敘述的算法編碼。 /這里 modexp 計(jì)算 anyip-1mod p。 return 1; 測試通過,程序就判定這個(gè)數(shù)為找到的素?cái)?shù),將找到的素?cái)?shù)返回給上層 程序使用。在這里其實(shí)有一個(gè)不可忽視的問題,就是得到一個(gè)測試
47、通過的合 數(shù)。對于這種情況,RSA 算法加密解密是否還可以實(shí)現(xiàn),是一個(gè)需要從數(shù)學(xué) 角度論證的問題。因?yàn)榈玫剿財(cái)?shù)的概率很高,經(jīng)過一整天的生成密鑰和加密 操作,沒有發(fā)現(xiàn)失敗的密鑰, 所以本文暫沒有對這個(gè)問題進(jìn)行討論。 綜上所述,總結(jié)素?cái)?shù)尋找的流程,如圖 2-6 所示。 開始 按 start 參數(shù)初始化標(biāo)記數(shù)組 bSS ; i=0 計(jì)數(shù) i8。 以上公式其實(shí)也可以從理論上得到,因?yàn)槟?shù) n 取 8 位時(shí),冪模運(yùn)算的 結(jié)果仍然近似為 8 位,這時(shí)一個(gè)字節(jié)的數(shù)據(jù)經(jīng)過加密,得到的數(shù)據(jù)大小近似 不變,轉(zhuǎn)換成十六進(jìn)制文本,大小就增加了 1 倍。按此原理,冪模運(yùn)算結(jié)果 長度近似為加密模數(shù) n 的長度,加密后數(shù)據(jù)
48、長度是加密前的 N/8 倍(N 是加 密位數(shù)) ,而轉(zhuǎn)換為十六進(jìn)制文本后長度又增大 1 倍,加密后得到的文本長度 就是加密前原始數(shù)據(jù)大小的 N/4 倍,所以 B=AN/4,這與前面從實(shí)驗(yàn)結(jié)果總 結(jié)得到的公式基本一致,可以把公式中的 260 修正為更精確一些的 256。 3. 以多字節(jié)為步長,對文件進(jìn)行加密 默認(rèn)的設(shè)置是加密時(shí)逐個(gè)字節(jié)進(jìn)行 RSA 運(yùn)算,可以通過設(shè)置窗體把分塊 的大小更改為其他長度,比如 2 字節(jié)一組、4 字節(jié)一組,進(jìn)行 RSA 運(yùn)算。下 面測試多字節(jié)為步長的加密執(zhí)行效率。取一個(gè) 480 字節(jié)長的文件作為加密對 象,對其進(jìn)行 512bit RSA 公鑰加密、私鑰解密還原,記錄所消
49、耗的時(shí)間。統(tǒng) 計(jì)數(shù)據(jù)如表 3-6 所示。 表 3-6 加密分段大小改變對效率的影響測試(消耗時(shí)間單位:秒) 加密方 式 步 長 2 字節(jié)4 字節(jié)6 字節(jié)8 字節(jié)10 字節(jié) 512bit 公鑰加 密 23.555112.82057.81175.91855.1848 512bit 私鑰解 密 46.308323.608916.108311.48209.2541 可見,增大加密步長使加密解密速度大幅增加,而且大步長的加密生成 的文本文件體積也比小步長的小。這都是因?yàn)樵龃罅瞬介L后,文件被分成的 塊數(shù)少了,冪模運(yùn)算次數(shù)下降。所以在使用 RSA 加密時(shí),設(shè)置使用合適的數(shù) 據(jù)分塊也是提高加密速度的關(guān)鍵。 4
50、. 在更快的 PC,對進(jìn)行文件加密測試 在一些性能更好的 PC 上,本軟件可以獲得更好的性能,測試數(shù)據(jù)同樣可 以分析得到以上段落敘述的結(jié)論。下面對照表 3-4,給出一組其他 PC 上同樣 的測試得到的數(shù)據(jù),測試 PC 配置為 CPU AMD Athron2800+,外頻 333MHZ,物 理內(nèi)存 512MB。數(shù)據(jù)見表 3-7。 表 3-7 待加密文件大小與加密時(shí)間的關(guān)系再次測試(時(shí)間單位:秒) n 位數(shù) 文件大 小 50Byte100Byte150Byte200Byte250Byte 512bit 公鑰加 密 2.43474.89757.17289.450811.9837 512bit 私鑰解
51、 密 4.77259.442714.00219.012523.6544 1024bit 公鑰加 密 6.350112.236418.245924.300130.1284 1024bit 私鑰解 密 20.010139.875460.212679.335199.5482 對于這組數(shù)據(jù),表 3-4 后的推理分析仍都成立。在此 PC 測試填寫表 3- 6,同樣得到了類似規(guī)律的數(shù)據(jù),在此不再羅列。經(jīng)過一系列各種機(jī)型、各種 Windows 操作系統(tǒng)(包括 Windows XP/2000SP4/ME/98,均需.Net 框架)上的 測試,本軟件均能正常運(yùn)行。在 2006 年初主流配置的 PC 上運(yùn)行此軟件
52、,逐 字節(jié)加密 1KB 大小的文件,消耗時(shí)間均在 1 分鐘以內(nèi)。 3.2.4 性能分析與改進(jìn)優(yōu)化 經(jīng)過一系列的 RSA 密鑰生成、文件輸入輸出和加密解密測試,做簡要的 性能分析如下。 軟件消耗時(shí)間的運(yùn)算,大部分集中在 C+核心類庫,即 RSA 相關(guān)的各 種運(yùn)算。其中,冪模運(yùn)算和尋找素?cái)?shù)對時(shí)間的消耗最大,在核心優(yōu)化時(shí)應(yīng)優(yōu) 先考慮。 文件輸入輸出消耗時(shí)間其次,因?yàn)榇疟P讀寫速度要遠(yuǎn)遠(yuǎn)低于內(nèi)存讀寫 速度。所以,應(yīng)該將頻繁的讀寫操作盡量集中到內(nèi)存,然后一次性寫入磁盤。 針對以上兩點(diǎn),軟件應(yīng)進(jìn)行一系列改進(jìn)和優(yōu)化。主要有以下幾方面。 在要對文件進(jìn)行加密解密的時(shí)候,先將文件按一定的數(shù)據(jù)結(jié)構(gòu)讀入內(nèi) 存,然后進(jìn)行
53、加密或解密操作。運(yùn)算數(shù)據(jù)都讀取自內(nèi)存。 在對加密或解密完成的數(shù)據(jù)進(jìn)行寫出的時(shí)候,都是將其直接寫到指定 好的文件,即直接寫入磁盤。這是因?yàn)椋紤]到中途可能因?yàn)橐馔鈹嚯姷仍?因引起操作中斷,為了保護(hù)已經(jīng)花費(fèi)時(shí)間運(yùn)算完成的數(shù)據(jù),將其直接寫入磁 盤。 在關(guān)鍵算法上做進(jìn)一步優(yōu)化,例如在尋找素?cái)?shù)時(shí),素?cái)?shù)測試使用更快 速的算法;還有 3.3 節(jié)提到的,在用私有密鑰進(jìn)行冪模運(yùn)算時(shí)使用中國余數(shù) 定理等。 對 C+核心類庫進(jìn)行重點(diǎn)優(yōu)化,使其運(yùn)算效率盡可能提高。其中包括 對各類之間的組織細(xì)節(jié)、各程序模塊的具體編寫等,進(jìn)行全面細(xì)致的檢查和 修改,例如將大數(shù)據(jù)類型以對象指針傳遞而不拷貝,將簡單的 for 循環(huán)展開 等。
54、 由于開發(fā)時(shí)間倉促等因素,在書寫本文時(shí),軟件并未完成全面細(xì)致的優(yōu) 化。 3.33.3 使用中國余數(shù)定理使用中國余數(shù)定理 對于用 RSA 加密解密的一方,是計(jì)算 mod d MCn 。這里 npq,p 和 q 是兩個(gè)二進(jìn)制長度接近的大素?cái)?shù)。由于用私密密鑰加密或解密的一方實(shí) 際知道 n 的分解,即 p 和 q,所以這一計(jì)算可以分解為以下兩部分分別進(jìn)行 (附錄中有中國余數(shù)定理的簡單介紹) 。 12 1122mod ,mod dd mCp mCq 其中的 C1、C2、d1、d2 如下: 1 2 1 2 mod , mod , mod(1), mod(1), CCp CCq ddp ddq 根據(jù) RSA
55、 算法的要求,私密密鑰 d 的二進(jìn)制長度接近 n 的長度,因此, d1 和 d2 的二進(jìn)制長度僅有 n 的一半左右,這樣就節(jié)省了大量的計(jì)算工作。 最后,應(yīng)用中國余數(shù)定理就能計(jì)算出的值 m。,其npymqymmmod)( 2211 中.qpypqymod1,mod1 21 如果應(yīng)用中國余數(shù)定理計(jì)算冪模,主要工作花在計(jì)算 12 1122mod ,mod dd mCp mCq 上,計(jì)算 C1、C2、d1、d2 和 m 的運(yùn)算與冪摸 運(yùn)算相比,計(jì)算時(shí)間較短可以不計(jì)。而位數(shù)對冪摸運(yùn)算速度影響很大,因此 分開計(jì)算 12 1122mod ,mod dd mCp mCq 比計(jì)算 mod d MCn 要快很多。
56、經(jīng)過 測試,使用中國余數(shù)定理來簡化一些冪模運(yùn)算,速度比不使用中國余數(shù)定理 時(shí)有很大的提高。 在書寫本文時(shí)軟件中尚未使用中國余數(shù)定理。 第第 4 4 章章 可移植模塊的簡要說明與開發(fā)前景可移植模塊的簡要說明與開發(fā)前景 如 2.1.2 節(jié)所敘述,分層設(shè)計(jì)給移植帶來方便,下面簡要敘述各層可能 的移植方式。 實(shí)現(xiàn) RSA 加密算法的 C+核心類庫,是基于 C 和 C+的標(biāo)準(zhǔn)庫創(chuàng)建的, 沒有用到 C+泛型計(jì)算、STL 相關(guān)內(nèi)容,代碼中沒有任何與操作系統(tǒng)相關(guān)的內(nèi) 容。這是一種移植特性最好的程序模塊,因?yàn)楝F(xiàn)今多數(shù)非 PC 設(shè)備支持 C+編 譯。一般可以直接將本模塊交叉編譯給嵌入式設(shè)備,或在其他操作系統(tǒng)編譯
57、使用。在編譯前,將 rsa_san.cpp 和 vlong.cpp 文件中的#include stdafx.h一行去掉,然后連同各自的頭文件拷貝出來,僅這四個(gè)文件即為 實(shí)現(xiàn) RSA 加密算法的 C+類庫代碼。例如,可以將它們在 linux 操作系統(tǒng)用 gcc 編譯成程序模塊,把 RSA 加密功能提供給系統(tǒng)上的其他程序使用。 封裝 C+核心類庫的 DLL 組件可以被 Windows 上的很多開發(fā)環(huán)境引用。 例如在 VB6,要使用這個(gè)組件,只需在程序最開始以引用 win32api 的方式引 用即可,即 public declare function XXX 的形式。 作為.Net 類庫,此模塊可以
58、被幾十種支持.Net 的語言引用。但是由于 底層 DLL 組件的存在,使應(yīng)用局限于 PC 上的 Windows 系統(tǒng)。在此層的使用不 僅限于窗體應(yīng)用程序,.Net 類庫可以由服務(wù)器程序(諸如 aspx)方便的引用, 以 BS(瀏覽器服務(wù)器)的模式提供給網(wǎng)絡(luò)上的用戶使用,所以此應(yīng)用程序可 以通過簡單的修改用于數(shù)字證書和數(shù)字簽名等身份驗(yàn)證系統(tǒng)。 如 1.2.2 節(jié)最后所分析的,將任意文件加密成文本有其重要的意義。 因?yàn)榇藨?yīng)用程序是可以將任意文件加密成文本的,所以加密成的數(shù)據(jù)可 以方便的在 Internet 上傳送。由此想到 xml 在 Internet 上攜帶數(shù)據(jù)的應(yīng)用 模式。實(shí)際上,此軟件可以通
59、過簡單的修改實(shí)現(xiàn)將任意文件加密為一定格式 的 xml 文件。通過這種加密方式,可以滿足重要的小應(yīng)用程序等小型二進(jìn)制 數(shù)據(jù)在網(wǎng)絡(luò)上安全順利傳輸?shù)囊?。而且,通過加密的數(shù)據(jù)以 xml 方式傳送, 使 web 應(yīng)用的靈活性更好,此方式甚至可以看作一種通用的小型二進(jìn)制數(shù)據(jù) 安全交換協(xié)議來開發(fā)。 總結(jié)與體會(huì)總結(jié)與體會(huì) RSA 應(yīng)用于文件加密適合交流管理小型文件,將任意文件以非對稱密鑰 加密成文本可以對其更方便的交流和管理,有廣闊的開發(fā)前景。本項(xiàng)目應(yīng)用 的設(shè)計(jì)模式兼顧執(zhí)行效率和可復(fù)用性。整個(gè)項(xiàng)目開放源代碼和各種開發(fā)資料, 便于引用和繼續(xù)開發(fā)。應(yīng)用本程序可以方便的在公眾論壇等環(huán)境交流要求高 度安全的各種數(shù)據(jù),包括任意二進(jìn)制和文本文件。 通過對 RSA 文件加密的畢業(yè)論文設(shè)計(jì),學(xué)習(xí)到了很多關(guān)于密碼學(xué)的有關(guān) 信息,為今后的工作有很大的幫助。也對如何設(shè)計(jì)一款好性能的軟件有了進(jìn) 一步的認(rèn)識(shí)和了解。在寫論文的過程中老師、同學(xué)們的熱心指導(dǎo)給了我非常 大的幫助。 致謝詞致謝詞 感謝秦海玉老師的細(xì)心指導(dǎo)和各論壇
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 30137-2024電能質(zhì)量電壓暫升、電壓暫降與短時(shí)中斷
- 2024版泥水作業(yè)班組承包協(xié)議書
- 二零二五年度股權(quán)收益權(quán)轉(zhuǎn)讓合同范本與收益分配3篇
- 二零二五年航空航天零部件制造合同協(xié)議模板2025版3篇
- 二零二五年金融產(chǎn)品居間服務(wù)協(xié)議范本3篇
- 二零二五年度智能化設(shè)備技術(shù)入股合作協(xié)議范本3篇
- GRC材質(zhì)2024裝飾構(gòu)件定制合作協(xié)議版B版
- 二零二五版汽車租賃轉(zhuǎn)讓與保險(xiǎn)責(zé)任合同2篇
- 2024混凝土施工勞務(wù)分包合同
- 2024年跨區(qū)域生態(tài)環(huán)境保護(hù)合作協(xié)議
- HG-T+21527-2014回轉(zhuǎn)拱蓋快開人孔
- JTS-167-2-2009重力式碼頭設(shè)計(jì)與施工規(guī)范
- DBJ-T15-81-2022 建筑混凝土結(jié)構(gòu)耐火設(shè)計(jì)技術(shù)規(guī)程
- GB/T 22849-2024針織T恤衫
- 山東省淄博市2023-2024學(xué)年高二上學(xué)期教學(xué)質(zhì)量檢測化學(xué)試題
- 人工智能在電影與影視制作中的創(chuàng)新與效果提升
- 新生兒腸絞痛的課件
- 酒店民宿自媒體營銷策劃
- 消除母嬰傳播培訓(xùn)課件
- 包裝過程質(zhì)量控制
- 通用電子嘉賓禮薄
評論
0/150
提交評論