64位 Win10下 使用vs2017 和 openssl-1.1.1库
0 前提:
之前一直是在linux下调用openssl命令行或者库函数,今天突发感觉,有必要在windows里边也试试,毕竟vs用起来还是比较舒服。
1 openssl 安装编译步骤
参考了网上各路大神的步骤,自己记录一下:
- 下载安装perl (用于win环境下调用脚本的工具)
(注意,要是想编译64位的最好perl也下载64位的);默认一顿安装即可,下载地址:www.ActiverState.com 我用的版本如下,设置完环境变量后可以查看版本;
- 配置perl的环境变量如下:(环境变量生效需重启)
C:\Perl64\bin (命令行生效perl命令)
C:\Perl64\site\bin (命令行生效dmake命令,configure里边貌似是调用到了); - 安装vs2017,这个就不用说了,官网下载,注册账号学生试用就可以了;
- 下载openssl,地址: https://www.openssl.org/ 我下载的1.1.1版本,可以看后边的命令行输出;
- 解压openssl至C盘,我放在了根目录,打开openssl里边的install,看到说明如下:
- 在程序里边找到vs的命令行工具,如“适用于vs2017的x64本机工具命令提示”,注意右键选择“管理员权限运行”,进入到openssl的目录,依次运行install中的步骤
a perl Configure VC-WIN64A (打算用asm,需要安装nasm)
或者
a perl Configure VC-WIN64A no-asm (不用asm)
b nmake
c nmake test
d nmake install - Openssl的环境变量 (环境变量生效需重启)
C:\openssl-1.1.1\bin (命令行生效openssl命令; - 至此,命令行里边应该已经可以使用openssl命令了, 看一下版本;
2 vs2017使用openssl库
- 经过之前步骤的安装,应该在C:\Program Files\OpenSSL下生成了库文件,如图
- 新建一个vs2017的工程,可以选择windows控制台应用程序;
- 在工程属性页面,vc++目录,包含目录增加C:\Program Files\OpenSSL\include 库文件目录增加 C:\Program Files\OpenSSL\lib c/c++目录,附件包含目录增加C:\Program Files\OpenSSL\include 连接器页面输入,添加libcrypto.lib libssl.lib;
- 然后理论应该就可以用了,不过我遇到提示evp_cipher_ctx_st 不完整,我的理解这个在evp.h中有定义,然后引用crypto的lib,具体的定义在lib里边,但是始终不得其法,后来实在没办法,我把openssl源码里边的crypto也加到的include的路径里边,然后引用<evp/evp_locl.h>才通过编译。 这点没想明白,linux里边就不需要这个h文件,在生成执行文件时引用-lcrypto或者libcrypto.so即可,不知道vs2017这是什么情况。
3 附一段测试代码
// openssl_win.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <evp/evp_locl.h>
#include <string.h>
#define AES_TEST_ENCRYPT_SIZE 1024*4
#define AES128_GCM_TAG_SIZE 16
#define AES128_GCM
typedef enum {
encrypt_t,
decrypt_t
}encrypt_or_decrypt_t;
#if defined(AES128_GCM)||defined(AES256_GCM)
//aes_gcm_data
uint8_t aes128_gcm_key[] = {
0x98, 0xff, 0xf6, 0x7e, 0x64, 0xe4, 0x6b, 0xe5,0xee, 0x2e, 0x05, 0xcc, 0x9a, 0xf6, 0xd0, 0x12 };
uint8_t aes256_gcm_key[] = {
0x60,0x3D,0xEB,0x10,0x15,0xCA,0x71,0xBE,0x2B,0x73,0xAE,0xF0,0x85,0x7D,0x77,0x81,0x1F,0x35,0x2C,0x07,0x3B,0x61,0x08,0xD7,0x2D,0x98,0x10,0xA3,0x09,0x14,0xDF,0xF4
};
uint8_t aes128_gcm_data[] = {
0x29,0xb9,0x1b,0x4a