• 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回车

    1. d:  
    2. cd Perleg  
    3. example.pl  

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

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

     
    1. d:  
    2. cd opensslopenssl-1.0.1u  


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

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

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

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

     
    1. msdo_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.0VCin  
    3. vcvars32.bat  


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

     
    1. d:  
    2. cd opensslopenssl-1.0.1u  
    3. nmake -f ms tdll.mak  


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

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

     
    1. nmake -f ms tdll.mak test  

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

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

     
    1. nmake -f ms tdll.mak install  

    完成后,在电脑上打开之前指定的安装目录查看是否多了四个文件(bin,include,lib,ssl).我的是安装在D:opensslopenssl-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.   
    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("加密成功 ");  
    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("解密成功 ");  
    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. }  


    运行结果截图:

  • 相关阅读:
    js json 与字符串 转换过程由于书写不统一规范引发的一个问题
    asp.net 运行时,"未能映射路径"
    android html 图片处理类--加载富文本工具类
    System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件
    “请运行Chkdsk工具”怎么解决
    android studio新项目时提示:Plugin is too old, please update to a more recent version
    mvvm和mvc区别?
    什么是mvvm?
    js去除html标签
    数组的翻转(非reverse)
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7840935.html
Copyright © 2020-2023  润新知