当前位置: 首页 > news >正文

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.lqws.cn/news/146053.html

相关文章:

  • 时序数据库IoTDB的UDF Sample算法在数据监控、故障预防的应用
  • AIRIOT无人机安防解决方案
  • Postgresql源码(146)二进制文件格式分析
  • 【hadoop】Davinci数据可视化工具的安装部署
  • Linux网络——socket网络通信udp
  • 【物联网-S7Comm协议】
  • stm32_GPIO
  • GPU加速与非加速的深度学习张量计算对比Demo,使用PyTorch展示关键差异
  • 视频爬虫的Python库
  • 如何在电脑上轻松访问 iPhone 文件
  • 我认为STM32输入只分为模拟输入 与 数字输入
  • 密码工程原理与技术——概述
  • Flask+LayUI开发手记(八):通用封面缩略图上传实现
  • OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务
  • 比特币:固若金汤的数字堡垒与它的四道防线
  • 【学习分享】shell基础-参数传递
  • 数据结构第八章(二)-交换排序
  • 【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE
  • 软件测试全攻略:Postman工具的使用
  • Apache Druid 架构深度解析:构建高性能分布式数据存储系统
  • BeeWorks 协同办公能力:局域网内企业级协作的全场景重构
  • Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
  • v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统
  • BIM Revit教程(十一)如何使用机器学习实现 MEP 布局自动化?
  • 破局新能源消纳难题!安科瑞智慧能源平台助力10KV配电网重构未来
  • 上门服务小程序会员系统框架设计
  • 余氯传感器在智慧水务系统中如何实现IoT集成
  • iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
  • sentinel规则持久化
  • 「数据分析 - Pandas 函数」【数据分析全栈攻略:爬虫+处理+可视化+报告】