我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

在上一篇文章 OpenSSL动态链接库源码安装 中我们介绍了如何在Windows和Linux环境中编译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动态链接库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

C# 调用动态链接库(DLL)技术详解

C#可以通过平台调用服务(P/Invoke)或者Common Language Runtime(CLR)的集成方法来调用DLL中的函数。
C#DLL开发2024-11-30

ubuntu中python调用C/C++方法之动态链接库详解

安装booJlLUslVOSstpython调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boost一并安装了,Boost库分为两个部分来使用,一是直接使用对应的头文件,二是需要
2022-06-04

怎么使用C/C++生成的动态链接库

这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N
2023-06-26

Linux动态链接库的使用

动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculat
2022-06-04

C#中怎么修改动态链接库

这期内容当中小编将会给大家带来有关C#中怎么修改动态链接库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#实现修改动态链接库,将b修改为双重指针:public class RefComm { [Dl
2023-06-17

linux动态链接库的使用方法

这篇文章主要介绍“linux动态链接库的使用方法”,在日常操作中,相信很多人在linux动态链接库的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux动态链接库的使用方法”的疑惑有所帮助!接下来
2023-06-09

C++封装静态链接库和使用的详细步骤

这篇文章主要介绍了C++封装静态链接库和使用,本文描述了怎么去把一个C++程序封装成一个静态库并且如何去使用这些静态库,需要的朋友可以参考下
2022-11-13

如何正确使用Nodejs 的 c++ module 链接到 OpenSSL

事情的起因是这样的, 因为某些原因, 最近在写 Nodejs 的 c++ module, 然后在js这边调用。 网络通信自然离不开ssl, 于是需要链接到Openssl的库。 我们本来的期望是,需要用户安装有Openssl的运行库, 然后
2022-06-04

linux动态链接库使用方法分享

1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的
2022-06-04

厉害了,Python也能使用动态链接库

Ctypes总的来说还是蛮不错的,挺适合C语言小白学习,毕竟Api的确太多太复杂了,还是Python友好点。

P/Invoke之C#调用动态链接库DLL的方法是什么

这篇文章主要介绍了P/Invoke之C#调用动态链接库DLL的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇P/Invoke之C#调用动态链接库DLL的方法是什么文章都会有所收获,下面我们一起来看看吧
2023-07-05

Linux反编译中的动态链接库处理

在Linux中进行反编译时,如果遇到需要处理动态链接库(Dynamic Link Libraries,简称DLL)的情况,通常需要使用工具来处理动态链接库中的符号和函数。下面是一些常用的工具和方法:使用objdump命令查看动态链接库的符号
Linux反编译中的动态链接库处理
2024-08-22

详解VS2010实现创建并生成动态链接库dll的方法

在某些应用程序场景下,需要将一些类或者方法编译成动态链接库dll,以便别的.exe或者.dll文件可以通过第三方库的方式进行调用,下面就简单介绍一下如何通过VS2010来创建动态链接库
2022-12-21

C# 调用动态链接库读取二代身份证信息

一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了。你必要有联机型居民身份证阅读器一个。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录