Openssl的编译安装以及Vs2012上环境搭建教程

一、Openssl的编译安装

一、准备工作

1、Openssl下载地址:https://www.openssl.org/source/

2、ActivePerl下载地址:http://www.activestate.com/activeperl/downloads

3、Vs2012下载并安装,此处不再多说。

4、说明:●此处我选用的openssl的版本是Openssl-1.0.1u;

●此处我选用的ActivePerl的版本是ActivePerl 5.24.0 for windows (64bit  ,x64);perl语言,在此处只是用于配置。

●本机使用的是Window8系统;

●无特别说明,命令都在windows dos控制台上进行,即CTRL+R,cmd,回车。

二、具体操作步骤

1、解压下载的openssl-1.0.1u,并指定解压目录(我是在电脑D盘下面,新建了一个文件夹Openssl,,然后解压到这个地方了)

2、安装activeperl,我是在电脑D盘下新建了文件夹Perl,然后安装在此目录下的(安装完成后,通过下面方式检测是否安装成功),打开dos控制台,cmd回车

  1. d:
  2. cd Perl\eg
  3. example.pl

注意:在控制台上显示Hello from ActivePerl! 表示安装成功。

3、打开dos控制台,cmd回车,然后目录切换到openssl的解压目录下

  1. d:
  2. cd openssl\openssl-1.0.1u

4、配置并指定openssl将要安装的目录(prefix:用于指定安装目录,我是放在D:\openssl\openssl-1.0.1下的;no-asm:不汇编)

  1. perl Configure VC-WIN32 no-asm --prefix=d:\openssl\openssl-1.0.1

控制台上出现 configured for WIN-32表示成功。

5、创建makefile文件(此操作扔在刚才目录下进行)

  1. ms\do_ms

6、VC环境变量设置,此操作在dos控制台下,即运行vcvars32.bat(vcvars32.bat位于你的Vs2012安装目录所在的bin文件夹下面,注意:没有这一步后面将会无法进行,我的VS2012放在D盘下的,根据自己的安装目录找到Vcvars32.bat位置),

  1. d:
  2. cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
  3. vcvars32.bat

7、对openssl进行编译,此步骤花费时间较长。(此操作在openssl解压目录下进行)

  1. d:
  2. cd openssl\openssl-1.0.1u
  3. nmake -f ms\ntdll.mak

控制台上出现 正在创建库 tmp32dll\junk.lib和对象tmp32dll\junk.exp字样表示成功。

8、检查上一步是否编译成功(此操作扔在上一个目录下操作)

  1. nmake -f ms\ntdll.mak test

控制台出现 passed all test 字样表示成功。

9、将编译好的openssl安装到之前指定的路径下(此操作扔在上一步的目录下进行)

  1. nmake -f ms\ntdll.mak install

完成后,在电脑上打开之前指定的安装目录查看是否多了四个文件(bin,include,lib,ssl).我的是安装在D:\openssl\openssl-1.0.1下的

10、至此,openssl编译与安装工作到此完成。

三、总结与说明

■ 可以在编译和安装前将各项准备工作都弄好,比如现在D:盘下新建两个文件夹用来存放openssl和Perl;

■ 注意每一步的操作流程,小心谨慎,争取一次性操作成功。

■ 由于此文是在我所有的都弄好之后又发的文章,因此安装过程中忘记截图了,不过描述比较详细,应该可以看懂。看不懂的地方再多交流吧。

二、在VS2012上使用openssl的环境搭建

一、在VS2012上配置和引入openssl

1、打开VS2012,新建一个c++工程,由于比较基础,此处不再缀余(就是和建普通的c++工程一样),如图

2、配置

(下面的这几个配置都在工程---右键----属性里面进行)

  1. 工程---右键---属性

(1)、引入包含目录

  1. VC++目录----包含目录----编辑引入你的openssl安装目录下的include文件夹

(2)、引入库目录

  1. VC++目录----库目录-----引入你的openssl安装目录下的lib文件夹

(3)、引入连接器附加项

  1. 链接器---输入---附加依赖项----加入libeay32.lib和ssleay32.lib(这两个库就在你安装的openssl下的lib文件夹下)

3、此时,所有openssl配置已经完成,快去体验例子吧。

二、举例(使用openssl中aes算法ecb模式(128或256)加密解密文件)

