c++ 基于openssl MD5用法

基于openssl MD5用法

#include <iostream>
#include <openssl/md5.h>
using namespace std;
int main(int argc, char* argv[])
{
cout << "Test  Hash!" << endl;
unsigned char data[] = "測試md5數據";
unsigned char out[1024] = { 0 };
int len = sizeof(data);
MD5_CTX c;
MD5_Init(&c);
MD5_Update(&c, data, len);
MD5_Final(out, &c);
for (int i = 0; i < 16; i++)
cout << hex << (int)out[i];
cout << endl;
data[1] = 9;
MD5(data, len, out);
for (int i = 0; i < 16; i++)
cout << hex << (int)out[i];
cout << endl;
getchar();
return 0;
}

關鍵函數:

  • MD5_Init: 初始化 MD5 哈希計算上下文。
  • MD5_Update: 更新 MD5 哈希計算的中間結果。
  • MD5_Final: 完成哈希計算,生成最終的哈希值。
  • MD5: 直接計算數據的 MD5 哈希值。

注意:

1.sizeof(data) 返回的是指針的大小,不是數據字符串的實際長度。如果需要計算字符串的實際長度,應使用 strlen(data)。
2. data[1] = 9; 修改了原始數據 data 中的第二個字符,所以第二次的 MD5 哈希值會與第一次不同。

編譯命令:

確保 OpenSSL 已經正確安裝并鏈接到你的程序中,使用以下命令進行編譯:

g++ -o md5_example md5_example.cpp -lssl -lcrypto

計算和驗證文件以及字符串的 MD5 哈希,用于檢測文件完整性變化。

