




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、山東大學(xué) 軟件 學(xué)院 信息安全 課程實驗報告 學(xué)號:2姓名: 班級:實驗題目: 使用RAS加解密一個文件實驗學(xué)時: 4實驗日期: 2016/12/21實驗?zāi)康模海?)掌握公鑰算法的使用方法(2)掌握混合密碼體制的工作原理硬件環(huán)境:Lenovo G50-70 Win10軟件環(huán)境:VS2013實驗步驟與內(nèi)容:(1)使用RSA 算法加解密和簽名驗證(2)使用混合密碼體制的文件加密一、知識準(zhǔn)備我們還是需要準(zhǔn)備tomcrypt.lib的靜態(tài)庫文件。那么 首先是 在visual studio 2013中打開libTomMath庫,直接編譯(build),生成項目,然后會在 Debug 文件里面找
2、到 libtommath.lib 文件,然后將這個文件復(fù)制到 LibTomCrypt庫里面的header里面,然后從VS2013直接打開LibTomCrypt 庫,配置一下 庫 和 h 頭文件的路徑,然后直接編譯,生成項目。大概向下面那樣: 然后我們新建一個工程,并且將以 libtomcrypt開頭的 .h 文件,全部復(fù)制到我們新建的引用庫的 include 文件夾里面 里面可以開始在我們工程 Crypt 里面引用我們的 .lib 文件。同樣需要給這個 Crypt 工程配置庫路徑和 頭文件路徑,如下面:另外還需要添加一個.lib的名字項目準(zhǔn)備階段大概就是這樣,然后我們還需要對RSA算法有一些了
3、解。二、代碼解析首先我們要選擇RSA的一種加解密機(jī)制,RSA的加密機(jī)制有兩種方案:一個是RSAES-OAEP,另一個RSAES-PKCS1-v1_5。PKCS#1推薦在新的應(yīng)用中使用RSAES- OAEP,保留RSAES-PKCS#1-v1_5跟老的應(yīng)用兼容。它們兩的區(qū)別僅僅在于加密前編碼的方式不同。而加密前的編碼是為了提供了抵抗各種活動的敵對攻擊的安全機(jī)制。 PKCS#1的簽名機(jī)制也有種方案:RSASSA-PSS和RSASSA-PKCS1-v1_5。同樣,推薦RSASSA-PSS用于新的應(yīng)用而RSASSA-PKCS1-v1_5用于兼容老的應(yīng)用。聲明一個 padding 變量,這個與后期的加解
4、密函數(shù)中的填充方式有關(guān):然后我們需要注冊一個偽隨機(jī)數(shù)發(fā)生器,: 然后需要注冊一個數(shù)學(xué)類庫: 另外在我們還需要找到 hash 函數(shù)和 偽隨機(jī)數(shù)發(fā)生器函數(shù)的位置: RSA算法加密要用到公鑰,所以我們要生一個公鑰,要用到 rsa_make_key這個方法。但是在調(diào)用方法之前我們需要初始化一個數(shù)學(xué)庫的一個宏定義,這個很重要,因為這個bug調(diào)了很長時間,我們首先要在main函數(shù)的上面,進(jìn)行預(yù)定義:#define LTM_DESC 然后我們還要在 方法里面初始化一個 ltc_mp 變量,ltc_mp = ltm_desc; 但是這樣編譯項目會出現(xiàn)變量未定義的錯誤,所以我們還要在項目的屬性的預(yù)編譯器里面添加
5、一個LTM_DESC變量:然后,我們就可以調(diào)用rsa_make_key生成一個 rsa_key:然后我們就可以使用rsa_encrypt_key_ex() 進(jìn)行對明文加解密,我們可以看到這個函數(shù)的參數(shù),包括了需要加密的明文pt,密文ct,隨機(jī)數(shù)生成器的位置參數(shù)prng,數(shù)學(xué)庫函數(shù)的位置參數(shù)hash_idx,填充方式padding,以及密鑰 key : 那么同樣我們對密文進(jìn)行解密的時候,用到了rsa_decrypt_key_ex() 方法,參數(shù)同樣包括了需要解密的密文ct,解密后的明文pt,數(shù)學(xué)庫的位置參數(shù)hash_idx,填充方式padding,以及密鑰 key,還有返回的參數(shù) state ,
6、表示解密數(shù)據(jù)是否成功。三、測試用例 我們需要選擇一種加密機(jī)制,并且需要輸入想要的加密的明文,在這里并沒有做文件的讀入,核心內(nèi)容已經(jīng)包括進(jìn)來了:四、代碼附錄1. / RSA.cpp : Defines the entry point for the console application.2. /3. #include "stdafx.h"4. #include "tomcrypt.h"5. #define LTM_DESC6.7. int _tmain(int argc, _TCHAR* argv)8. 9. int error, hash_idx, p
7、rng_idx, res;10. unsigned long l1, l2;/聲明11. unsigned char pt16, pt216, out1024;12. rsa_key key;13.14. int padding = 3;15.16. FILE *plainText = 0, *cryptText = 0, *decryptText = 0;/文件流17.18. int inpadding;19. printf("*RSA加解密算法*n");20. memset(pt, 0, sizeof(pt);/清空輸入21. printf("請選擇加密機(jī)制n
8、1-RSAES-PKCS1-V1_5n2-RSAES-OAEPn其他任意鍵退出n");22. printf("*n");23. scanf("%d", &inpadding);24. switch (inpadding)25. 26. case 1:27. printf("請輸入明文(16字節(jié)以下)n");28. scanf("%s", &pt);29. padding = LTC_LTC_PKCS_1_V1_5;/LTC_LTC_PKCS_1_V1_5 = 130. break;31.
9、case 2:32. printf("請輸入明文(16字節(jié)以下)n");33. scanf("%s", &pt);34. padding = LTC_LTC_PKCS_1_OAEP;/LTC_LTC_PKCS_1_OAEP = 235. break;36. default:37. return 0;/表示退出38. 39.40.41. /*register prng*/42. /*43. 函數(shù)定義:int register_prng(const struct ltc_prng_descriptor *prng);44. 功能說明:注冊一個偽隨機(jī)數(shù)
10、生成器45. 參數(shù)說明:const struct ltc_prng_descriptor *prng-一個prng結(jié)構(gòu)體46. 返回值說明:返回值為-1表示注冊一個prng失敗,否則注冊成功47. */48. if (register_prng(&sprng_desc) = -1)49. printf("Error registering sprng");50. return EXIT_FAILURE;51. 52.53. /*注冊 一個數(shù)學(xué)類庫*/54.55. /ltc_mp = ltm_desc;56.57. /*58. 函數(shù)定義:int register_ha
11、sh(const struct ltc_hash_descriptor *hash);59. 功能說明:注冊一個數(shù)學(xué)庫60. 參數(shù)說明:const struct ltc_hash_descriptor *hash -一個hash結(jié)構(gòu)體61. 返回值說明:返回值為-1表示注冊一個數(shù)學(xué)庫失敗,否則注冊成功62. */63. if (register_hash(&sha1_desc) = -1)64. printf("注冊 數(shù)學(xué)庫失敗");65. return EXIT_FAILURE;66. 67.68. /*69. 函數(shù)定義:int find_hash(const c
12、har *name);70. 功能說明:在hash表里查找一個hash71. 參數(shù)說明:const char *name -要查找的hash的name72. 返回值說明:返回值為-1表示查找失??;否則返回該hash在hash表里的位置73. */74. hash_idx = find_hash("sha1");75.76. /*77. 函數(shù)定義:int find_prng(const char *name);78. 功能說明:在prng表里查找一個prng79. 參數(shù)說明:const char *name -要查找的prng的name80. 返回值說明:返回值為-1表示查找
13、失??;否則返回該prng在prng表里的位置81. */82. prng_idx = find_prng("sprng");83.84. /*make an RSA-1024 key*/85.86. /*87. 函數(shù)定義:int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);88. 功能說明:生成一個1024bit的RSA密鑰89. 參數(shù)說明:prng_state *prng-prng狀態(tài)90. int wprng-prng標(biāo)志91. int size-密鑰長度92. lo
14、ng e-加密時e的值93. rsa_key *key-RSA密鑰94. 返回值說明:返回值為0表示生成密鑰成功,否則生成密鑰失敗95. */96. ltc_mp = ltm_desc;97.98. error = rsa_make_key(NULL, /* PRNG state */99. prng_idx, /* PRNG idx */100. 1024 / 8, /* 1024-bit key */101. 65537, /* we like e=65537 */102. &key); /* where to store the key */103. if (error != C
15、RYPT_OK) 104. printf("rsa_make_key %s", error_to_string(error);105. return EXIT_FAILURE;106. 107.108. /RSA 加解密流程109. 110. /加密111. /*112. 函數(shù)定義:int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen, unsigned char *out,113. unsigned long *outlen, const unsigned char *lparam, uns
16、igned long l paramlen, prng_state *prng, 114. int prng_idx, int hash_idx, int padding, rsa_key *key);115. 功能說明:RSA加密過程,對輸入的明文進(jìn)行加密116. 參數(shù)說明:const unsigned char *in -要加密的明文117. unsigned long inlen -明文長度118. unsigned char *out -存放加密后的密文119. unsigned long *outlen -密文長度120. const unsigned char *lparam -
17、lparam參數(shù)121. unsigned long l paramlen-lparam長度122. prng_state *prng- prng狀態(tài)123. int prng_idx-prng標(biāo)志124. int hash_idx-hash標(biāo)志125. int padding-填充方式126. rsa_key *key-密鑰127. 返回值說明:返回值為0表示加密成功,否則加密失敗128. */129. l1 = sizeof(out);130. error = rsa_encrypt_key_ex(131. pt,132. 16,133. out,134. &l1,135. (un
18、signed char *)"zhaoshuai-960229",136. 16,137. NULL,138. prng_idx,139. hash_idx,140. padding,141. &key);142. if (error != CRYPT_OK)143. printf("加密失敗。");144. return EXIT_FAILURE;145. 146.147. printf("n加密之后的密文(16進(jìn)制):n");148. for (int i = 0; i <= 127; i+)149. 150. pr
19、intf("%02x", outi);151. 152. printf("n");153.154. /解密155. /*156. 函數(shù)定義:int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen, unsigned char *out,157. unsigned long *outlen, const unsigned char *lparam , unsigned long158. lparamlen, int hash_idx , int padding, int *st
20、at, rsa_key*key);159. 功能說明:RSA解密過程,對密文進(jìn)行解密160. 參數(shù)說明:const unsigned char *in -要解密的密文161. unsigned long inlen -密文長度162. unsigned char *out -存放解密后的明文163. unsigned long *outlen -明文長度164. const unsigned char *lparam - lparam參數(shù)165. unsigned long l paramlen-lparam長度166. int hash_idx-hash標(biāo)志167. int padding-填充方式168. int *stat-解密后的數(shù)據(jù)正確與否169. rsa_key *key-密鑰170. 返回值說明:返回值為0表示解密成功,否則解密失敗171. */172. /memse
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 東莞美容院加盟合同范本
- 個人房產(chǎn)與中介合同范本
- 先拿貨后付款合同范例
- 2024年吳忠市人民醫(yī)院自主招聘事業(yè)單位工作人員考試真題
- 加盟授權(quán)合同范例范例
- 農(nóng)村空地出售合同范本
- 2024年曲靖六十九醫(yī)院人才招聘考試真題
- 以資抵債合同范本
- 2024年廣州市天河區(qū)體育西路小學(xué)聘用制專任教師招聘考試真題
- 創(chuàng)意園廠房合同范例
- 2025年企業(yè)法務(wù)顧問聘用協(xié)議范本
- 無菌手術(shù)臺鋪置的細(xì)節(jié)管理
- 《康復(fù)評定技術(shù)》課件-第五章 運動控制
- 議論文8(試題+審題+范文+點評+素材)-2025年高考語文寫作復(fù)習(xí)
- 【理特咨詢】2024生成式人工智能GenAI在生物醫(yī)藥大健康行業(yè)應(yīng)用進(jìn)展報告
- 2025新人教版英語七年級下單詞默寫表(小學(xué)部分)
- 2025年春新外研版(三起)英語三年級下冊課件 Unit6第1課時Startup
- 2025江蘇蘇州高新區(qū)獅山商務(wù)創(chuàng)新區(qū)下屬國企業(yè)招聘9人高頻重點提升(共500題)附帶答案詳解
- 《蒙牛集團(tuán)實施財務(wù)共享過程中存在的問題及優(yōu)化建議探析》8800字(論文)
- 平拋運動的經(jīng)典例題
- 錄井作業(yè)現(xiàn)場風(fēng)險評估及控制措施
評論
0/150
提交評論