已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
山东大学 软件 学院 信息安全 课程实验报告学号:2姓名: 班级:实验题目: 使用RAS加解密一个文件实验学时: 4实验日期: 2016/12/21实验目的:(1)掌握公钥算法的使用方法(2)掌握混合密码体制的工作原理硬件环境:Lenovo G50-70 Win10软件环境:VS2013实验步骤与内容:(1)使用RSA 算法加解密和签名验证(2)使用混合密码体制的文件加密一、知识准备我们还是需要准备tomcrypt.lib的静态库文件。那么 首先是 在visual studio 2013中打开libTomMath库,直接编译(build),生成项目,然后会在 Debug 文件里面找到 libtommath.lib 文件,然后将这个文件复制到 LibTomCrypt库里面的header里面,然后从VS2013直接打开LibTomCrypt 库,配置一下 库 和 h 头文件的路径,然后直接编译,生成项目。大概向下面那样: 然后我们新建一个工程,并且将以 libtomcrypt开头的 .h 文件,全部复制到我们新建的引用库的 include 文件夹里面 里面可以开始在我们工程 Crypt 里面引用我们的 .lib 文件。同样需要给这个 Crypt 工程配置库路径和 头文件路径,如下面:另外还需要添加一个.lib的名字项目准备阶段大概就是这样,然后我们还需要对RSA算法有一些了解。二、代码解析首先我们要选择RSA的一种加解密机制,RSA的加密机制有两种方案:一个是RSAES-OAEP,另一个RSAES-PKCS1-v1_5。PKCS#1推荐在新的应用中使用RSAES- OAEP,保留RSAES-PKCS#1-v1_5跟老的应用兼容。它们两的区别仅仅在于加密前编码的方式不同。而加密前的编码是为了提供了抵抗各种活动的敌对攻击的安全机制。 PKCS#1的签名机制也有种方案:RSASSA-PSS和RSASSA-PKCS1-v1_5。同样,推荐RSASSA-PSS用于新的应用而RSASSA-PKCS1-v1_5用于兼容老的应用。声明一个 padding 变量,这个与后期的加解密函数中的填充方式有关:然后我们需要注册一个伪随机数发生器,: 然后需要注册一个数学类库: 另外在我们还需要找到 hash 函数和 伪随机数发生器函数的位置: RSA算法加密要用到公钥,所以我们要生一个公钥,要用到 rsa_make_key这个方法。但是在调用方法之前我们需要初始化一个数学库的一个宏定义,这个很重要,因为这个bug调了很长时间,我们首先要在main函数的上面,进行预定义:#define LTM_DESC 然后我们还要在 方法里面初始化一个 ltc_mp 变量,ltc_mp = ltm_desc; 但是这样编译项目会出现变量未定义的错误,所以我们还要在项目的属性的预编译器里面添加一个LTM_DESC变量:然后,我们就可以调用rsa_make_key生成一个 rsa_key:然后我们就可以使用rsa_encrypt_key_ex() 进行对明文加解密,我们可以看到这个函数的参数,包括了需要加密的明文pt,密文ct,随机数生成器的位置参数prng,数学库函数的位置参数hash_idx,填充方式padding,以及密钥 key : 那么同样我们对密文进行解密的时候,用到了rsa_decrypt_key_ex() 方法,参数同样包括了需要解密的密文ct,解密后的明文pt,数学库的位置参数hash_idx,填充方式padding,以及密钥 key,还有返回的参数 state ,表示解密数据是否成功。三、测试用例 我们需要选择一种加密机制,并且需要输入想要的加密的明文,在这里并没有做文件的读入,核心内容已经包括进来了:四、代码附录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(请选择加密机制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字节以下)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字节以下)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. 函数定义:int register_prng(const struct ltc_prng_descriptor *prng);44. 功能说明:注册一个伪随机数生成器45. 参数说明:const struct ltc_prng_descriptor *prng-一个prng结构体46. 返回值说明:返回值为-1表示注册一个prng失败,否则注册成功47. */48. if (register_prng(&sprng_desc) = -1)49. printf(Error registering sprng);50. return EXIT_FAILURE;51. 52.53. /*注册 一个数学类库*/54.55. /ltc_mp = ltm_desc;56.57. /*58. 函数定义:int register_hash(const struct ltc_hash_descriptor *hash);59. 功能说明:注册一个数学库60. 参数说明:const struct ltc_hash_descriptor *hash -一个hash结构体61. 返回值说明:返回值为-1表示注册一个数学库失败,否则注册成功62. */63. if (register_hash(&sha1_desc) = -1)64. printf(注册 数学库失败);65. return EXIT_FAILURE;66. 67.68. /*69. 函数定义:int find_hash(const char *name);70. 功能说明:在hash表里查找一个hash71. 参数说明:const char *name -要查找的hash的name72. 返回值说明:返回值为-1表示查找失败;否则返回该hash在hash表里的位置73. */74. hash_idx = find_hash(sha1);75.76. /*77. 函数定义:int find_prng(const char *name);78. 功能说明:在prng表里查找一个prng79. 参数说明:const char *name -要查找的prng的name80. 返回值说明:返回值为-1表示查找失败;否则返回该prng在prng表里的位置81. */82. prng_idx = find_prng(sprng);83.84. /*make an RSA-1024 key*/85.86. /*87. 函数定义:int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);88. 功能说明:生成一个1024bit的RSA密钥89. 参数说明:prng_state *prng-prng状态90. int wprng-prng标志91. int size-密钥长度92. long 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 != CRYPT_OK) 104. printf(rsa_make_key %s, error_to_string(error);105. return EXIT_FAILURE;106. 107.108. /RSA 加解密流程109. 110. /加密111. /*112. 函数定义: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加密过程,对输入的明文进行加密116. 参数说明:const unsigned char *in -要加密的明文117. unsigned long inlen -明文长度118. unsigned char *out -存放加密后的密文119. unsigned long *outlen -密文长度120. const unsigned char *lparam - lparam参数121. unsigned long l paramlen-lparam长度122. prng_state *prng- prng状态123. int prng_idx-prng标志124. int hash_idx-hash标志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进制):n);148. for (int i = 0; i = 127; i+)149. 150. printf(%02x, outi);151. 152. printf(n);153.154. /解密155. /*156. 函数定义: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解密过程,对密文进行解密160. 参数说明:const unsigned char *in -要解密的密文161. unsigned long inlen -密文长度162. unsigned char *out -存放解密后的明文163. unsigned long *outlen -明文长度164. const unsigned char *lparam - lparam参数165. unsigned long l paramlen-lparam长度166. int hash_idx-hash标志167. int padding-填充方式168. int *stat-解密后的数据正确与否169. rsa_key
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026计量器具软件标识
- 樊媛媛c语言程序设计11-结构体
- 2026年初级审计师考试真题题库及答案
- 生活排水系统施工方案
- 消防工程维护保养规程
- 【完整版】七牌二图布置方案
- 公务员行政职业能力测验题库附答案
- 2026年食品安全风险监测考核题库及答案
- 救灾物资仓库及设施设备清洗消毒和维修保养制度
- 2026年广西壮族自治区崇左市网格员招聘考试备考题库及答案解析
- 中国邮政2026年南京市秋招信息技术类岗位面试模拟题及答案
- 2026云南省高校毕业生“三支一扶”计划招募463人备考题库及答案详解1套
- 2026中国光伏运维市场趋势前景预判与投融资发展状况监测报告
- 2025海南水发旗下海南水务招聘12人笔试历年参考题库附带答案详解
- 语文-辽宁省丹东市2026届高三年级教学质量监测(丹东一模)
- 2026陕西建工第八建设集团有限公司财务部融资管理岗招聘1人考试备考试题及答案解析
- X射线反射基本原理及特点
- (2025年)初级会计真题试卷和答案合集
- 学校各班级防溺水联防小组统计表(空表)
- 2026小学信息技术课程标准测试题及答案
- 2026浙江首考英语试卷及答案解析
评论
0/150
提交评论