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) 编辑 收藏 举报