超级好用的C++实用库之MD5信息摘要算法

news/2024/11/13 9:18:45/

💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

概述

        MD5信息摘要算法是一种广泛使用的密码散列函数,由Ronald L. Rivest在1991年设计并公布。它是MD4算法的增强版,用于确保信息的安全性和完整性。MD5接受任意长度的消息作为输入,并输出一个固定长度的128位(16字节)散列值,通常以32位的十六进制数形式表示,每个字节两位。

CHP_Md5

        为了方便使用MD5信息摘要算法,我们封装了CHP_Md5类。MD5算法通过一系列复杂的非线性操作,包括:位运算、逻辑函数和加法运算,将输入信息分为512位的块进行处理。整个过程分为四个步骤,每一步使用不同的非线性函数和常数,经过多次迭代完成。

        CHP_Md5类的头文件,可参考下面的示例代码。

#pragma onceclass CHP_Md5
{
public:CHP_Md5();~CHP_Md5();void Init();int Update(unsigned char *pucInput, unsigned int uiInputLen);int Final(unsigned char pucOutput[16]);static int CalcDigest(unsigned char *pucInput, unsigned int uiInputLen, unsigned char pucOutput[16]);private:static void MD5Transform(unsigned int puiState[4], unsigned char pucBlock[64]);static void Encode(unsigned char *pucOutput, unsigned int *puiInput, unsigned int uiInputLen);static void Decode(unsigned int *puiOutput, unsigned char *pucInput, unsigned int uiInputLen);static void MD5Memcpy(unsigned char *pucDest, unsigned char *pucSrc, unsigned int uiLen);static void MD5Memset(unsigned char *pucData, int nData, unsigned int uiLen);private:typedef struct _TMd5ContextInfo{unsigned int state[4];unsigned int count[2];unsigned char buffer[64];}TMd5ContextInfo;TMd5ContextInfo m_ctx;
};

        CHP_Md5类有4个公共成员函数,包括3个实例函数和1个静态函数,下面逐一进行介绍。

        Init:初始化函数。

        Update:更新输入数据。参数pucInput为输入数据buffer,参数uiInputLen为输入数据的长度。返回值为0表示成功,其他为错误码。

        Final:完成摘要计算。参数pucOutput为计算出的摘要值,用于传出。返回值为0表示成功,其他为错误码。

        CalcDigest:计算输入数据的摘要值,是对上面三个接口的封装,方便应用层调用,此时不需要实例化CHP_Md5的对象。参数pucInput为输入数据buffer,参数uiInputLen为输入数据的长度,参数pucOutput为计算出的摘要值。返回值为0表示成功,其他为错误码。

总结

        自1996年起,MD5的安全性开始受到挑战,出现了多种攻击方法,包括:碰撞攻击和预映射攻击。这也表明,MD5不再适用于安全性要求高的场合。对于新系统和应用,目前建议使用更安全的算法,比如:SHA-256或SHA-3。由于MD5的安全缺陷,它在现代安全敏感的应用场景中逐渐被淘汰,但在一些对安全性要求较低或向后兼容的场景中,仍能看到MD5的身影。


http://www.ppmy.cn/news/1461993.html

相关文章

Python | Leetcode Python题解之第92题反转链表II

题目: 题解: class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

力扣HOT100 - 215. 数组中第K个最大元素

解题思路: 快速选择,目标是找出数组中第 k 小(或第 k 大)的元素,而不是对整个数组进行排序。 (需要和快排进行区分,快排的目的是排序) 注意: i l - 1, j r 1; 为什…

深度学习中常见的九种交叉验证方法汇总

目录 1. K折交叉验证(K-fold cross-validation) 2. 分层K折交叉验证(Stratified K-fold cross-validation) 3. 时间序列交叉验证(Time Series Split) 4. 留一交叉验证(Leave-One-Out Cross-…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal:S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

神经网络案例实战

🔎我们通过一个案例详细使用PyTorch实战 ,案例背景:你创办了一家手机公司,不知道如何估算手机产品的价格。为了解决这个问题,收集了多家公司的手机销售数据:这些数据维度可以包括RAM、存储容量、屏幕尺寸、…

汇昌联信科技:做拼多多网店要押金吗?

做拼多多网店要押金吗?”这个问题,其实与拼多多的平台规则有关。在开店之前,商家需要详细了解平台的各项规定和费用构成,这样才能做好充足的准备。 一、明确回答问题 做拼多多网店,不需要支付押金。拼多多的入驻门槛相对较低&…

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有: Number(数字)String(字符串)bool(布尔类型)List(列表)Tuple(元组)Set(集合)Dict…

Python 自动化脚本系列:第3集

21. 使用 cryptography 自动化文件加密 Python 的 cryptography 库提供了一种安全的方式,使用对称加密算法对文件进行加密和解密。你可以自动化加密和解密文件的过程来保护敏感数据。 示例:文件加密和解密 假设你想使用对称加密算法加密一个文件&…