详解C++中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;c语言中的sprintf用法
}
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值。
到此这篇关于OpenSSL动态链接库的使⽤的⽂章就介绍到这了,更多相关OpenSSL动态链接库内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论