1、新建一个源程序,不妨取名为test.cpp

2、在桌面新建一个1.txt文件,在里面随便写点文字,用于下面加密使用

2、将下面的源代码粘贴进来,然后编译运行即可,点开桌面看看是否多了两个文件夹,尝试着双击打开看看。

该示例的源代码如下:

  1. #include <openssl/evp.h>
  2. #include <stdio.h>
  3. #define N 1024
  4. #define IN
  5. //Aes算法ecb模式加密文件
  6. /**********************************************************************
  7. 函数名称:AesEncryptFile
  8. 函数功能:加密文件
  9. 处理过程:
  10. 1.根据选择的密码算法以及口令,生成key和iv。
  11. 2.把文件头写入密文文件
  12. 3.循环读取原文文件数据加密后保存到密文文件路径中。
  13. 参数说明:
  14. szSrc:[IN] char *,待加密的原文文件路径
  15. szTarget:[IN] char *,加密后的密文文件保存路径
  16. key:[IN] unsigned char *, 口令
  17. iType:[IN] int, 加密类型(128或256)
  18. 返回值:成功返回1,否则返回0
  19. ************************************************************************/
  20. int AesEncryptFile ( IN char * szSrc,
  21. IN char * szTarget ,
  22. IN unsigned char * key,
  23. IN int iType)
  24. {
  25. unsigned char ukey[EVP_MAX_KEY_LENGTH];
  26. unsigned char iv[EVP_MAX_IV_LENGTH];
  27. unsigned char in[N];
  28. int inl;   //输入数据大小
  29. unsigned char out[N];
  30. int outl;   //输出数据大小
  31. int isSuccess;
  32. FILE *fpIn;
  33. FILE *fpOut;
  34. EVP_CIPHER_CTX ctx;   //evp加密上下文环境
  35. const   EVP_CIPHER *cipher;
  36. fpIn = fopen(szSrc,"rb");
  37. if(fpIn==NULL)
  38. {
  39. printf("fopen szSrc failed");
  40. return 0;
  41. }
  42. fpOut = fopen(szTarget,"w+");
  43. if(fpOut==NULL)
  44. {
  45. printf("fopen szTarget failed");
  46. fclose(fpIn);
  47. return 0;
  48. }
  49. //选择算法
  50. if(iType == 128)
  51. {
  52. cipher = EVP_aes_128_ecb();
  53. }
  54. else if(iType == 256)
  55. {
  56. cipher = EVP_aes_256_ecb();
  57. }
  58. else
  59. {
  60. printf("iType should be 128 or 256.");
  61. fclose(fpIn);
  62. fclose(fpOut);
  63. return 0;
  64. }
  65. //生成ukey和iv
  66. int len = sizeof(key);
  67. EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)key,len-1,1,ukey,iv);
  68. //初始化ctx,加密算法初始化
  69. EVP_CIPHER_CTX_init(&ctx);
  70. isSuccess = EVP_EncryptInit_ex(&ctx,cipher,NULL,ukey,iv);
  71. if(!isSuccess)
  72. {
  73. printf("EVP_EncryptInit_ex() failed");
  74. EVP_CIPHER_CTX_cleanup(&ctx);
  75. fclose(fpIn);
  76. fclose(fpOut);
  77. return 0;
  78. }
  79. //加密文件
  80. for(;;)
  81. {
  82. inl = fread(in,1,N,fpIn);
  83. if(inl<=0)
  84. break;
  85. isSuccess = EVP_EncryptUpdate(&ctx,out,&outl,in,inl);
  86. if(!isSuccess)
  87. {
  88. printf("EVP_EncryptInit_ex() failed");
  89. EVP_CIPHER_CTX_cleanup(&ctx);
  90. fclose(fpIn);
  91. fclose(fpOut);
  92. return 0;
  93. }
  94. fwrite(out,1,outl,fpOut);
  95. }
  96. isSuccess = EVP_EncryptFinal_ex(&ctx,out,&outl);
  97. if(!isSuccess)
  98. {
  99. printf("EVP_EncryptInit_ex() failed");
  100. EVP_CIPHER_CTX_cleanup(&ctx);
  101. fclose(fpIn);
  102. fclose(fpOut);
  103. return 0;
  104. }
  105. fwrite(out,1,outl,fpOut);
  106. printf("加密成功\n");
  107. EVP_CIPHER_CTX_cleanup(&ctx);
  108. fclose(fpIn);
  109. fclose(fpOut);
  110. return 1;
  111. }
  112. //Aes算法ecb模式解密文件
  113. /**********************************************************************
  114. 函数名称:AesDecryptFile
  115. 函数功能:解密文件
  116. 处理过程:
  117. 1.根据选择的密码算法以及口令,生成key和iv。
  118. 2.把文件头写入密文文件
  119. 3.循环读取原文文件数据加密后保存到密文文件路径中。
  120. 参数说明:
  121. szSrc:[IN] char *,待解密的密文文件路径
  122. szTarget:[IN] char *,解密后的解密文件保存路径
  123. key:[IN] unsigned char *, 口令
  124. iType:[IN] int, 加密类型(128或256)
  125. 返回值:成功返回1,否则返回0
  126. ************************************************************************/
  127. int AesDecryptFile ( IN char * szSrc,
  128. IN char * szTarget ,
  129. IN unsigned char * key,
  130. IN int iType)
  131. {
  132. unsigned char ukey[EVP_MAX_KEY_LENGTH];
  133. unsigned char iv[EVP_MAX_IV_LENGTH];
  134. unsigned char in[N];
  135. int inl;   //输入数据大小
  136. unsigned char out[N];
  137. int outl;   //输出数据大小
  138. int isSuccess;
  139. FILE *fpIn;
  140. FILE *fpOut;
  141. EVP_CIPHER_CTX ctx;   //evp加密上下文环境
  142. const EVP_CIPHER *cipher;
  143. fpIn = fopen(szSrc,"rb");
  144. if(fpIn==NULL)
  145. {
  146. printf("fopen szSrc failed");
  147. return 0;
  148. }
  149. fpOut = fopen(szTarget,"w+");
  150. if(fpOut==NULL)
  151. {
  152. printf("fopen szTarget failed");
  153. fclose(fpIn);
  154. return 0;
  155. }
  156. //选择算法
  157. if(iType == 128)
  158. {
  159. cipher = EVP_aes_128_ecb();
  160. }
  161. else if(iType == 256)
  162. {
  163. cipher = EVP_aes_256_ecb();
  164. }
  165. else
  166. {
  167. printf("iType should be 128 or 256.");
  168. fclose(fpIn);
  169. fclose(fpOut);
  170. return 0;
  171. }
  172. //生成ukey和iv
  173. int len = sizeof(key);
  174. EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)key,len-1,1,ukey,iv);
  175. //初始化ctx,加密算法初始化
  176. EVP_CIPHER_CTX_init(&ctx);
  177. isSuccess = EVP_DecryptInit_ex(&ctx,cipher,NULL,ukey,iv);
  178. if(!isSuccess)
  179. {
  180. printf("EVP_DecryptInit_ex() failed");
  181. EVP_CIPHER_CTX_cleanup(&ctx);
  182. fclose(fpIn);
  183. fclose(fpOut);
  184. return 0;
  185. }
  186. //加密文件
  187. for(;;)
  188. {
  189. inl = fread(in,1,N,fpIn);
  190. if(inl<=0)
  191. break;
  192. isSuccess = EVP_DecryptUpdate(&ctx,out,&outl,in,inl);
  193. if(!isSuccess)
  194. {
  195. printf("EVP_EncryptInit_ex() failed");
  196. EVP_CIPHER_CTX_cleanup(&ctx);
  197. fclose(fpIn);
  198. fclose(fpOut);
  199. return 0;
  200. }
  201. fwrite(out,1,outl,fpOut);
  202. }
  203. isSuccess = EVP_DecryptFinal_ex(&ctx,out,&outl);
  204. if(!isSuccess)
  205. {
  206. printf("EVP_DecryptInit_ex() failed");
  207. EVP_CIPHER_CTX_cleanup(&ctx);
  208. fclose(fpIn);
  209. fclose(fpOut);
  210. return 0;
  211. }
  212. fwrite(out,1,outl,fpOut);
  213. printf("解密成功\n");
  214. EVP_CIPHER_CTX_cleanup(&ctx);
  215. fclose(fpIn);
  216. fclose(fpOut);
  217. return 1;
  218. }
  219. int main()
  220. {
  221. char *Src = "C:\\Users\\wolf\\Desktop\\1.txt";
  222. char *TargetEnc = "C:\\Users\\wolf\\Desktop\\1.txt.enc";
  223. char *TargetDec = "C:\\Users\\wolf\\Desktop\\1.txt.dec";
  224. unsigned char key[32] = "abcdefg";
  225. int rv = AesEncryptFile(Src,TargetEnc,key,128);
  226. if(rv!=1)
  227. {
  228. printf("AesEncryptFile() failed");
  229. return 1;
  230. }
  231. rv = AesDecryptFile(TargetEnc,TargetDec,key,128);
  232. if(rv!=1)
  233. {
  234. printf("AesDecryptFile() failed");
  235. return 1;
  236. }
  237. return 0;
  238. }

