本文介绍了MD5加密算法(消息摘要算法第五版) (中文名称为消息摘要算法)、MD5加密算法的基础原理以及MD5加密算法的解密算法方法
摘要哈希生成的正确姿态是什么? 分为三个步骤:
1 .收集相关业务参数。 这里是金额和目标账户。 当然,实际APP应用程序的参数肯定比这多得多。 这里只是简化了。
2 .根据规则,将参数名称和参数值连接成一个字符串,同时连接给定的密钥。 之所以需要钥匙,是因为攻击者也可能知道拼接规则。
3 .利用MD5算法根据原始文本创建哈希值。 MD5生成的哈希值是128位二进制数,即32位十六进制数。
第三方支付平台如何验证请求的签名? 同样分为三个步骤:
1 .发送方和请求方约定相同的字符串拼接规则,约定相同的密钥。
2 .第三方平台接受支付请求,根据规则将业务参数和私钥拼接在一起,使用MD5算法生成Sign。
3 .将第三方平台自行生成的Sign与请求发送过来的Sign进行比较,如果两个Sign的值一模一样,则签名没有错误,如果两个Sign的值不同,则信息被篡改。 这个过程叫做验票。
MD5 算法底层原理:
总之,MD5算法的过程可以分为四个步骤。 是原文的处理、初始值的设定、循环加工、结果的连接。
第一步:处理原文
首先,计算出原文的长度(bit )对512求馀数的结果,如果不等于448,则需要按照原文对512求馀数的结果为448的方式填充原文。 填充的方法是在第一位填充1,在剩下的位填充0。 填充后,信息长度为512*N 448。
然后,在剩下的位置(512-448=64位)记录原文的真实长度,最后填充长度的二进制值。 这样处理的消息长度是512*(n1 )。
步骤:设定初始值
MD5的散列结果长度为128比特,为按32比特分组的合计4个分组。 这4个组的结果是4个初始值a、b、c、d不断演化得到的。 在MD5的官方安装中,a、b、c、d的初始值如下(例如
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
步骤:循环加工
这一步是最复杂的一步。 请看下图。 此图显示了一次a、b、c、d值的推移流程。
图中,a、b、c、d是散列值的4个组。 每个周期,旧的ABCD都会产生新的ABCD。 一共循环几次? 由处理后的原文长度决定。
设处理后的原文长度为m
主循环次数=M/512
每个主循环包含512/32 * 4=64次子循环。
上图显示了单次子循环的流程。
接下来,我将介绍图中的其他元素。
1 .绿色f
图中绿色的f表示非线性函数。 公式MD5中使用的函数有4种。
f(x,y,z )=) xy )|((x ) z ) ) ) ) ) )。
g(x,y,z )=) xz )y(~z ) )
h(x,y,z )=XYZ
I(x,y,z )=y^ ) x|(~z ) )
在主循环下的64个子循环中,交替使用f、g、h、I,前16次使用f,第2个16次使用g,第3个16次使用h,第4个16次使用I。
2 .红色“田”字
很简单。 红田字表示加法的意思。
3.Mi
Mi是第一步处理的原文。 第一步,处理后的原文长度是512的整数倍。 每512位原文再分成16等份,命名为m0~M15,1等份长度为32。 在64次循环中,每16次循环交替使用M1~M16中的任意一个。
4.Ki
一个常数在64个子循环中,对于使用的每个常数都不同。
5 .黄色s
如果向左移位,s的值也是常数。
在“流水线”的末尾,将计算结果和b相加,代替原来的b。 新ABCD的产生可归纳如下。
新的A=原始的d
新b=b((af ) b、c、d ) Mj Ki ) ) ) ) ) ) ) )。
新C=原b
新的D=原始的c
主循环的64个子循环归纳起来,可以归纳为以下4个。
第一次: ff(a,b,c,d,m0,7,0x d 76 aa 478 ) s )=7,k )=0xd76aa478ff ) a,b,c,d,M1,
12,0xe8c7b756) s[1]=12, K[1] = 0xe8c7b756FF(a,b,c,d,M2,17,0x242070db)
FF(a,b,c,d,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(a,b,c,d,M5,12,0x4787c62a)
FF(a,b,c,d,M6,17,0xa8304613)
FF(a,b,c,d,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(a,b,c,d,M9,12,0x8b44f7af)
FF(a,b,c,d,M10,17,0xffff5bb1)
FF(a,b,c,d,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(a,b,c,d,M13,12,0xfd987193)
FF(a,b,c,d,M14,17, 0xa679438e)
FF(a,b,c,d,M15,22,0x49b40821)
第二轮:
GG(a,b,c,d,M1,5,0xf61e2562)
GG(a,b,c,d,M6,9,0xc040b340)
GG(a,b,c,d,M11,14,0x265e5a51)
GG(a,b,c,d,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(a,b,c,d,M10,9,0×02441453)
GG(a,b,c,d,M15,14,0xd8a1e681)
GG(a,b,c,d,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(a,b,c,d,M14,9,0xc33707d6)
GG(a,b,c,d,M3,14,0xf4d50d87)
GG(a,b,c,d,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(a,b,c,d,M2,9,0xfcefa3f8)
GG(a,b,c,d,M7,14,0x676f02d9)
GG(a,b,c,d,M12,20,0x8d2a4c8a)
第三轮:
HH(a,b,c,d,M5,4,0xfffa3942)
HH(a,b,c,d,M8,11,0x8771f681)
HH(a,b,c,d,M11,16,0x6d9d6122)
HH(a,b,c,d,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(a,b,c,d,M4,11,0x4bdecfa9)
HH(a,b,c,d,M7,16,0xf6bb4b60)
HH(a,b,c,d,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(a,b,c,d,M0,11,0xeaa127fa)
HH(a,b,c,d,M3,16,0xd4ef3085)
HH(a,b,c,d,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(a,b,c,d,M12,11,0xe6db99e5)
HH(a,b,c,d,M15,16,0x1fa27cf8)
HH(a,b,c,d,M2,23,0xc4ac5665)
第四轮:
Ⅱ(a,b,c,d,M0,6,0xf4292244)
Ⅱ(a,b,c,d,M7,10,0x432aff97)
Ⅱ(a,b,c,d,M14,15,0xab9423a7)
Ⅱ(a,b,c,d,M5,21,0xfc93a039)
Ⅱ(a,b,c,d,M12,6,0x655b59c3)
Ⅱ(a,b,c,d,M3,10,0x8f0ccc92)
Ⅱ(a,b,c,d,M10,15,0xffeff47d)
Ⅱ(a,b,c,d,M1,21,0x85845dd1)
Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)
Ⅱ(a,b,c,d,M15,10,0xfe2ce6e0)
Ⅱ(a,b,c,d,M6,15,0xa3014314)
Ⅱ(a,b,c,d,M13,21,0x4e0811a1)
Ⅱ(a,b,c,d,M4,6,0xf7537e82)
Ⅱ(a,b,c,d,M11,10,0xbd3af235)
Ⅱ(a,b,c,d,M2,15,0x2ad7d2bb)
Ⅱ(a,b,c,d,M9,21,0xeb86d391)
第四步:拼接结果
这一步就很简单了,把循环加工最终产生的 A,B,C,D 四个值拼接在一起,转换成字符串即可。
文章转载:
漫画趣解MD5算法