算法流程
- 获得一个待压缩的文本
- 初始化,寄存器(A, B, C, D)置16进制初值作为初始向量IV
- Padding,在原始消息数据尾部填充标识100…0
- Transform,4轮循环,FGHI
- 输出压缩后的文本
*过程中,涉及Encode和Decode,具体见关键实现代码
变量定义
private:
ulong _state[4]; /* state (ABCD) */
ulong _count[2]; /* number of bits, modulo 2^64 (lsb first) */
byte _buffer[64]; /* input buffer */
byte _digest[16]; /* message digest */
bool _finished; /* calculate finished ? */
static const byte PADDING[64]; /* padding for calculate */
static const char HEX[16];
static const size_t BUFFER_SIZE = 1024;
关键实现代码
大部分代码实现参照https://tools.ietf.org/html/rfc1321
初始化
void MD5::initial() {
_finished = false;
/* initial number of bits. */
_count[0] = _count[1] = 0;
/* Load magic initialization constants. */
_state[0] = 0x67452301;
_state[1] = 0xefcdab89;
_state[2] = 0x98badcfe;
_state[3] = 0x10325476;
}
Padding
const byte MD5::PADDING[64] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,