C++ 从零实现 MD5 加密算法详解
MD5 是一种广泛使用的单向加密哈希算法,具有固定输出长度和不可逆特性。本文将展示如何使用 C++ 语言从头构建一个完整的 MD5 编码器,包括核心的数学运算宏、数据块填充策略以及四轮混淆过程,适合希望深入了解哈希原理的开发者参考。
核心头文件与类结构定义
实现 MD5 的第一步是定义必要的常量、宏以及类接口。代码中定义了无符号整型别名 UInt32,以及处理 512 位(64 字节)分组所需的常量。四个非线性逻辑函数 DEF_F 至 DEF_I 以及对应的旋转操作宏 FF、GG 等构成了算法的核心计算单元。
类 Md5Encode 封装了私有静态幻数(如 kA、kB 等初始向量)和公共入口函数 Encode。内部数据结构 ParamDynamic 用于在每轮运算中暂存状态寄存器 ua_ 到 ud_ 的值。
/*
*******************************************************
* brief: md5 encryption
* author: Monkey.Knight
*******************************************************
*/
#ifndef __MD5_ENCODE_H__
#define __MD5_ENCODE_H__
// std
#include <string>
// define
#define UInt32 unsigned int
#define BIT_OF_BYTE 8
#define BIT_OF_GROUP 512
#define SRC_DATA_LEN 64
// 四个非线性函数宏定义
#define DEF_F(X, Y, Z ) ((( (X) & (Y) )|((~X)&(Z))))
#define DEF_G(X, Y, Z) (((X)&(Z))|((Y)&(~Z)))
#define DEF_H(X, Y, Z) ((X)^(Y)^(Z))
#define DEF_I(X, Y, Z) ((Y)^((X)|(~Z)))
// 求链接数函数宏定义
#define FF(a, b, c, d, Mj, s, ti) (a = b + CycleMoveLeft((a + DEF_F(b,c,d) + Mj + ti),s));
#define GG(a, b, c, d, Mj, s, ti) (a = b + CycleMoveLeft((a + DEF_G(b,c,d) + Mj + ti),s));
#define HH(a, b, c, d, Mj, s, ti) (a = b + CycleMoveLeft((a + DEF_H(b,c,d) + Mj + ti),s));
#define II(a, b, c, d, Mj, s, ti) (a = b + CycleMoveLeft((a + DEF_I(b,c,d) + Mj + ti),s));
class Md5Encode {
public:
// 4轮循环算法
struct ParamDynamic{
UInt32 ua_;
UInt32 ub_;
UInt32 uc_;
UInt32 ud_;
UInt32 va_last_;
UInt32 vb_last_;
UInt32 vc_last_;
UInt32 vd_last_;
};
public:
Md5Encode() {
}
std::string Encode(std::string src_info);
protected:
UInt32 CycleMoveLeft(UInt32 src_num, int bit_num_to_move);
UInt32 FillData(const char *in_data_ptr, int data_byte_len, char** out_data_ptr);
void RoundF(char *data_512_ptr, ParamDynamic & param);
void RoundG(char *data_512_ptr, ParamDynamic & param);
void RoundH(char *data_512_ptr, ParamDynamic & param);
void RoundI(char *data_512_ptr, ParamDynamic & param);
void RotationCalculate(char *data_512_ptr, ParamDynamic & param);
std::string GetHexStr(unsigned int num_str);
private:
// 幻数定义
static const int kA;
static const int kB;
static const int kC;
static const int kD;
static const unsigned long long k_ti_num_integer;
};
#endif免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









