Openssl的编译安装以及Vs2012上环境搭建教程
来源:互联网 发布:淘宝上怎么买av的资源 编辑:程序博客网 时间:2024/06/05 12:47
一、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\egexample.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_ms6、VC环境变量设置,此操作在dos控制台下,即运行vcvars32.bat(vcvars32.bat位于你的Vs2012安装目录所在的bin文件夹下面,注意:没有这一步后面将会无法进行,我的VS2012放在D盘下的,根据自己的安装目录找到Vcvars32.bat位置),
d:cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\binvcvars32.bat
7、对openssl进行编译,此步骤花费时间较长。(此操作在openssl解压目录下进行)
d:cd openssl\openssl-1.0.1unmake -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加密上下文环境constEVP_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和ivint 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和ivint 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上环境搭建教程
- Win10环境下Openssl的编译安装以及在vs2013上开发环境的搭建
- 在vs2012的编译环境下使用openssl
- VS2012上CUDA环境搭建
- cygwin的安装使用以及交叉编译环境的搭建
- [DuiLib教程1]VS2012+CMAKE+WIN10+Duilid环境的搭建
- 【openssl】openssl安装以及编译使用
- Irrlicht1.7.1在VS2012上的环境搭建
- VS2012 v110_xp 编译openssl
- VS2012+Qt5.2交叉编译环境搭建
- VS2012+Qt5.2交叉编译环境搭建
- VS2012+Qt5.2交叉编译环境搭建
- 安装配置cuda6.5以及vs2012的环境
- osx的openssl的安装以及xcode连接编译
- openssl简介以及源码移植的交叉编译和安装
- raspberry 3b 64bit 系统安装,以及交叉编译环境、调试环境的搭建
- 关于 编译安装的lamp环境 php开启openssl 功能
- Mac上安装 Ruby运行环境以及CocoaPods的安装使用教程
- 基于qualcomm平台的kinect应用系列一之Turtlebot(自动跟随机器人)下篇
- filename and pathname
- java synchronized详解
- Gulp.js入门小教程
- YII2框架查询源码解析
- Openssl的编译安装以及Vs2012上环境搭建教程
- 算法导论第一节学习笔记
- 程序背后那些事
- Intellij IDEA集成tortoiseSVN问题解决
- 关于函数实参和形参的地址传送
- 1035 最长的循环节
- Html编码(&#数字型)解码
- 信号
- [Linux]在终端启动程序关闭终端不退出的方法