Md5加密原理

Md5加密原理

MD5 算法将输入的信息进行分组,每组512 位(64个 字节),顺序处理完所有分组后输出128 位结果。
将这128 位用十六进制表示便是常见的32 字符的MD5 码,而所谓的16 字符的MD5 码,其实是这32 字符中间的16 个字符。
      在每一组消息的处理中,都要进行4 轮、每轮16 步、总计64 步的处理。其中每步计算中含一次左循环移位,每一步结束时将计算结果进行一次右循环移位。

 

填充信息

使信息的字节长度达到 

信息字节长度%512=448;

       所以信息的字节长度将被扩展至N*512+448个bits 也就是N*64+56个bytes;

      

       关于填充信息:

填充的方法:在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后再在这个结果后面附加一个以64位二进制表示的填充前的信息长度。然后信息长度就变成了

       信息长度=N*512+448+64=(N+1)*512  

(至于为啥用64位表示填充前的信息长度,还有448我表示不理解,难道是因为沿用md4加密的原因?要对16取整?请大牛告诉我真相)

 

长度恰好是512的整数倍,这样做的原因是为满足后面处理中对信息长度的要求。

MD5中有四个32位被称作链接变量(ChainingVariable)的整数参数,他们分别 为:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476

当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目(就是N+1吧)

这是MD5算法最核心的环节,在这里对每一组消息进行4 轮、每轮16 步、总计64 步的处理。在进行讲解之前,需要先介绍4 个逻辑函数F,G,H,I,分别对应4轮运算,它们将参与运算。

第一轮逻辑函数:F(b,c,d)=(b&c)|((~b)&d)参与第一轮的16 步运算  (b,c,d均为32位数)
第二轮逻辑函数:G(b,c,d)=(b&d)|(c&(~d)) 参与第二轮的16 步运算
第三轮逻辑函数:H(b,c,d)= b^c^d 参与第三轮的16步运算
第四轮逻辑函数:I(b,c,d)= c^(b|(~d)) 参与第四轮的16 步运算
再引入一个移位函数MOVE(X,n),它将整型变量X 左循环移n 位,如变量X 为32 位,则MOVE(X,n)= (X<< n) | (X >> (32 - n))。
(& 为按位与,| 为按位或,~ 为按位取非,^ 为按位异或。b、c、d 均为unsigned int。)

 

 

处理开始:
▲(a) 将数组g_nResult 内容复制到数组g_nTemp(类型大小与g_nResult 同)。
▲(b) 将新的一组内容从缓冲区读到unsigned int unBuff[16]中。(unsigned int unBuff[16]为512字节长)
▲(c) 第一轮计算:j 从0 循环到15,轮数ln=0,i=j%16=j。将下面1)- 4)执行16 遍。
(1) unsigned int Temp = g_nTemp[0] + F(g_nTemp[1],g_nTemp[2], g_nTemp[3]) + unBuff[i]
+ g_nTable[ln][i]。
(2) Temp = MOVE(Temp, g_nMove[ln][j])。 
(3) g_nTemp[0] = g_nTemp[1] + Temp。
(4) 将 g_nTemp 数组右循环移位4 字节,即{Temp = g_nTemp[3]; g_nTemp[3]= g_nTemp[2];
g_nTemp[2]= g_nTemp[1]; g_nTemp[1]= g_nTemp[0]; g_nTemp[0]= Temp;}
▲(d) 第二轮计算:j 从0 循环到15, 轮数ln=1,i=(1+5*j)%16,使用循环函数G,其他同第一轮。
▲(e) 第三轮计算:j 从0 循环到15, 轮数ln=2,i=(5+3*j)%16,使用循环函数H,其他同第一轮。
▲(f) 第四轮计算:j 从0 循环到15, 轮数ln=3,i=(7*j)%16,使用循环函数I,其他同第一轮。

▲(g) 累加结果:g_nResult[0] +=g_nTemp [0]; g_nResult[1] += g_nTemp [1];
g_nResult[2] += g_nTemp [2]; g_nResult[3] += g_nTemp [3];
▲(h) 如果缓冲区中还有分组未处理完,则转回到a)。

判断消息(或文件)是否已经处理完了,如果没有则转到二.消息读取与填充,如果已经处理完了,
则g_nResult 就是结果,从低地址开始用16 进制逐个输出字节便得MD5 码。

 

总的来说 就是读取 填充 运算 输出

运算是根据你输入的数进行填充分组然后把ABCD这四组数进行运算,然后输出出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值