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

各路方法有的失于更新,有的不够细致,权当记录一下自己鼓捣了一天半的心路历程,如有单纯开发需要的同学,在文末附了编译好的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吧,希望能帮到大家,帮到了就点个赞吧~

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值