Openssl的编译安装以及Vs2012上环境搭建教程
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回车
- d:
- cd Perl\eg
- example.pl
注意:在控制台上显示Hello from ActivePerl! 表示安装成功。
3、打开dos控制台,cmd回车,然后目录切换到openssl的解压目录下
- d:
- cd openssl\openssl-1.0.1u
4、配置并指定openssl将要安装的目录(prefix:用于指定安装目录,我是放在D:\openssl\openssl-1.0.1下的;no-asm:不汇编)
- perl Configure VC-WIN32 no-asm --prefix=d:\openssl\openssl-1.0.1
控制台上出现 configured for WIN-32表示成功。
5、创建makefile文件(此操作扔在刚才目录下进行)
- ms\do_ms
6、VC环境变量设置,此操作在dos控制台下,即运行vcvars32.bat(vcvars32.bat位于你的Vs2012安装目录所在的bin文件夹下面,注意:没有这一步后面将会无法进行,我的VS2012放在D盘下的,根据自己的安装目录找到Vcvars32.bat位置),
- d:
- cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
- vcvars32.bat
7、对openssl进行编译,此步骤花费时间较长。(此操作在openssl解压目录下进行)
- d:
- cd openssl\openssl-1.0.1u
- nmake -f ms\ntdll.mak
控制台上出现 正在创建库 tmp32dll\junk.lib和对象tmp32dll\junk.exp字样表示成功。
8、检查上一步是否编译成功(此操作扔在上一个目录下操作)
- nmake -f ms\ntdll.mak test
控制台出现 passed all test 字样表示成功。
9、将编译好的openssl安装到之前指定的路径下(此操作扔在上一步的目录下进行)
- 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)、引入包含目录
- VC++目录----包含目录----编辑引入你的openssl安装目录下的include文件夹
(2)、引入库目录
- VC++目录----库目录-----引入你的openssl安装目录下的lib文件夹
(3)、引入连接器附加项
- 链接器---输入---附加依赖项----加入libeay32.lib和ssleay32.lib(这两个库就在你安装的openssl下的lib文件夹下)
3、此时,所有openssl配置已经完成,快去体验例子吧。
二、举例(使用openssl中aes算法ecb模式(128或256)加密解密文件)
1、新建一个源程序,不妨取名为test.cpp
2、在桌面新建一个1.txt文件,在里面随便写点文字,用于下面加密使用
2、将下面的源代码粘贴进来,然后编译运行即可,点开桌面看看是否多了两个文件夹,尝试着双击打开看看。
该示例的源代码如下:
- #include <openssl/evp.h>
- #include <stdio.h>
- #define N 1024
- #define IN
- //Aes算法ecb模式加密文件
- /**********************************************************************
- 函数名称:AesEncryptFile
- 函数功能:加密文件
- 处理过程:
- 1.根据选择的密码算法以及口令,生成key和iv。
- 2.把文件头写入密文文件
- 3.循环读取原文文件数据加密后保存到密文文件路径中。
- 参数说明:
- szSrc:[IN] char *,待加密的原文文件路径
- szTarget:[IN] char *,加密后的密文文件保存路径
- key:[IN] unsigned char *, 口令
- iType:[IN] int, 加密类型(128或256)
- 返回值:成功返回1,否则返回0
- ************************************************************************/
- int AesEncryptFile ( IN char * szSrc,
- IN char * szTarget ,
- IN unsigned char * key,
- IN int iType)
- {
- unsigned char ukey[EVP_MAX_KEY_LENGTH];
- unsigned char iv[EVP_MAX_IV_LENGTH];
- unsigned char in[N];
- int inl; //输入数据大小
- unsigned char out[N];
- int outl; //输出数据大小
- int isSuccess;
- FILE *fpIn;
- FILE *fpOut;
- EVP_CIPHER_CTX ctx; //evp加密上下文环境
- const EVP_CIPHER *cipher;
- fpIn = fopen(szSrc,"rb");
- if(fpIn==NULL)
- {
- printf("fopen szSrc failed");
- return 0;
- }
- fpOut = fopen(szTarget,"w+");
- if(fpOut==NULL)
- {
- printf("fopen szTarget failed");
- fclose(fpIn);
- return 0;
- }
- //选择算法
- if(iType == 128)
- {
- cipher = EVP_aes_128_ecb();
- }
- else if(iType == 256)
- {
- cipher = EVP_aes_256_ecb();
- }
- else
- {
- printf("iType should be 128 or 256.");
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- //生成ukey和iv
- int len = sizeof(key);
- EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)key,len-1,1,ukey,iv);
- //初始化ctx,加密算法初始化
- EVP_CIPHER_CTX_init(&ctx);
- isSuccess = EVP_EncryptInit_ex(&ctx,cipher,NULL,ukey,iv);
- if(!isSuccess)
- {
- printf("EVP_EncryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- //加密文件
- for(;;)
- {
- inl = fread(in,1,N,fpIn);
- if(inl<=0)
- break;
- isSuccess = EVP_EncryptUpdate(&ctx,out,&outl,in,inl);
- if(!isSuccess)
- {
- printf("EVP_EncryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- fwrite(out,1,outl,fpOut);
- }
- isSuccess = EVP_EncryptFinal_ex(&ctx,out,&outl);
- if(!isSuccess)
- {
- printf("EVP_EncryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- fwrite(out,1,outl,fpOut);
- printf("加密成功\n");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 1;
- }
- //Aes算法ecb模式解密文件
- /**********************************************************************
- 函数名称:AesDecryptFile
- 函数功能:解密文件
- 处理过程:
- 1.根据选择的密码算法以及口令,生成key和iv。
- 2.把文件头写入密文文件
- 3.循环读取原文文件数据加密后保存到密文文件路径中。
- 参数说明:
- szSrc:[IN] char *,待解密的密文文件路径
- szTarget:[IN] char *,解密后的解密文件保存路径
- key:[IN] unsigned char *, 口令
- iType:[IN] int, 加密类型(128或256)
- 返回值:成功返回1,否则返回0
- ************************************************************************/
- int AesDecryptFile ( IN char * szSrc,
- IN char * szTarget ,
- IN unsigned char * key,
- IN int iType)
- {
- unsigned char ukey[EVP_MAX_KEY_LENGTH];
- unsigned char iv[EVP_MAX_IV_LENGTH];
- unsigned char in[N];
- int inl; //输入数据大小
- unsigned char out[N];
- int outl; //输出数据大小
- int isSuccess;
- FILE *fpIn;
- FILE *fpOut;
- EVP_CIPHER_CTX ctx; //evp加密上下文环境
- const EVP_CIPHER *cipher;
- fpIn = fopen(szSrc,"rb");
- if(fpIn==NULL)
- {
- printf("fopen szSrc failed");
- return 0;
- }
- fpOut = fopen(szTarget,"w+");
- if(fpOut==NULL)
- {
- printf("fopen szTarget failed");
- fclose(fpIn);
- return 0;
- }
- //选择算法
- if(iType == 128)
- {
- cipher = EVP_aes_128_ecb();
- }
- else if(iType == 256)
- {
- cipher = EVP_aes_256_ecb();
- }
- else
- {
- printf("iType should be 128 or 256.");
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- //生成ukey和iv
- int len = sizeof(key);
- EVP_BytesToKey(cipher,EVP_md5(),NULL,(const unsigned char *)key,len-1,1,ukey,iv);
- //初始化ctx,加密算法初始化
- EVP_CIPHER_CTX_init(&ctx);
- isSuccess = EVP_DecryptInit_ex(&ctx,cipher,NULL,ukey,iv);
- if(!isSuccess)
- {
- printf("EVP_DecryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- //加密文件
- for(;;)
- {
- inl = fread(in,1,N,fpIn);
- if(inl<=0)
- break;
- isSuccess = EVP_DecryptUpdate(&ctx,out,&outl,in,inl);
- if(!isSuccess)
- {
- printf("EVP_EncryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- fwrite(out,1,outl,fpOut);
- }
- isSuccess = EVP_DecryptFinal_ex(&ctx,out,&outl);
- if(!isSuccess)
- {
- printf("EVP_DecryptInit_ex() failed");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 0;
- }
- fwrite(out,1,outl,fpOut);
- printf("解密成功\n");
- EVP_CIPHER_CTX_cleanup(&ctx);
- fclose(fpIn);
- fclose(fpOut);
- return 1;
- }
- int main()
- {
- char *Src = "C:\\Users\\wolf\\Desktop\\1.txt";
- char *TargetEnc = "C:\\Users\\wolf\\Desktop\\1.txt.enc";
- char *TargetDec = "C:\\Users\\wolf\\Desktop\\1.txt.dec";
- unsigned char key[32] = "abcdefg";
- int rv = AesEncryptFile(Src,TargetEnc,key,128);
- if(rv!=1)
- {
- printf("AesEncryptFile() failed");
- return 1;
- }
- rv = AesDecryptFile(TargetEnc,TargetDec,key,128);
- if(rv!=1)
- {
- printf("AesDecryptFile() failed");
- return 1;
- }
- return 0;
- }
运行结果截图:
Openssl的编译安装以及Vs2012上环境搭建教程的更多相关文章
- workerman使用编译安装workerman的php环境
提示 workerman只是一个代码包,如果php环境满足要求,下载后即可使用,实际上没有安装过程. workerman对php环境的要求是: 1.php>=5.3.3,可以运行命令php-v查 ...
- 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装
系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...
- Win8.1+vs2012+osg环境搭建
Win8.1+vs2012+osg环境搭建 一. 相关准备 a) Osg源码 当前最新版:OpenSceneGraph-3.2.0.zip 下载链接: http://www.opensceneg ...
- Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器
前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...
- 编译安装Apache httpd和php搭建KodExplorer网盘
编译安装Apache httpd和php搭建KodExplorer网盘 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 httpd-2.2.31 php- ...
- appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠
前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appiu ...
- 【微信小程序】---线上环境搭建
一.前言 通常我们在本地电脑上开发微信小程序,调用和访问小程序会有很多问题.特别是在配有自己后端的情况下,我们通过真机访问我们的小程序会出现不可访问的问题 二.线上环境搭建 在这里我们主要以腾讯云给大 ...
- wechat开发笔记之1.线上环境搭建与测试
Wechat开发笔记 线上环境搭建: 申请一个wechat公众平台. 手机个人微信可以用webwechat来测试. Website:https://web.weixin.qq.com/ 手机客户端扫一 ...
- LAMP环境搭建教程
原文:LAMP环境搭建教程 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.M ...
随机推荐
- Redis主从复制(Master/Slave) 与哨兵模式
Redis主从复制是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 Redis主从复制 ...
- 「LeetCode」0952-Largest Component Size by Common Factor(Go)
分析 注意到要求的是最大的连通分量,那么我们可以先打素数表(唯一分解定理),然后对每个要求的数,将他们同分解出的质因子相连(维护一个并查集),然后求出最大的联通分量即可. 这里使用了筛法求素数.初始化 ...
- 十几行代码带你用Python批量实现txt转xls,方便快捷
前天看到后台有一兄弟发消息说目前自己有很多txt 文件,领导要转成xls文件,问用python怎么实现,我在后台简单回复了下,其实完成这个需求方法有很多,因为具体的txt格式不清楚,当然如果是有明确分 ...
- 设计模式C++实现
准备写一系列笔记用来记录学习设计模式的过程,同时写出自己对几种主要的设计模式的理解,以及编码实现,同时总结. 主要参考书籍就是 <Head First Design Patterns>这本 ...
- openstack系列文章(三)
学习openstack的系列文章-glance glance 基本概念 glance 架构 openstack CLI Troubleshooting 1. glance 基本概念 在 opensta ...
- 学习使用Git 版本控制 代码管理
title: 学习使用Git 版本控制 代码管理 notebook: 经验累积 tags:Git --- Git 版本控制 学习教程 Git版本控制器,可以作为程序员.计算机科学和软件工程的研究人员在 ...
- lambda(匿名函数)---基于python
在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...
- Planning The Expedition(暴力枚举+map迭代器)
Description Natasha is planning an expedition to Mars for nn people. One of the important tasks is t ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- VUE AXIOS 跨域问题
背景: 后台跨域使用通配符:context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); ...