首页 > 代码库 > 加密散列算法——MD5

加密散列算法——MD5

引用wiki的定义,散列函数(或散列算法,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。(具体专业术语请自行度娘)

MD5是单向散列算法的一种,全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。这里所谓单向,只能向后计算最终值,不能通过反向计算出初始值。

MD5的性质:

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)
不同的输入得到的不同的结果(唯一性)
根据128位的输出结果不可能反推出输入的信息(不可逆)

MD5算法步骤:
1、补位
首先要进行补位,使得补位后信息的长度对512求余为448。即数据扩展至
K*512+448(bit),即K*64+56(byte),K为自然数。具体补位操作:先补一个1,后面补0至满足上述要求。最少要补1bit,最多补512bit。

2、补长度
在K*64+56(byte)的基础上补上8byte,这8byte是用来保存原始信息的长度。

3、初始化MD缓冲器
用一个四个32位的缓冲器(A,B,C,D)进行MD5值的计算,初始化使用的是十六进制,注意低字节在前:
    word A: 01 23 45 67
    word B: 89 ab cd ef
    word C: fe dc ba 98
    word D: 76 54 32 10
由于内存存储方向和平时书写是相反的,所以定义的时候应该是:
    #define A 0x67452301UL
    #define B 0xEFCDAB89UL
    #define C 0x98BADCFEUL
    #define D 0x10325476UL


4、辅助函数与加密函数
首先定义4个辅助函数:
#define F( X, Y, Z ) ( ( (X) & (Y) ) | ( (~(X)) & (Z) ) )
#define G( X, Y, Z ) ( ( (X) & (Z) ) | ( (Y) & (~(Z)) ) )
#define H( X, Y, Z ) ( (X) ^ (Y) ^ (Z) )
#define I( X, Y, Z ) ( (Y) ^ ( (X) | (~(Z)) ) )
然后定义4个加密函数:
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + ac; \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + ac; \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + ac; \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + ac; \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}

具体C++实现算法下载


加密散列算法——MD5