iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C++中OpenSSL动态链接库的使用
  • 175
分享到

详解C++中OpenSSL动态链接库的使用

2024-04-02 19:04:59 175人浏览 安东尼
摘要

在上一篇文章 OpenSSL动态链接库源码安装 中我们介绍了如何在windows和linux环境中编译OpenSSL动态链接库,这篇文章我们将介绍如何在C代码中引用Open

在上一篇文章 OpenSSL动态链接库源码安装 中我们介绍了如何在windowslinux环境中编译OpenSSL动态链接库,这篇文章我们将介绍如何在C代码中引用OpenSSL动态链接库。

测试代码

以下测试代码 main.c 将分别在Windows和Linux环境中编译,该代码的作用是计算给定文件的SHA256值,


#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <stdlib.h>
#include "openssl/sha.h"
 
void sha256_hash_string(unsigned char* hash, char* outputBuffer) {
	size_t i = 0;
	for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
		sprintf(outputBuffer + (i * 2), "%02X", hash[i]);
	}
}
 
int calc_sha256(char* filePath, char* output) {
	FILE* file = fopen(filePath, "rb");
	if (!file) {
		return 1;
	}
	unsigned char hash[SHA256_DIGEST_LENGTH];
	SHA256_CTX sha256;
	SHA256_Init(&sha256);
 
	int bufferSize = 1024;
	char* buffer = (char*)malloc(bufferSize * sizeof(char));
	if (buffer == NULL) {
		printf("Failed to invoke malloc function, buffer is NULL.\n");
		return 1;
	}
	int bytesRead = 0;
	while ((bytesRead = fread(buffer, sizeof(char), bufferSize, file))) {
		SHA256_Update(&sha256, buffer, bytesRead);
	}
	SHA256_Final(hash, &sha256);
 
	sha256_hash_string(hash, output);
	free(buffer);
	fclose(file);
	return 0;
}
 
int main(int arGC, char** argv) {
	if (argc < 2) {
		printf("Please specify a file.\n");
		return 1;
	}
	char* filePath = argv[1];
	char calc_hash[65] = { 0 };
	int rt = calc_sha256(filePath, calc_hash);
	printf("SHA-256: %s\n", calc_hash);
	return rt;
}

Windows上引用动态链接库

创建VS工程,添加代码,

 配置头文件和lib(注:是文件libcrypto.lib所在的目录,而不是libcrypto-1_1-x64.dll的目录)的引用目录,Project -> SHA256 Properties -> Vc++ Directories,

 添加文件 libcrypto.lib,Project -> SHA256 Properties -> Linker -> Input,

 此时可以完成编译,但无法在VS中运行,会出现以下问题,

该错误提示无法找到dll文件,需要将dll目录添加到运行时环境中,Project -> SHA256 Properties -> Debugging,

 此时运行成功,

我们在命令行中手动运行可执行文件。拷贝文件 libcrypto-1_1-x64.dll 到可执行文件所在目录,运行可执行文件,计算源文件 main.c 的SHA256。可以得到其SHA256为,

BEA6D328EA77FE8367DE573879A0245E1D9D23AF2A165745EE1E4D05EC004037

我们通过工具CertUtil来进行验证,可以得到相同的Hash值,

注:使用VS编译时需要指定lib文件libcrypto.lib,该文件本质上是DLL文件libcrypto-1_1-x64.dll的描述,在这里并不是静态链接库文件。不完全清楚VS为什么一定需要该文件,使用gcc在Windows或Linux上编译时不需要该lib文件,只需指定DLL文件即可。

Linux上引用动态链接库

 创建目录: /home/sunny/work/build/SHA_256,将源文件 main.c 拷贝至该目录,

执行以下命令编译源文件,生成可执行文件 a.out

gcc main.c -I/home/sunny/work/build/openssl/output/include -L/home/sunny/work/build/openssl/output/lib -lcrypto

这里,-I表示头文件目录,-L表示库文件目录,-l表示要引用的库文件标识(库文件名:libcrypto.so,其标识为crypto,要去掉lib.so)。

运行可执行文件,计算源文件main.cSHA256

可以看出,我们得到了相同的HASH值。

到此这篇关于OpenSSL动态链接库的使用的文章就介绍到这了,更多相关OpenSSL动态链接库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解C++中OpenSSL动态链接库的使用

本文链接: https://www.lsjlt.com/news/157355.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作