运行结果截图:

Openssl的编译安装以及Vs2012上环境搭建教程的更多相关文章

  1. workerman使用编译安装workerman的php环境

    提示 workerman只是一个代码包,如果php环境满足要求,下载后即可使用,实际上没有安装过程. workerman对php环境的要求是: 1.php>=5.3.3,可以运行命令php-v查 ...

  2. 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装

    系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...

  3. Win8.1+vs2012+osg环境搭建

    Win8.1+vs2012+osg环境搭建 一.    相关准备 a) Osg源码 当前最新版:OpenSceneGraph-3.2.0.zip 下载链接: http://www.opensceneg ...

  4. Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  5. 编译安装Apache httpd和php搭建KodExplorer网盘

    编译安装Apache httpd和php搭建KodExplorer网盘 环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    httpd-2.2.31        php- ...

  6. appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠

    前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...

  7. 【微信小程序】---线上环境搭建

    一.前言 通常我们在本地电脑上开发微信小程序,调用和访问小程序会有很多问题.特别是在配有自己后端的情况下,我们通过真机访问我们的小程序会出现不可访问的问题 二.线上环境搭建 在这里我们主要以腾讯云给大 ...

  8. wechat开发笔记之1.线上环境搭建与测试

    Wechat开发笔记 线上环境搭建: 申请一个wechat公众平台. 手机个人微信可以用webwechat来测试. Website:https://web.weixin.qq.com/ 手机客户端扫一 ...

  9. LAMP环境搭建教程

    原文:LAMP环境搭建教程 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.M ...

