• 密码入门之md5加密


    md5加密是常见的一种加密,今天对其加密过程及原理来进行深入理解与总结

    什么是MD5

    MD5是一种密码散列函数,由md4,md3,md2改进而来,因其普遍,快速,稳定的特点广泛应用于普通数据的加密保护领域,MD5算法会对原始的消息进行有损的压缩计算,无论要加密的字节长度有多长,都会生成一个固定长度的消息摘要(密文),所以MD5算法具有不可逆性,但MD5算法还是无法提供绝对的安全性,无法避免碰撞攻击,所以安全性没有那么高,一般用于普通数据的加密。

    原理

    MD5加密的原理简要叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
    流程图如下图所示,每次的运算都有前一轮的128位结果值和当前的512bit值进行运算。

    具体过程

    具体过程如下:

    1.首先对输入的原文进行处理,按位对数据进行补充。

    为啥要按位对数据进行补充呢?我们要让原文长度(bit)对512求余的结果等于448,如果不等的话,就要对原文进行填充,首先在数据后补一个1bit,接着在后面补上一堆0bit,直到整个数据的位数对512求模的结果正好是448,就算这个数据的位数对512求模的结果正好是448也必须进行补位,意思是至少需要补一位,最多可能补512位。

    2.对处理后的数据进行扩展长度。

    在完成补位工作后,将一个表示数据原始长度的64 bit数(这是对原始数据没有补位前长度的描述,用二进制来表示)补在最后。当完成补位及补充数据的描述后,得到的结果数据长度正好是512的整数倍。也就是说长度正好是16个(32bit) 字的整数倍  。

    3.初始化md存储器

    MD5运算要用到一个128位的MD5缓存器,用来保存中间变量和最终结果。该缓存器又可看成是4个32位的寄存器A、B、C、D(被称为链接变量),初始化为  :
                   A : 01 23 45 67
                   B: 89 ab cd ef
                   C: fe dc ba 98
                   D: 76 54 32 10

    4.循环处理分组数据段

    首先定义4个非线性函数F、G、H、I,对输入的报文运算以512位数据段为单位进行处理。对每个数据段都要进行4轮的逻辑处理,在4轮中分别使用4个不同的函数F、G、H、I。每一轮以ABCD和当前的512位的块为输入,处理后送入ABCD(128位)

    处理过程中用到的参数及函数

    1.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))
    (&是与,|是或,~是非,^是异或)
    这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
    函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
    在主循环下面 64 次子循环中,F、G、H、I 交替使用,第一轮 16 次使用 F,第二轮 16 次使用 G,第三轮 16 次使用 H,第四轮 16 次使用 I。
    2.Mj
    Mj是第一步处理后的原文。在第一步中,处理后原文的长度是 512 的整数倍。把原文的每 512 位再分成 16 等份,命名为 M0~M15,每一等份长度 32。在 64 次子循环中,每 16 次循环,都会交替用到 M1~M16 之一。
    3.ti
    一个常量,在 64 次子循环中,每一次用到的常量都是不同的。
    常数ti可以如下t选择:
    在第i步中,ti是4294967296(2的32次方)*abs(sin(i))的整数部分,i的单位是弧度。
    4.<<<S
    左移 S 位,S 的值也是常量。
    命名规则(s+方法名+第N个数)
    SFF1=7;   SFF2=12,   SFF3=17;   SFF4=22;
    SGG1=5;  SGG2=9,    SGG3=14;  SGG4=20;
    SHH1=4;  SHH2=11,   SHH3=16;  SHH4=23;
    SⅡ1=6;   SⅡ2=10,    SⅡ3=15;    SⅡ4=21;
    设Mj表示消息的第j个子分组(从0到15),<<<s表示循环左移s位,则四种操作为:
    FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)
    GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s)
    HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s)
    II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)
    总结一下主循环中的 64 次子循环,可以归纳为下面的四轮:
    这四轮(64步)是:
     第一轮:
           FF(a,b,c,d,M0,7,0xd76aa478)     s[0]=7,   K[0] = 0xd76aa478
    FF(a,b,c,d,M1,12,0xe8c7b756)   s[1]=12,  K[1] = 0xe8c7b756
    FF(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)
    5.将结果进行拼接
    最后将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。
    MD5在应用方面是非常广的,经常用于密码管理,电子签名等方面。

  • 相关阅读:
    ZipHelper 压缩和解压帮助类
    搜索引擎索引数据结构和算法
    Api之Cors跨域以及其他跨域方式
    UML类图
    NetAnalyzer2016使用方法
    30分钟快速掌握AngularJs
    抖屏与收发各种类型文件
    NET Core RC2
    如何检测被锁住的Oracle存储过程及处理办法汇总(转)
    oracle spfile和pfile文件(转)
  • 原文地址:https://www.cnblogs.com/lzlzzzzzz/p/13954427.html
Copyright © 2020-2023  润新知