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

原文地址:https://www.cnblogs.com/attilax/p/15198578.html