MD5 算法简介

MD5 的全称是 Message-Digest Algorithm 5,在 90 年代初由 MIT 的计算机科学实验室和 RSA Data Security Inc 发明,经 MD2、MD3 和 MD4 发展而来。

MD5 将任意长度的“字节串”变换成一个 128bit 的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个 MD5 的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

MD5 的典型应用是对一段 Message(字节串) 产生 fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt 文件中,并对这个 readme.txt 产生一个 MD5 的值并记录在案,然后你传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算 MD5 时就会发现。如果再有一个第三方的认证机构,用 MD5 还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

MD5 还广泛用于加密和解密技术上。在很多操作系统中,用户的密码是以 MD5 值(或类似的其它算法)的方式保存的, 用户登录的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,而系统并不“知道”用户真正的的密码明文是什么。


一、MD5 算法


在一些初始化处理后,MD5 以 512 位分组来处理输入文本,每一分组又划分为 16 个 32 位子分组。算法的输出由四个 32 位分组组成,将它们级联形成一个 128 位散列值。

首先填充消息使其长度恰好为一个比 512 位的倍数仅小 64 位的数。填充方法是附一个 1 在消息后面,后接所要求的多个 0,然后在其后附上 64 位的消息长度(填充前)。这两步的作用是使消息长度恰好是 512 位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。

四个32位变量初始化为:

    A=0x01234567

    B=0x89abcdef

    C=0xfedcba98

    D=0x76543210

它们称为链接变量(chaining variable)


接着进行算法的主循环,循环的次数是消息中 512 位消息分组的数目。主循环有四轮(MD4 只有三轮),每轮很相拟。将上面四个变量复制到别外的变量中:A 到 a,B 到 b,C 到 c,D 到 d。

第一轮进行 16 次操作。每次操作对 a,b,c 和 d 中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上 a,b,c 或 d 中之一。最后用该结果取代 a,b,c 或 d 中之一。


以下是每次操作中用到的四个非线性函数(每轮一个)。

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

    (& 是与,| 是或,~ 是非,^是异或)


这些函数是这样设计的:如果 X、Y 和 Z 的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

函数 F 是按逐位方式操作:如果 X,那么 Y,否则 Z。

函数 H 是逐位奇偶操作符。


