您的位置:首页 > 其它

Atitit.md5 实现原理

2016-04-26 23:34 447 查看
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.
 处理P:8

6.
参考8

 

 

 

1. 算法流程图

 

2. MD5算法过程:

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

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

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

 

 

    
第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=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比特的子块
 

每一分组的算法流程如下:
第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果,即A
= a, B = b,
C = c,
D = d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
 
主循环有四轮, 每一轮由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))
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
假设Mj表示消息的第j个子分组(从0到15),常数ti是4294967296*abs(
sin(i) )的整数部分,i
取值从1到64,单位是弧度。(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)
初始化A、B、C、D四个变量。
将这64字节512bit填充后数据分成16个小组,每个小组4个byte,32bit(程序中对应为16个数组),即:
M0:6A 6B 6C 6D
(这是内存中的顺序,按照小端字节序原则,对应数组M(0)的值为0x6D6C6B6A,下同)
M1:6E 80 00 00
M2:00 00 00 00
.....
M14:28 00 00 00
M15:00 00 00 00
经过“3.
分组数据处理
”后,a、b、c、d值分别为0xD8523F60、0x837E0144、0x517726CA、0x1BB6E5FE
在内存中为a:60 3F 52 D8
b:44 01 7E 83
c:CA 26 77 51
d:FE E5 B6 1B
a、b、c、d按内存顺序输出即为最终结果:603F52D844017E83CA267751FEE5B61B。这就是字符串“jklmn”的MD5值。
 

4. Md5的历史

 

4.0.1. MD2

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

4.0.2. MD4

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

4.0.3. MD5

1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den
boer和Bosselaers曾发现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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: