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

原文链接:https://blog.csdn.net/gpltoken/article/details/53011068

一、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回车

[cpp]  view plain  copy
  1. d:  
  2. cd Perl\eg  
  3. example.pl  
注意 :在控制台上显示Hello from ActivePerl! 表示安装成功。

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

[cpp]  view plain  copy
  1. d:  
  2. cd openssl\openssl-1.0.1u  

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

[cpp]  view plain  copy
  1. perl Configure VC-WIN32 no-asm --prefix=d:\openssl\openssl-1.0.1  
控制台上出现 configured for WIN-32表示成功。

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

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

[html]  view plain  copy
  1. d:  
  2. cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin  
  3. vcvars32.bat  

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

[cpp]  view plain  copy
  1. d:  
  2. cd openssl\openssl-1.0.1u  
  3. nmake -f ms\ntdll.mak  

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

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

[cpp]  view plain  copy
  1. nmake -f ms\ntdll.mak test  
控制台出现 passed all test 字样表示成功。

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

[cpp]  view plain  copy
  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、配置

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

[html]  view plain  copy
  1. 工程---右键---属性  

(1)、引入包含目录

[html]  view plain  copy
  1. VC++目录----包含目录----编辑引入你的openssl安装目录下的include文件夹  

(2)、引入库目录

[html]  view plain  copy
  1. VC++目录----库目录-----引入你的openssl安装目录下的lib文件夹  

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

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


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

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

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


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

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

该示例的源代码如下:

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

运行结果截图:

   本文作者(公沛良)

猜你喜欢

转载自blog.csdn.net/shellching/article/details/80635610
今日推荐