OpenSSL动态链接库 详解C++中OpenSSL动态链接库的使用
尘世中迷途小码农 人气:0在上一篇文章 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.c的SHA256,
可以看出,我们得到了相同的HASH值。
加载全部内容