#include <iostream>
#include <openssl/md5.h>
#include <fstream>
#include <thread>
using namespace std;string GetFileListHash(string filepath)
{MD5_CTX c;MD5_Init(&c);ifstream ifs(filepath, ios::binary);if (!ifs) return "";unsigned char buf[1024];while (ifs.read(reinterpret_cast<char*>(buf), sizeof(buf))){MD5_Update(&c, buf, ifs.gcount());}ifs.close();unsigned char out[MD5_DIGEST_LENGTH];MD5_Final(out, &c);return string(reinterpret_cast<char*>(out), MD5_DIGEST_LENGTH);
}void PrintHex(const string& data)
{for (auto c : data)printf("%02X", (unsigned char)c);cout << endl;
}int main(int argc, char* argv[])
{cout << "Test Hash!" << endl;// 文件哈希測試string filepath = "../../src/test_hash/test_hash.cpp";auto hash1 = GetFileListHash(filepath);PrintHex(hash1);// 監控文件變化for (;;){auto hash = GetFileListHash(filepath);if (hash != hash1){ cout << "文件被修改" ;PrintHex(hash);}   this_thread::sleep_for(1s);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84037.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84037.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何通過外網訪問內網服務器?怎么讓互聯網上連接本地局域網的網址

服務器作為一個數據終端&#xff0c;是很多企事業單位不可獲缺的重要設備&#xff0c;多數公司本地都會有部署服務器供測試或部署一些網絡項目使用。有人說服務器就是計算機&#xff0c;其實這種說法不是很準確。準確的說服務器算是計算機的一種&#xff0c;它的作用是管理計算…

安裝Openstack

基本按照Ubuntu官網的指南來安裝&#xff0c;使用單節點模式&#xff0c;官網步驟參見網址&#xff1a;https://ubuntu.com/openstack/install 系統為Ubuntu 24.04.2&#xff0c;全新安裝. Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-24-generic x86_64)kaiexperiment…

?Kafka與RabbitMQ的核心區別

?1.設計目標與適用場景? ?Kafka?&#xff1a;專注于高吞吐量的分布式流處理平臺&#xff0c;適合處理大數據流&#xff08;如日志收集、實時數據分析&#xff09;&#xff0c;強調消息的順序性和擴展性。?? ?RabbitMQ?&#xff1a;作為消息中間件&#xff0c;側重于消…

深入理解 Spring Cache 及其核心注解

一、Spring Cache 概述? Spring Cache 并不是一個具體的緩存實現方案&#xff0c;而是一套抽象的緩存規范。它支持多種緩存技術&#xff0c;如 Ehcache、Redis、Caffeine 等&#xff0c;開發者可以根據項目需求靈活選擇合適的緩存技術。其核心思想是通過在方法上添加注解&…

STM32H562----------串口通信(UART)

1、串口介紹 1.1、 數據通信概念 在單片機中我們常用的通信方式有 USART、IIC、SPI、CAN、USB 等; 1、數據通信方式 根據數據通信方式可分為串行通信和并行通信兩種,如下圖: 串行通信基本特征是數據逐位順序依次傳輸,優點:傳輸線少成本低,抗干擾能力強可用于遠距離傳…

20-Oracle 23 ai free Database Sharding-特性驗證

對于Oracle 23ai Sharding 新特性的驗證腳本&#xff0c;目標是涵蓋其核心改進和新增功能。基于 Oracle 23ai 的 Sharding 特性總結&#xff08;Raft 協議、True Cache、Vector等&#xff09;&#xff0c;結合常見場景驗證。 通過SQL腳本驗證這些特性。例如&#xff1a; 1.基于…

? 常用 Java HTTP 客戶端匯總及使用示例

在 Java 開發中,HTTP 客戶端是與服務端交互的關鍵組件。隨著技術發展,出現了多種 HTTP 客戶端庫,本文匯總了常用的 Java HTTP 客戶端,介紹其特點、適用場景,并附上簡單使用示例,方便開發者快速選擇和上手。 1.常用 HTTP 客戶端一覽 名稱簡介特點HttpClient(JDK 自帶)Ja…

MCP(Model Context Protocol)與提示詞撰寫

隨著大模型&#xff08;LLM&#xff09;在復雜任務中的普及&#xff0c;如何讓模型高效調用外部工具和數據成為關鍵挑戰。傳統函數調用&#xff08;Function Calling&#xff09;依賴開發者手動封裝 API&#xff0c;而 MCP&#xff08;Model Context Protocol&#xff09; 通過…

RootSIFT的目標定位,opencvsharp。

首先截取匹配模板&#xff0c;然后使用rootsift特征匹配&#xff0c;最后定位目標。 對于微弱變化&#xff0c;還是能夠識別定位的&#xff0c;對于傳統算法來說已經不錯了。 目標定位效果&#xff1a; 使用的模板圖片。 using OpenCvSharp; using OpenCvSharp.Features2D;u…

Appium如何支持ios真機測試

ios模擬器上UI自動化測試 以appiumwebdriverio為例&#xff0c;詳細介紹如何在模擬器上安裝和測試app。在使用ios模擬器前&#xff0c;需要安裝xcode&#xff0c;創建和啟動一個simulator。simulator創建好后&#xff0c;就可以使用xcrun simctl命令安裝被測應用并開始測試了。…

近幾年字節飛書測開部分面試題整理

文章目錄 一、面試問題1. 創建索引2. 攔截器&#xff08;Interceptor&#xff09;和過濾器&#xff08;Filter&#xff09;的區別3. 為什么jwt令牌代替session&#xff1f;4. 有一個100行的數據&#xff0c;和一個1萬行的數據&#xff0c;寫sql 的時候要注意什么&#xff1f;5.…

JDBC基礎關鍵_001_認識

目 錄 一、概述 二、原理 三、接口的作用 四、JDBC 模擬 1.JDBC 接口 2.驅動 3.配置文件 4.調用者 一、概述 JDBC&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;Java 數據庫連接&#xff1b;是用 Java 語言操作數據庫&#xff0c;使用 Java 語言向數…

SWAN(Scade One) 語言原理介紹

SCADE 團隊于2024年推出了下一代 SCADE 工具 Scade One&#xff0c;工具的建模語言也基于Scade 6 進行了演化。在語言命名方面&#xff0c;并沒有復用"Scade"這一標志性的名稱&#xff0c;而是使用了新的名字&#xff1a;Swan。在本篇中&#xff0c;將敘述 Swan 語言…

【工具教程】多個條形碼識別用條碼內容對圖片重命名,批量PDF條形碼識別后用條碼內容批量改名,使用教程及注意事項

一、條形碼識別改名使用教程 打開軟件并選擇處理模式&#xff1a;打開軟件后&#xff0c;根據要處理的文件類型&#xff0c;選擇 “圖片識別模式” 或 “PDF 識別模式”。如果是處理包含條形碼的 PDF 文件&#xff0c;就選擇 “PDF 識別模式”&#xff1b;若是處理圖片文件&…

sql中group by使用場景

GROUP BY語句在SQL中用于將多個記錄分組為較小的記錄集合&#xff0c;以便對每個組執行聚合函數&#xff0c;如COUNT(), MAX(), MIN(), SUM(), AVG()等。GROUP BY的使用場景非常廣泛&#xff0c;以下是一些典型的應用場景&#xff1a; 統計數量 當你想要計算某個字段的唯一值數…

MongoDB慢查詢臨時開啟方法講解

1、首先連接數據庫 mongosh "mongodb://localhost:27017" 2、選擇目標數據庫 show databases;#顯示所有數據庫 use lidb;#使用某數據庫 3、查看當前分析級別 db.getProfilingStatus() 輸出 { was: 0, slowms: 100, sampleRate: 1, ok: 1 } #was0表示關閉&…

UML活動圖與泳道圖

活動圖的作用&#xff0c;與用例圖類似&#xff0c;也是幫助我們捕獲用戶的需求。 活動圖主要是用來描述用戶的業務流程&#xff0c;如果能把用戶的這個業務流程描述的很清楚的話&#xff0c;就可以幫助我們做用例分析。 1 活動圖定義 活動圖描述了在一個過程中&#xff0c;…

算法練習-回溯

今天給大家帶來的是在dfs查用的降低復雜度的方法---剪枝 所謂減枝 第一題 代碼部分&#xff1a;&#xff08;未剪枝&#xff09; 代碼部分&#xff08;剪枝&#xff09; 第二題 代碼部分&#xff08;未剪枝&#xff09; 剪枝后 通過這些題目可以看出如果沒有進行剪枝操作&#…

Elasticsearch + Milvus 構建高效知識庫問答系統《一》

&#x1f50d; Elasticsearch Milvus 構建高效知識庫問答系統&#xff08;RAG 技術實戰&#xff09; &#x1f4cc; 目錄 背景介紹Elasticsearch 在知識庫檢索中的作用Milvus 在知識庫檢索中的作用混合檢索&#xff1a;Elasticsearch Milvus完整代碼實現部署建議與優化方向…

10萬QPS高并發請求,如何防止重復下單

1. 前端攔截 首先因為是10萬QPS的高并發請求&#xff0c;我們要保護好系統&#xff0c;那就是盡可能減少用戶無效請求。 1.1 按鈕置灰 很多用戶搶票、搶購、搶紅包等時候&#xff0c;為了提高搶中的概率&#xff0c;都是瘋狂點擊按鈕。會觸發多次請求&#xff0c;導致重復下…