杂凑算法md5c语言代码,MD5杂凑算法

MD5杂凑算法

0X001

HASH

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

0X002

MD5的算法处理过程

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

948d1169320147ecb331789c819c55f5.jpg

处理过程如下步骤:

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

填充的方式是固定的:第一位为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轮处理过程,如图所示:

9f0cc9e6c33248b993223f8212343c8f.jpg

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的输出。

1c6f2373c41748c89538ac8f2d567d41.jpg

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

MD5的压缩函数

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

dd66659c7935d4ba1bf55008c732816e.png

a

其中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

3b0b10fae3fc8351cb4ab1d85fe18e20.png

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

c72cb66276be51f5bc61ba9f9668fadc.png

MD5的安全性

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值