随机推荐

  1. 求助:springboot调用存储过程并使用了pagehelper分页时报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

    存储过程如下: dao层的sql Controller层调用: html页面 没有使用pagehelper分页之前,可以正常使用 使用了pagehelper之后就报错 ### Error queryi ...

  2. 非Contorller类使用@Service中的方法

    组件扫描这种的是指bean,跟service没关系 service只能在Controller类中使用,如果别的类想使用,必须使用下面这种方法 内容来源:https://blog.csdn.net/u0 ...

  3. idea 单元测试 mybatis spring-test 异常: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    因为在idea中必须在test下才能进行单元测试,所以进行单元测试时,ssm的项目会因为找不到resourece中的配置文件而报错 这里 org.apache.ibatis.binding.Bindi ...

  4. javaweb(七)——HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  5. android 签名相关

    查看keystorekeytool -list -v -keystore debug.keystoreapk签名不带别名 apksigner sign --ks debug.keystore test ...

  6. [CF1137]Museums Tour

    link \(\text{Description:}\) 一个国家有 \(n\) 个城市,\(m\) 条有向道路组成.在这个国家一个星期有 \(d\) 天,每个城市有一个博物馆. 有个旅行团在城市 \ ...

  7. C语言—单链表

    单链表操作:读取,插入和删除 #include "stdafx.h" #include <string.h> #include <stdio.h> #inc ...

  8. Action Required: Please provide your Tax Identity Information - Amazon Seller Tax Identity Collection

    Hello ***,   Your selling privileges have been suspended because we have not received required tax i ...

  9. KETTLE元数据表

    表名 说明 R_CLUSTER R_CLUSTER_SLAVE R_CONDITION R_DATABASE 数据库连接信息 R_DATABASE_ATTRIBUTE 数据库属性 R_DATABASE ...

  10. kafka可靠性

    文章转载自: http://blog.csdn.net/u013256816/article/details/71091774