MD5杂凑算法

来源:互联网 发布:网络覆盖方案 编辑:程序博客网 时间:2024/05/19 08:06

MD5杂凑算法

0X001

HASH

Hash,一般翻译为“哈希”,其愿意为“散列值”。就是把任意长度的输入,通过散列算法变换成固定长度的输出。这种转换是一种压缩映射;不同的输入可能会散列出相同的输出,所以不能从散列值来唯一确定输入值(明文)。散列算法就是一种“消息摘要”的函数而已。

0X002

MD5的算法处理过程

MD5算法的输入为任意长度,分为512比特长的分组,输出为128比特的固定长度的消息摘要。(MD5的算法框图如下图所示)


处理过程如下步骤:

(1)对消息填充:使得其比特长在模512下为448(留出的64比特在第二步用),注:即使消息长度已满足448比特,仍需填充,因此填充长度的比特数1=<填充比特数=<512.

    填充的方式是固定的:第一位为1,其后各位皆为0.

(2)附加消息长度:用步骤1留出的64比特以little-endian方式来表示消息被填充前的长度;如果消息长于2^64,则以2^64为模数取模。

    执行完前2步后:消息长度为512的倍数(L倍),则可将消息分组为Y0,Y1,Y2......Yn-1;而每个分组又可表示为16个32比特长的字,则消息的总字数为N=L*16。

(3)对MD缓冲区初始化:算法使用128比特长的缓冲区以存储中间结果和最终杂凑值,缓冲区一般用4个32比特长的寄存器(A,B,C,D)每个寄存器都以little-endian方式存储数据,其初值取为A=(01234567)B=(89ABCDEF),C=(FEDCBA98),D=(76543210),实际上为67452301,EFCDAB89,98BADCFE,10325476.

(4)以分组为单位对消息进行处理:每一分组Yq(q=0.1......L-1)都经过压缩函数Hmd5处理。Hmd5是算法的核心,其中又有4轮处理过程,如图所示:


     Hmd5的4轮处理过程结构一样,但所用的逻辑函数不同,分别表示为F,G,H,I.每轮的输入为当前处理的消息分组Yq和缓冲区的当前值A,B,C,D,输出仍放在缓冲区中以产生新的A,B,C,D。每轮处理过程还需加上常数表T中四分之一个元素,分别为T[1....16],T[17...32],T[33...48],T[49...64].第i个元素T[i]为2^32*abs(sin(i))的整数部分,i以弧度为单位。由于abs(sin(i))大于0小于1,所以T[i]可由32比特的字表示。第四轮的输出再与第一轮的CVq相加,相加时将CVq看做4个32比特的字,每个字与第四轮输出的对应的字按模2^32相加,相加的结果即为 压缩函数Hmd5的输出。

(5)输出:消息的L个分组都被处理完后,最后一个Hmd5的输出即为产生的消息摘要。

MD5的压缩函数

压缩函数Hmd5中有4轮处理过程,每轮又对缓冲区ABCD进行16步迭代运算,每一步的运算形式为:(如图)


a<-b+CLSs(a+g(b,c,d)+X[k]+T[i])

其中a,b,c,d为缓冲区的4个字,运算完成后再右循环一个字,即得这一步迭代的输出。g是基本逻辑函数F,G,H,I之一。CLSs是左移s位,s的取值由下图给出,T[i]为表T中的第i个字,+为模2^32加法;X[k]=M[q*16+k],即消息第q个分组中的第k个字(k=1,2,...16).4轮处理过程中,每轮以不同的次序使用16个字,其中在第1轮以字的初始次序使用。第2轮到第4轮,分别对字的次序i做置换后得到一个新次序,然后以新次序使用16个字。3个置换分别是:

            p2(i)=(1+5i)mod  16

            p3(i)=(5+3i)mod   16

            p4(i)=7i mod    16


4轮处理过程分别使用不同的基本逻辑函数F,G,H,I,每个逻辑函数的输入为3个32比特的字,输出是一个32比特的字,其中的运算为逐比特的逻辑运算,即输出的第n个比特是3个输入的第n个比特 的函数,函数定义如下表:


MD5的安全性

找出具有相同杂凑值的两个消息需要执行O(2^64)次运算,而寻找具有给定杂凑值的一个消息需要执行O(2^128)次运算。2004年,山东大学王小云等成功找出了MD5的碰撞!

0 0
原创粉丝点击