windows下VS2019之openssl库1.1.1完整配置过程(可使用国密算法,附已编译好文件)

  • Post author:
  • Post category:其他


各路方法有的失于更新,有的不够细致,权当记录一下自己鼓捣了一天半的心路历程,如有单纯开发需要的同学,在文末附了编译好的include文件夹和lib库,可自取后VS-调试属性-VC++目录-包含目录填include文件夹位置,库目录填lib文件夹位置即可。

配置过程

1.下载源码

直接从github上

https://github.com/openssl/openssl/tree/OpenSSL_1_1_1-stable

上code-download zip即可,下下来解压到同名文件夹(此处注意最好找一下stable版本的branch,不然有些功能可能会不完备?)

2.下载perl


www.activestate.com/activeperl/downloads

下载windows版的,注册一下账号进入如下界面:

选perl然后recommended版本,拉到最下面点这个:

选 Install via.exe File-然后download installer,此处如果是Edge浏览器需要在设置-隐私里面关闭这个smartscreen才可以下载exe

下载exe后点开,按黑框框的流程走,可能要等一段时间别着急,装好state tool之后,win+r打开cmd复制他给的这段命令:

会下在默认你c盘的user\id文件夹下面,下好之后不用找他,直接cmd里试一下perl能不能使(这个地方我没添加环境变量,但是也直接有了):

3.编译源码

打开VS2019自带的工具:想要32位就选nature32 64就64(右键以管理员身份打开)

进入黑框框里之后,

1测试perl是否正常:perl -v

2cd到你解压的源码文件夹里面(有configure文件的那个)

3输入命令行:perl Configure VC-WIN32 no-asm –prefix=e:\openssfolder(这个路径最好别跟你解压路径一样)

等弹完信息,输入nmake,此处会一直狂跳信息且巨久,耐心等

等弹完信息,输入nmake install,此处会一直狂跳信息且巨久,耐心等

一切ok,看得到输出目录里有include和lib文件夹了

4.helloworld程序测试

首先安库三部曲:

1调试-项目属性-VC++目录-包含目录&库目录分别找刚编译的include文件夹和lib文件夹;

2写上头文件(不标红则正确)

3#pragma comment两个库

(4 如果运行起来报错没有对应dll,把解压之后文件夹里的两个dll(libcrypto一个,libssl一个)扔进helloworld测试项目Debug文件夹里即可,之前gmp库时报过此错误,但我没扔也没报错)

测试代码F5即可:

#include <iostream>
#include <openssl/evp.h>
#include <openssl/err.h>
#include<string.h>
#define GETCH() getchar()

#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"libssl.lib")

int main() {
	OpenSSL_add_all_algorithms();
	EVP_MD_CTX* mdctx;
	const EVP_MD* md;
	char mess1[] = "abc";
	printf("%d", sizeof(mess1));
	unsigned char md_value[EVP_MAX_MD_SIZE] = { 0 };
	int md_len, i;

	md = EVP_get_digestbyname("sm3");

	if (!md) {
		return -1;
	}

	mdctx = EVP_MD_CTX_new(); //分配、初始化并返回摘要上下文.
	EVP_DigestInit_ex(mdctx, md, NULL);  //设置摘要上下文ctx以使用ENGINE impl中的摘要类型. 
	EVP_DigestUpdate(mdctx, mess1, strlen(mess1)); //将d处的cnt字节数据散列到摘要上下文ctx中.
	EVP_DigestFinal_ex(mdctx, md_value, (unsigned int*)&md_len);//从ctx检索摘要值并将其存入md中. 
	EVP_MD_CTX_free(mdctx);

	printf("sm3 Digest is: \n");
	for (i = 0; i < md_len; i++) {
		printf("%02x", md_value[i]);
		if (i % 16 == 15) {
			//printf("\n");
		}
	}
	printf("\n");
	printf("\n按任意键继续...");
	GETCH();

	return 0;
}

有几点需要注意:字符串会自动带上’\0’,故在EVP_DigestUpdate时,第三个读取字符数参数要么char数组直接strlen,要么unsigned char数组用strlen-1,测试结果如下:

上面是程序输出,下面是用openssl的命令行程序测试,结果相同,可使用国密哈希!!

此处值得一提先前几条弯路:echo测试这个地方,echo是往标准输入里写,但是会自动添加一个\n,所以在linux里可以用

echo -n "abc" | openssl sm3

来解决,在windows里不能用-n选项,改为如下:

echo|set /p="abc"|openssl sm3

即可测试,sha256等常用也可通过在线网站去验证。

链接:https://pan.baidu.com/s/1YFLLqr75x5jOb9TJ9jmwjQ?pwd=sm3a

提取码:sm3a

编译结果👆

小结:为了国密心力憔悴了属于,本来想openssl+gmssl,听说openssl1.1.1版本及以后就支持国密了,结果也只是在evp里和命令行里支持,并不能单独的写国密,因为老想用单独的国密走了不少弯路,有时间还是上gmssl吧,希望能帮到大家,帮到了就点个赞吧~



版权声明:本文为shirui12原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。