詳解C++中OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用
在上一篇文章 OpenSSL動(dòng)態(tài)鏈接庫(kù)源碼安裝 中我們介紹了如何在Windows和Linux環(huán)境中編譯OpenSSL動(dòng)態(tài)鏈接庫(kù),這篇文章我們將介紹如何在C代碼中引用OpenSSL動(dòng)態(tài)鏈接庫(kù)。
測(cè)試代碼
以下測(cè)試代碼 main.c 將分別在Windows和Linux環(huán)境中編譯,該代碼的作用是計(jì)算給定文件的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上引用動(dòng)態(tài)鏈接庫(kù)
創(chuàng)建VS工程,添加代碼,
配置頭文件和lib(注:是文件libcrypto.lib所在的目錄,而不是libcrypto-1_1-x64.dll的目錄)的引用目錄,Project -> SHA256 Properties -> VC++ Directories,
添加文件 libcrypto.lib,Project -> SHA256 Properties -> Linker -> Input,
此時(shí)可以完成編譯,但無(wú)法在VS中運(yùn)行,會(huì)出現(xiàn)以下問(wèn)題,
該錯(cuò)誤提示無(wú)法找到dll文件,需要將dll目錄添加到運(yùn)行時(shí)環(huán)境中,Project -> SHA256 Properties -> Debugging,
此時(shí)運(yùn)行成功,
我們?cè)诿钚兄惺謩?dòng)運(yùn)行可執(zhí)行文件??截愇募?strong> libcrypto-1_1-x64.dll 到可執(zhí)行文件所在目錄,運(yùn)行可執(zhí)行文件,計(jì)算源文件 main.c 的SHA256。可以得到其SHA256為,
BEA6D328EA77FE8367DE573879A0245E1D9D23AF2A165745EE1E4D05EC004037
我們通過(guò)工具CertUtil來(lái)進(jìn)行驗(yàn)證,可以得到相同的Hash值,
注:使用VS編譯時(shí)需要指定lib文件libcrypto.lib,該文件本質(zhì)上是DLL文件libcrypto-1_1-x64.dll的描述,在這里并不是靜態(tài)鏈接庫(kù)文件。不完全清楚VS為什么一定需要該文件,使用gcc在Windows或Linux上編譯時(shí)不需要該lib文件,只需指定DLL文件即可。
Linux上引用動(dòng)態(tài)鏈接庫(kù)
創(chuàng)建目錄: /home/sunny/work/build/SHA_256,將源文件 main.c 拷貝至該目錄,
執(zhí)行以下命令編譯源文件,生成可執(zhí)行文件 a.out,
gcc main.c -I/home/sunny/work/build/openssl/output/include -L/home/sunny/work/build/openssl/output/lib -lcrypto
這里,-I表示頭文件目錄,-L表示庫(kù)文件目錄,-l表示要引用的庫(kù)文件標(biāo)識(shí)(庫(kù)文件名:libcrypto.so,其標(biāo)識(shí)為crypto,要去掉lib和.so)。
運(yùn)行可執(zhí)行文件,計(jì)算源文件main.c的SHA256,
可以看出,我們得到了相同的HASH值。
到此這篇關(guān)于OpenSSL動(dòng)態(tài)鏈接庫(kù)的使用的文章就介紹到這了,更多相關(guān)OpenSSL動(dòng)態(tài)鏈接庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ STL入門(mén)教程(7) multimap、multiset的使用
這篇文章主要介紹了C++ STL入門(mén)教程第七篇,multimap一對(duì)多索引,multiset多元集合的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08C語(yǔ)言深入探索動(dòng)態(tài)內(nèi)存分配的使用
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過(guò)這樣的疑問(wèn)。這一期就來(lái)聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2022-04-04C++詳細(xì)講解模擬實(shí)現(xiàn)位圖和布隆過(guò)濾器的方法
位圖(bitset)是一種常用的數(shù)據(jù)結(jié)構(gòu),常用在給一個(gè)很大范圍的數(shù),判斷其中的一個(gè)數(shù)是不是在其中。在索引、數(shù)據(jù)壓縮方面有很大的應(yīng)用。布隆過(guò)濾器是由布隆提出的,它實(shí)際上是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中2022-06-06VC實(shí)現(xiàn)將網(wǎng)址解析出所有ip地址的實(shí)例代碼
這篇文章主要介紹了VC實(shí)現(xiàn)將網(wǎng)址解析出所有ip地址的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04C語(yǔ)言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過(guò)程
這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄的完整流程,此通訊錄還可以增容,并且每個(gè)環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-05-05