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