概述
MD5信息摘要算法是一种广泛使用的密码散列函数,由Ronald L. Rivest在1991年设计并公布。它是MD4算法的增强版,用于确保信息的安全性和完整性。MD5接受任意长度的消息作为输入,并输出一个固定长度的128位(16字节)散列值,通常以32位的十六进制数形式表示,每个字节两位。
CHP_Md5
为了方便使用MD5信息摘要算法,我们封装了CHP_Md5类。MD5算法通过一系列复杂的非线性操作,包括:位运算、逻辑函数和加法运算,将输入信息分为512位的块进行处理。整个过程分为四个步骤,每一步使用不同的非线性函数和常数,经过多次迭代完成。
CHP_Md5类的头文件,可参考下面的示例代码。
#pragma once class 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表示成功,其他为错误码。