Atitit.md5 实现原理。Atitit.md5 实现原理。

Atitit.md5 实现原理

Atitit.md5 实现原理

 

 

 

 

1. 竟法流程图2

  1. 终法流程图2

2.
MD5算法过程:2

2.
MD5算法过程:2

2.1. 3. 甩卖分组数据3

2.1. 3. 拍卖分组数据3

3. MD5加以密字符串实例5

  1. MD5加以密字符串实例5

  2. Md5的历史7

4. Md5的历史7

4.1.1.
MD27

4.1.1.
MD27

4.1.2.
MD47

4.1.2.
MD47

4.1.3.
MD57

4.1.3.
MD57

5.
 处理P:8

5.
 处理P:8

  1. 参考8

6. 参考8

 

 

 

 

 

 

1. 到头来法流程图

 

1. 到头来法流程图

图片 1图片 2

 

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. 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://www.cnblogs.com/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;

 

}

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价值。

 

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. Md5的历史

 

4.0.1. MD2

Rivest在1989年付出有MD2算法。在这个算法中,首先对信息进行数量补位,使信息的字节长度是16的翻番。然后,以一个16各项之验和充实到消息最终,并且根据此新发的消息计算出散列值。后来,Rogier和Chauvaud发现只要忽略了检查将同MD2发生冲突。MD2算法加密晚结果是唯一的(即不同信息加密后底结果不同)。

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.2. MD4

为了加

图片 3MD5

强算法的安全性,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),但除便从来不其它让发现的加密后结果了。

 

 

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

 

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

6. 参考

Java主要实现算法

MD5_百度百科.html

 

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

相关文章