MD5算法

MD5算法:

    在网络传输中,为了保证传输信息的安全,通常会有信息摘要,信息摘要通常是通过一些算法来生成的,MD5算法就是其中一种。要了解MD5算法,我们需要从了解信息摘要的意义开始。

信息摘要:

    在网络数据安全传输中,信息摘要可以防止信息被篡改,例如:微信,支付宝,QQ的支付,信息被篡改的后果可想而知,因此,会有信息摘要确保传过来的数据是原始数据,没有被更改过。
    信息摘要会根据明文内容和某种特定的规则生成一段哈希值,即是明文改动一点点,生成的信息摘要结果也会不同,MD5算法就是信息摘要的实现,他可以将任意程度的明文信息生成128位的哈希值。

MD5算法使用:

MD5生成步骤:
    MD5算法生成哈希值分为3步: 1:获取明文参数,2:按照指定规则,用明文参数和给定的密钥拼接起来,3:利用MD5算法生成哈希值。
    需要将明文参数和密钥拼接起来是因为,如果只是将明文参数凭借起来,其他人很可能破解拼接方法,直接用明文参数自己拼接,人后利用MD5算法生成哈希值,就变得不安全了,如果用于MD5生成哈希值的内容里面拼接了密钥信息,就更加安全了。
MD5解析步骤:
    MD5解析同样分为3步: 1:获取明文参数,2:按照指定规则,用明文参数和给定的密钥拼接起来,3:利用MD5算法生成哈希值,与传递过来的比较,相同说明信息正确,否则,信息就被篡改过。这个过程称为 验签

MD5算法底层原理:

    MD5算法的处理可以概括为4步:

第一步:处理原文

    首先,获取原文的长度,长度对512取余,如果结果不等于448,那么就需要填充原文,使长度对512取余等于448,填充方法为第一位填充1,其余位填充0,填充完后,信息的长度就是512*N+448,
    之后,用64位长度记录原文的真正长度,把长度的二进制之补在最后,这样处理后,得到的信息长度就是512*(N+1)。
    举例:我们对信息“0123456789abcdef”的字符串处理原文:
    1:原文信息长度为16*8 = 128bit,对512取余128%512=128,不等于448,因此,需要在后面填充。
    第一次填充:其结果为 0x30,0x31,......,0x39,0x61,0x62,......,0x66,0x80,0x00......0x00。其中前面部分为原文“0123456789abcdef”,后面紧跟的0x80及二进制:10000000B,第一位填充的1,后面的前部填充0,需要填充的位数为 448-128=320,因此,0x80后面跟了 320 / 8 - 1 = 39个0x00,总共为 16 + 1 + 39 = 56byte,即56 * 8 = 448位。此时满足条件。
    第二次填充:第二次填充位数为64,即8byte,原文长度为128,即0x80,因此填充的8位为:0x80,0x00,......,0x00,0x00,共7个0x00。这里采用的小端模式。
    最后,我们将这512bit放在32位的数组中,采用小端的模式。

第二步:设置初始值

    MD5的哈希值为128位,按每32位一组,分为4组,可以认为是4个32bit,这四组结果是由4个初始值A,B,C,D经过不断地演变得到的,初始值可以任定,MD5的官方实现中,A,B,C,D的初始值如下:
    A:0x01234567
    B:0x89ABCDEF
    C:0xFEDCBA98
    D:0x76543210

第三步:循环加工

    这一步非常复杂,每一次循环都会产生新的A,B,C,D,一共处理多少次循环由原文长度决定,例如,原文长度为16,那么主循环次数为16 % 512 = 16次,每个主循环中包含了512 / 32 * 4 = 64次子循环,对于每一次子循环:

    其中,上图中的符号意义如下:
    1:绿色F:
        图中绿色F代表一个非线性函数,官方MD5用到的函数有下面四种:
        F(X, Y, Z) = ( X & Y ) | ( ( ~ X ) & Z )
        G(X, Y, Z) = ( X & Z) | ( Y & ( ~Z ) )
        H(X, Y, Z) = X ^ Y ^ Z         (异或)
        I(X, Y, Z) = Y ^ ( X | ( ~Z ) )
        在一次主循环中的64次子循环,F,G,H,I,四种交替使用,64次分为4个16次,第一个16次使用F,第二个16次使用G……。
    2:红色“田”字
        红色的“田”就代表相加,即A加上F得到的结果。
    3:Mi
        Mi是第一步中得到的原文,他的长度是512*(N+1),把原文的每512位分成16等分,即(N+1)*16个32位的数据,每个512位分成的16个32位命名位M0~M15,在64次子循环中,每16次循环,都会交替使用M0~M15之一。
    4:Ki
        Ki是一个常量,在每个64次子循环中,每次用到的常量都是不同的。Ki是随意定的。
    5:<<<s
        左移s位,s是随意定的。
实际流水线工作起来的数据是这样的:
    A = 原D
    B = b + ( (a + F( b, c, d ) +Mi + Ki ) <<<s )
    C = 原B
    D = 原C

第四步:拼接结果

    将最终得到的A,B,C,D四个拼接在一起,转化成字符串就得到最后的结果

声明:

本文创作参考微信公众号“程序员小灰”——什么是MD5算法


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值