导航

MD5学习

rfc里定义4字节为unsigned long int,在32位机器上是4字节,在64位机器上是8字节。

4字节应用于ABCD,导致运算过程中出现差异。

 

能得到正确输出的代码

https://blog.csdn.net/weixin_42167759/article/details/81209320?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1619769415417_69597&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

 

懵逼了,为什么rfc1321附带的密码输出和md5sum的结果不一样...

md5sum说明都写了按描述实现...

不是\n的问题...

 

 

 

MD5:Message-Digest Algorithm 5

一种被广泛使用得密码散列函数,可以产生一个128位(16字节)的散列值,用于确保信息传输完整一致。

RFC 1321

输入长度随意,输出为128位。认为是不可能存在两个不同的输入对应相同的输出,或者指定输出,给出满足条件的输入。

MD5在32位机器上运行相当快。

相比MD4,MD5稍增加时间,但更安全。

 

本文中,字长32位,字节8位。

100 0111 1110 1110 0111

由位到字节时,从最高位开始,每8个组成一个字节

-> 1000 1111 1101 1100 111

-> 8F DC E0

由字节到字时,从最低位开始,每4个组成一个字

-> 008F DCE0

 

x_i : i是x的下标

x_{i+1} : i+1是x的下标

x^i : x的i次方

XY:X & Y,按位与

X xor Y:X XOR Y,按位异或

X v Y:X OR Y,按位或

not(X):按位补码

Let the symbol "+" denote addition of words (i.e., modulo-2^32 addition). Let X <<< s denote the 32-bit value obtained by circularly
shifting (rotating) X left by s bit positions. 

 

假设输入有b位,b可以为0,可以不是8的整数倍,可以尤其的大。

写作 m_0 m_1 ... m_{b-1}

 

第一步:附加填充位

填充x(0<x<=512)位,(b+x)mod512=448

x位形如

c_0 c_1 ... c_{x-1}

c_0为1,其余为0

 

第二步:附加长度

截取b的低64位,不够用0补充,填充到低64位

 

此时,长度为512位,16个字

 

第三步:初始化 MD Buffer

4个字,固定为(A, B, C, D)

word A: 01 23 45 67

word B: 89 ab cd ef

word C: fe dc ba 98

word D: 76 54 32 10

 

第四步:以16个字为1个块,处理消息

定义四个函数,处理三个字,每个函数的输出也是字

F(X, Y, Z) = XY v not(X) Z

each bit: X==1 ? Y : Z

G(X, Y, Z) = XZ v Y not(Z)

H(X, Y, Z) = X xor Y xor Z

I(X, Y, Z) = Y xor (X v not(Z))

 

posted on 2021-04-30 15:41  toughcactus  阅读(66)  评论(0编辑  收藏  举报