• Atitit.md5 实现原理


    Atitit.md5 实现原理

     

     

    1. 算法流程图2

    2. MD5算法过程:2

    2.1. 3. 处理分组数据3

    3. MD5加密字符串实例5

    4. Md5的历史7

    4.1.1. MD27

    4.1.2. MD47

    4.1.3. MD57

    5.  处理P8

    6. 参考8

     

     

     

    1. 算法流程图

     

    2. MD5算法过程:


        MD5算法简要的叙述可以为:MD5512位分组来处理输入的信息,且每一分组又被划分为1632位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

         第一步、填充:如果输入信息的长度(bit)512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1n0。填充完后,信息的长度就为N*512+448(bit)

         第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。

     

     

         第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16B=(89ABCDEF)16C=(FEDCBA98)16D=(76543210)16)。如果在程序中定义应该是(A=0X67452301LB=0XEFCDAB89LC=0X98BADCFELD=0X10325476L)。有点晕哈,其实想一想就明白了。

         第四步、四轮循环运算:循环的次数是分组的个数(N+1 

     

    1)将每一512字节细分成16个小组,每个小组64位(8个字节)

     

     

    作者::  ★(attilax)>>>   绰号:老哇的爪子  全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊  汉字名:艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

    2.1. 3. 处理分组数据

    MD5以512比特一块的方式处理输入的消息文本,每个块又划分为十六个32比特的子块

     

    每一分组的算法流程如下:

    第一分组需要将上面四个链接变量复制到另外四个变量中:AaBbCcDd。从第二分组开始的变量为上一分组的运算结果,即A = aB = bC = cD = d

    主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对abcd中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上abcd中之一。最后用该结果取代abcd中之一。

     

    主循环有四轮, 每一轮由16次操作组成。F、G、H、I函数   每一轮应用一个函数/* 一共4轮,每一轮使用不同函数*/  

     

    以下是每次操作中用到的四个非线性函数(每轮一个)。

    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) )

    &是与(And),|是或(Or),~是非(Not),^是异或(Xor))

    这四个函数的说明:如果XYZ的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

    F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

    假设Mj表示消息的第j个子分组(从015),常数ti4294967296*abs( sin(i) )的整数部分,i 取值从164,单位是弧度。(4294967296=232

     

      处理P

    轮次              函数

    1                                       (b  AND  c)  OR ( (NOT  b) AND  ( b ) )

    2                                       (b  AND  d)  OR (c  AND  NOT  d)

    3                                       b  XOR  c  XOR  d

    4                                       c  XOR  (b  OR ( NOT  d))

          T[k]等于4294967296*abs(sin(k))所得结果的证书部分,其中k用弧度来表示。(这样做是为了通过正弦函数和幂函数来进一步消除变换中的线性)

     

     

     

     

     

    /*

     * 主循环  512bit 16group

     */

    private void MainLoop(int group[]) {

    int F, g;

    int a = Atemp;

    int b = Btemp;

    int c = Ctemp;

    int d = Dtemp;

    //主循环有四轮, 每一轮由16次操作组成。F、G、H、I函数   每一轮应用一个函数

    /* 一共4轮,每一轮使用不同函数*/  

    for (int i = 0; i < 64; i++) {

    if (i < 16) {

    F = (b & c) | ((~b) & d);

    g = i;

    } else if (i < 32) {

    F = (d & b) | ((~d) & c);

    g = (5 * i + 1) % 16;      //1  6   11  0 5 10  15  4  9

    } else if (i < 48) {

    F = b ^ c ^ d;

    g = (3 * i + 5) % 16;

    } else {

    F = c ^ (b | (~d));

    g = (7 * i) % 16;

    }

    int tmp = d;

    d = c;

    c = b;

    int mov_bits_count = s[i];

    b = b + shift(a + F + K[i] + group[g], mov_bits_count);

    a = tmp;

    }

    //、、将A、B、C、D分别加上AA、BB、CC、DD,然后用下一块数据继续进行算法。

    Atemp = a + Atemp;

    Btemp = b + Btemp;

    Ctemp = c + Ctemp;

    Dtemp = d + Dtemp;

     

    }

    3. MD5加密字符串实例

    现以字符串“jklmn”为例。

    该字符串在内存中表示为:6A 6B 6C 6D 6E(从左到右为低地址到高地址,后同),信息长度为40 bits, 即0x28

    对其填充,填充至448位,即56字节。结果为:

    6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    剩下64位,即8字节填充填充前信息位长,按小端字节序填充剩下的8字节,结果为。

    6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00 00 00 00

    totaol  64字节,512 bits

    初始化ABCD四个变量。

    将这64字节512bit填充后数据分成16个小组,每个小组4byte,32bit(程序中对应为16个数组),即:

    M06A 6B 6C 6D (这是内存中的顺序,按照小端字节序原则,对应数组M(0)的值为0x6D6C6B6A,下同)

    M16E 80 00 00

    M200 00 00 00

    .....

    M1428 00 00 00

    M1500 00 00 00

    经过3. 分组数据处理后,abcd值分别为0xD8523F600x837E01440x517726CA0x1BB6E5FE

    在内存中为a60 3F 52 D8

    b44 01 7E 83

    cCA 26 77 51

    dFE E5 B6 1B

    abcd按内存顺序输出即为最终结果:603F52D844017E83CA267751FEE5B61B。这就是字符串“jklmn”MD5值。

     

    4. Md5的历史

     

    4.0.1. MD2

    Rivest1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,RogierChauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同)。

    4.0.2. MD4

    为了加

    MD5

    强算法的安全性,Rivest1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64二进制表示的信息的最初长度被添加进来。信息被处理成512damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理

    4.0.3. MD5

    1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"safety-belts)的概念。虽然MD5MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boerBosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

     

     

    5.  处理P

    轮次              函数

    1                                       (b  AND  c)  OR ( (NOT  b) AND  ( b ) )

    2                                       (b  AND  d)  OR (c  AND  NOT  d)

    3                                       b  XOR  c  XOR  d

    4                                       c  XOR  (b  OR ( NOT  d))

     

    6. 参考

    Java主要实现算法

    MD5_百度百科.html

     

    MD5算法原理 - Wreck's HOME - 博客频道 - CSDN.NET.html

  • 相关阅读:
    后缀数组---Milk Patterns
    后缀数组---New Distinct Substrings
    《程序员代码面试指南》第二章 链表问题 单链表的排序
    《程序员代码面试指南》第二章 链表问题 两个单链表相交的一系列问题
    《程序员代码面试指南》第二章 链表问题 按照左右半区的方式重新组合成新链表
    《程序员代码面试指南》第二章 链表问题 合并两个有序的单链表
    《程序员代码面试指南》第二章 链表问题 向有序环形单链表中插入新节点
    《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表
    《程序员代码面试指南》第二章 链表问题 在单链表中删除指定值的节点
    《程序员代码面试指南》第二章 链表问题 删除无序链表中值重复的链表
  • 原文地址:https://www.cnblogs.com/attilax/p/15198578.html
Copyright © 2020-2023  润新知