信息安全 LibTomCrypt 實(shí)驗(yàn)2.docx_第1頁
信息安全 LibTomCrypt 實(shí)驗(yàn)2.docx_第2頁
信息安全 LibTomCrypt 實(shí)驗(yàn)2.docx_第3頁
信息安全 LibTomCrypt 實(shí)驗(yàn)2.docx_第4頁
信息安全 LibTomCrypt 實(shí)驗(yàn)2.docx_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

山東大學(xué) 軟件 學(xué)院 信息安全 課程實(shí)驗(yàn)報(bào)告學(xué)號(hào):2姓名: 班級(jí):實(shí)驗(yàn)題目: 使用RAS加解密一個(gè)文件實(shí)驗(yàn)學(xué)時(shí): 4實(shí)驗(yàn)日期: 2016/12/21實(shí)驗(yàn)?zāi)康模海?)掌握公鑰算法的使用方法(2)掌握混合密碼體制的工作原理硬件環(huán)境:Lenovo G50-70 Win10軟件環(huán)境:VS2013實(shí)驗(yàn)步驟與內(nèi)容:(1)使用RSA 算法加解密和簽名驗(yàn)證(2)使用混合密碼體制的文件加密一、知識(shí)準(zhǔn)備我們還是需要準(zhǔn)備tomcrypt.lib的靜態(tài)庫文件。那么 首先是 在visual studio 2013中打開libTomMath庫,直接編譯(build),生成項(xiàng)目,然后會(huì)在 Debug 文件里面找到 libtommath.lib 文件,然后將這個(gè)文件復(fù)制到 LibTomCrypt庫里面的header里面,然后從VS2013直接打開LibTomCrypt 庫,配置一下 庫 和 h 頭文件的路徑,然后直接編譯,生成項(xiàng)目。大概向下面那樣: 然后我們新建一個(gè)工程,并且將以 libtomcrypt開頭的 .h 文件,全部復(fù)制到我們新建的引用庫的 include 文件夾里面 里面可以開始在我們工程 Crypt 里面引用我們的 .lib 文件。同樣需要給這個(gè) Crypt 工程配置庫路徑和 頭文件路徑,如下面:另外還需要添加一個(gè).lib的名字項(xiàng)目準(zhǔn)備階段大概就是這樣,然后我們還需要對RSA算法有一些了解。二、代碼解析首先我們要選擇RSA的一種加解密機(jī)制,RSA的加密機(jī)制有兩種方案:一個(gè)是RSAES-OAEP,另一個(gè)RSAES-PKCS1-v1_5。PKCS#1推薦在新的應(yīng)用中使用RSAES- OAEP,保留RSAES-PKCS#1-v1_5跟老的應(yīng)用兼容。它們兩的區(qū)別僅僅在于加密前編碼的方式不同。而加密前的編碼是為了提供了抵抗各種活動(dòng)的敵對攻擊的安全機(jī)制。 PKCS#1的簽名機(jī)制也有種方案:RSASSA-PSS和RSASSA-PKCS1-v1_5。同樣,推薦RSASSA-PSS用于新的應(yīng)用而RSASSA-PKCS1-v1_5用于兼容老的應(yīng)用。聲明一個(gè) padding 變量,這個(gè)與后期的加解密函數(shù)中的填充方式有關(guān):然后我們需要注冊一個(gè)偽隨機(jī)數(shù)發(fā)生器,: 然后需要注冊一個(gè)數(shù)學(xué)類庫: 另外在我們還需要找到 hash 函數(shù)和 偽隨機(jī)數(shù)發(fā)生器函數(shù)的位置: RSA算法加密要用到公鑰,所以我們要生一個(gè)公鑰,要用到 rsa_make_key這個(gè)方法。但是在調(diào)用方法之前我們需要初始化一個(gè)數(shù)學(xué)庫的一個(gè)宏定義,這個(gè)很重要,因?yàn)檫@個(gè)bug調(diào)了很長時(shí)間,我們首先要在main函數(shù)的上面,進(jìn)行預(yù)定義:#define LTM_DESC 然后我們還要在 方法里面初始化一個(gè) ltc_mp 變量,ltc_mp = ltm_desc; 但是這樣編譯項(xiàng)目會(huì)出現(xiàn)變量未定義的錯(cuò)誤,所以我們還要在項(xiàng)目的屬性的預(yù)編譯器里面添加一個(gè)LTM_DESC變量:然后,我們就可以調(diào)用rsa_make_key生成一個(gè) rsa_key:然后我們就可以使用rsa_encrypt_key_ex() 進(jìn)行對明文加解密,我們可以看到這個(gè)函數(shù)的參數(shù),包括了需要加密的明文pt,密文ct,隨機(jī)數(shù)生成器的位置參數(shù)prng,數(shù)學(xué)庫函數(shù)的位置參數(shù)hash_idx,填充方式padding,以及密鑰 key : 那么同樣我們對密文進(jìn)行解密的時(shí)候,用到了rsa_decrypt_key_ex() 方法,參數(shù)同樣包括了需要解密的密文ct,解密后的明文pt,數(shù)學(xué)庫的位置參數(shù)hash_idx,填充方式padding,以及密鑰 key,還有返回的參數(shù) state ,表示解密數(shù)據(jù)是否成功。三、測試用例 我們需要選擇一種加密機(jī)制,并且需要輸入想要的加密的明文,在這里并沒有做文件的讀入,核心內(nèi)容已經(jīng)包括進(jìn)來了:四、代碼附錄1. / RSA.cpp : Defines the entry point for the console application.2. /3. #include stdafx.h4. #include tomcrypt.h5. #define LTM_DESC6.7. int _tmain(int argc, _TCHAR* argv)8. 9. int error, hash_idx, prng_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ī)制n1-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. 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. 功能說明:注冊一個(gè)偽隨機(jī)數(shù)生成器45. 參數(shù)說明:const struct ltc_prng_descriptor *prng-一個(gè)prng結(jié)構(gòu)體46. 返回值說明:返回值為-1表示注冊一個(gè)prng失敗,否則注冊成功47. */48. if (register_prng(&sprng_desc) = -1)49. printf(Error registering sprng);50. return EXIT_FAILURE;51. 52.53. /*注冊 一個(gè)數(shù)學(xué)類庫*/54.55. /ltc_mp = ltm_desc;56.57. /*58. 函數(shù)定義:int register_hash(const struct ltc_hash_descriptor *hash);59. 功能說明:注冊一個(gè)數(shù)學(xué)庫60. 參數(shù)說明:const struct ltc_hash_descriptor *hash -一個(gè)hash結(jié)構(gòu)體61. 返回值說明:返回值為-1表示注冊一個(gè)數(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 char *name);70. 功能說明:在hash表里查找一個(gè)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表里查找一個(gè)prng79. 參數(shù)說明:const char *name -要查找的prng的name80. 返回值說明:返回值為-1表示查找失?。环駝t返回該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. 功能說明:生成一個(gè)1024bit的RSA密鑰89. 參數(shù)說明:prng_state *prng-prng狀態(tài)90. int wprng-prng標(biāo)志91. int size-密鑰長度92. long e-加密時(shí)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 != CRYPT_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, unsigned 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 - 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. (unsigned 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. printf(%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 *stat, 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

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論