设 Mj 表示消息的第 j 个子分组(从 0 到 15),<<< s 表示循环左移 s 位,则四种操作为:

    FF(a,b,c,d,Mj,s,ti)   表示 a=b+((a+(F(b,c,d)+Mj+ti)<<< s)

    GG(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(G(b,c,d)+Mj+ti)<<< s)

    HH(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(H(b,c,d)+Mj+ti)<<< s)

    II(a,b,c,d,Mj,s,ti)    表示 a=b+((a+(I(b,c,d)+Mj+ti)<<< s)


这四轮(64 步)是:

第一轮

    FF(a,b,c,d,M0,7,0xd76aa478)

    FF(d,a,b,c,M1,12,0xe8c7b756)

    FF(c,d,a,b,M2,17,0x242070db)

    FF(b,c,d,a,M3,22,0xc1bdceee)

    FF(a,b,c,d,M4,7,0xf57c0faf)

    FF(d,a,b,c,M5,12,0x4787c62a)

    FF(c,d,a,b,M6,17,0xa8304613)

    FF(b,c,d,a,M7,22,0xfd469501)

    FF(a,b,c,d,M8,7,0x698098d8)

    FF(d,a,b,c,M9,12,0x8b44f7af)

    FF(c,d,a,b,M10,17,0xffff5bb1)

    FF(b,c,d,a,M11,22,0x895cd7be)

    FF(a,b,c,d,M12,7,0x6b901122)

    FF(d,a,b,c,M13,12,0xfd987193)

    FF(c,d,a,b,M14,17,0xa679438e)

    FF(b,c,d,a,M15,22,0x49b40821)

第二轮

    GG(a,b,c,d,M1,5,0xf61e2562)

    GG(d,a,b,c,M6,9,0xc040b340)

    GG(c,d,a,b,M11,14,0x265e5a51)

    GG(b,c,d,a,M0,20,0xe9b6c7aa)

    GG(a,b,c,d,M5,5,0xd62f105d)

    GG(d,a,b,c,M10,9,0x02441453)

    GG(c,d,a,b,M15,14,0xd8a1e681)

    GG(b,c,d,a,M4,20,0xe7d3fbc8)

    GG(a,b,c,d,M9,5,0x21e1cde6)

    GG(d,a,b,c,M14,9,0xc33707d6)

    GG(c,d,a,b,M3,14,0xf4d50d87)

    GG(b,c,d,a,M8,20,0x455a14ed)

    GG(a,b,c,d,M13,5,0xa9e3e905)

    GG(d,a,b,c,M2,9,0xfcefa3f8)

    GG(c,d,a,b,M7,14,0x676f02d9)

    GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮

    HH(a,b,c,d,M5,4,0xfffa3942)

    HH(d,a,b,c,M8,11,0x8771f681)

    HH(c,d,a,b,M11,16,0x6d9d6122)

    HH(b,c,d,a,M14,23,0xfde5380c)

    HH(a,b,c,d,M1,4,0xa4beea44)

    HH(d,a,b,c,M4,11,0x4bdecfa9)

    HH(c,d,a,b,M7,16,0xf6bb4b60)

    HH(b,c,d,a,M10,23,0xbebfbc70)

    HH(a,b,c,d,M13,4,0x289b7ec6)

    HH(d,a,b,c,M0,11,0xeaa127fa)

    HH(c,d,a,b,M3,16,0xd4ef3085)

    HH(b,c,d,a,M6,23,0x04881d05)

    HH(a,b,c,d,M9,4,0xd9d4d039)

    HH(d,a,b,c,M12,11,0xe6db99e5)

    HH(c,d,a,b,M15,16,0x1fa27cf8)

    HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

    II(a,b,c,d,M0,6,0xf4292244)

    II(d,a,b,c,M7,10,0x432aff97)

    II(c,d,a,b,M14,15,0xab9423a7)

    II(b,c,d,a,M5,21,0xfc93a039)

    II(a,b,c,d,M12,6,0x655b59c3)

    II(d,a,b,c,M3,10,0x8f0ccc92)

    II(c,d,a,b,M10,15,0xffeff47d)

    II(b,c,d,a,M1,21,0x85845dd1)

    II(a,b,c,d,M8,6,0x6fa87e4f)

    II(d,a,b,c,M15,10,0xfe2ce6e0)

    II(c,d,a,b,M6,15,0xa3014314)

    II(b,c,d,a,M13,21,0x4e0811a1)

    II(a,b,c,d,M4,6,0xf7537e82)

    II(d,a,b,c,M11,10,0xbd3af235)

    II(c,d,a,b,M2,15,0x2ad7d2bb)

    II(b,c,d,a,M9,21,0xeb86d391)


常数 ti 可以如下选择:

    在第 I 步中,ti 是 4294967296*abs(sin(i)) 的整数部分,I 的单位是弧度。(2的32次方)


所有这些完成之后,将 A,B,C,D 分别加上 a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是 A,B,C 和 D 的级联。


二、MD5 的安全性


MD5 相对 MD4 所作的改进:

增加了第四轮

每一步均有唯一的加法常数

为减弱第二轮中函数 G 的对称性,从 (X&Y)|(X&Z)|(Y&Z) 变为 (X&Z)|(Y&(~Z))

第一步加上了上一步的结果,这将引起更快的雪崩效应

改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似

近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应,各轮的位移量互不相同


2004 年 8 月,在国际密码大会上,中国的王小云教授首次宣布了她及她的研究小组的研究成果:对 MD5、HAVAL-128、MD4 和 RIPEMD 等四个著名密码算法的破译结果。宣告了固若金汤的世界通行密码标准 MD5 大厦轰然倒塌,引发了密码学界的轩然大波。事实上,在 MD5 被王小云为代表的中国专家破译之后,世界密码学界仍然认为 SHA-1 是安全的。而仅仅在一周之后,王小云就宣布了破译 SHA-1 的消息。因为 SHA-1 在美国等国家有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。


国际密码学家 Lenstra 利用王小云提供的 MD5 碰撞,伪造了符合 X.509标准 的数字证书,这就说明了 MD5 的破译已经不仅仅是理论破译结果,而是可以导致实际的攻击,MD5 的撤出已迫在眉睫。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容