1 简介

视频参考(本文参考视频中的例子)
目的:
将任意长度的明文,转化为128位的哈希值
例如将 123456 转化成 e10adc3949ba59abbe56e057f20f883e (16进制)

特点:
1)不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样
2)抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
3)弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
4)强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

2 计算准备——数据填充

假设明文为China,my great country
2.1 转化成16进制
首先将明文按码表(ASCII)转换成16进制码,得到16进制格式的字符串 H1

C h i n a , m y
43 68 69 6E 61 2C 6D 79
g r e a t c
20 67 72 65 61 74 20 63
o u n t r y
6F 75 6E 74 72 79

即H1 = 4368696E612C6D7920677265617420636F756E747279

2.2 补充至448位
先将 H1 转化为二进制码 B1 ,B1 得数据长度为 n1
若n1 对 512 取模不得 448,需要填充数据。在 B1 后面填充:填充的第一位为1,其余为0。由此得到 B2 。B2 的数据长度对 512 取模得 448

2.3 补充至512位
将 n1 转化为二进制码 Bn1 ,合并B2 与 Bn1 ,如果还不足 512位,则补0
设处理结果为 B3 ,将 B3 转化为16进制码得到 H2 ,我们将用 H2 进行计算
例子中的H2由三部分组成
H2= 4368696E612C6D7920677265617420636F756E747279

80……0(用于补充至448位,该部分补充了二进制数272位)

B000……0(用于补充到512位,该部分补充了64位)

3 计算准备——循环次数、初始参数和函数

计算过程分为主循环和子循环
3.1 循环的次数
假设处理后的原文长度是 M,即 H2 的数据长度
主循环的次数 = M/512 次(在例子中为一次)
自循环的次数 = 512 / 32 * 4 = 64 次

3.2 计算中要使用的函数
1)MD5中使用的四种函数

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

2)MD5中使用的四种操作

FF(a,b,c,d,Mi,s,tj)  表示 a=b+((a+(F(b,c,d)+Mi+tj)<<< s)
GG(a,b,c,d,Mi,s,tj)  表示 a=b+((a+(G(b,c,d)+Mi+tj)<<< s)
HH(a,b,c,d,Mi,s,tj)  表示 a=b+((a+(H(b,c,d)+Mi+tj)<<< s)
II(a,b,c,d,Mi,s,tj)  表示 a=b+((a+(I(b,c,d)+Mi+tj)<<< s)1)其中Mi表示消息的第i个子分组(从0到15,共16个),详情看3.3
2)<<< s表示循环左移s位
3)常数tj为:在第j步中,tj是4294967296*abs(sin(j))的整数部分,i的单位是弧度。
(4294967296是2的32次方)
亦可用 0x100000000UL * abs(sin((double)j)) 计算
4)i和j 都是针对一次主循环而言的,下一个主循环开始后,i和j将重置。
5)a,b,c,d 就是每一步中的 A,B,C,D,详情见3.4

3.3 将 H2 分成 16 组
在例子中,H2 = 4368696E612C6D7920677265617420636F756E747279 80000……000B000000000000000
则每 8 个16进制码为一组,并且将顺序反转
例如M[0]= 43 68 69 6E的反转 = 6E 69 68 43
根据这种方式将 H2 分成16组,分别是M[0]-M[15]

3.4 四个初始值
四个初始值是MD5这个算法提前定义好的,分别是4个32位的值,总共刚好128位。

A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210

4 一次主循环的计算过程

在子循环中,将 F、G、H、I 交替使用,第一个 16 次使用 F,第二个 16 次使用 G,第三个 16 次使用 H,第四个 16 次使用 I。

第一轮
a=FF(a,b,c,d,M0,7,0xd76aa478)
b=FF(d,a,b,c,M1,12,0xe8c7b756)
c=FF(c,d,a,b,M2,17,0x242070db)
d=FF(b,c,d,a,M3,22,0xc1bdceee)
a=FF(a,b,c,d,M4,7,0xf57c0faf)
b=FF(d,a,b,c,M5,12,0x4787c62a)
c=FF(c,d,a,b,M6,17,0xa8304613)
d=FF(b,c,d,a,M7,22,0xfd469501)
a=FF(a,b,c,d,M8,7,0x698098d8)
b=FF(d,a,b,c,M9,12,0x8b44f7af)
c=FF(c,d,a,b,M10,17,0xffff5bb1)
d=FF(b,c,d,a,M11,22,0x895cd7be)
a=FF(a,b,c,d,M12,7,0x6b901122)
b=FF(d,a,b,c,M13,12,0xfd987193)
c=FF(c,d,a,b,M14,17,0xa679438e)
d=FF(b,c,d,a,M15,22,0x49b40821)第二轮
a=GG(a,b,c,d,M1,5,0xf61e2562)
b=GG(d,a,b,c,M6,9,0xc040b340)
c=GG(c,d,a,b,M11,14,0x265e5a51)
d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
a=GG(a,b,c,d,M5,5,0xd62f105d)
b=GG(d,a,b,c,M10,9,0x02441453)
c=GG(c,d,a,b,M15,14,0xd8a1e681)
d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
a=GG(a,b,c,d,M9,5,0x21e1cde6)
b=GG(d,a,b,c,M14,9,0xc33707d6)
c=GG(c,d,a,b,M3,14,0xf4d50d87)
d=GG(b,c,d,a,M8,20,0x455a14ed)
a=GG(a,b,c,d,M13,5,0xa9e3e905)
b=GG(d,a,b,c,M2,9,0xfcefa3f8)
c=GG(c,d,a,b,M7,14,0x676f02d9)
d=GG(b,c,d,a,M12,20,0x8d2a4c8a)第三轮
a=HH(a,b,c,d,M5,4,0xfffa3942)
b=HH(d,a,b,c,M8,11,0x8771f681)
c=HH(c,d,a,b,M11,16,0x6d9d6122)
d=HH(b,c,d,a,M14,23,0xfde5380c)
a=HH(a,b,c,d,M1,4,0xa4beea44)
b=HH(d,a,b,c,M4,11,0x4bdecfa9)
c=HH(c,d,a,b,M7,16,0xf6bb4b60)
d=HH(b,c,d,a,M10,23,0xbebfbc70)
a=HH(a,b,c,d,M13,4,0x289b7ec6)
b=HH(d,a,b,c,M0,11,0xeaa127fa)
c=HH(c,d,a,b,M3,16,0xd4ef3085)
d=HH(b,c,d,a,M6,23,0x04881d05)
a=HH(a,b,c,d,M9,4,0xd9d4d039)
b=HH(d,a,b,c,M12,11,0xe6db99e5)
c=HH(c,d,a,b,M15,16,0x1fa27cf8)
d=HH(b,c,d,a,M2,23,0xc4ac5665)第四轮
a=II(a,b,c,d,M0,6,0xf4292244)
b=II(d,a,b,c,M7,10,0x432aff97)
c=II(c,d,a,b,M14,15,0xab9423a7)
d=II(b,c,d,a,M5,21,0xfc93a039)
a=II(a,b,c,d,M12,6,0x655b59c3)
b=II(d,a,b,c,M3,10,0x8f0ccc92)
c=II(c,d,a,b,M10,15,0xffeff47d)
d=II(b,c,d,a,M1,21,0x85845dd1)
a=II(a,b,c,d,M8,6,0x6fa87e4f)
b=II(d,a,b,c,M15,10,0xfe2ce6e0)
c=II(c,d,a,b,M6,15,0xa3014314)
d=II(b,c,d,a,M13,21,0x4e0811a1)
a=II(a,b,c,d,M4,6,0xf7537e82)
b=II(d,a,b,c,M11,10,0xbd3af235)
c=II(c,d,a,b,M2,15,0x2ad7d2bb)
d=II(b,c,d,a,M9,21,0xeb86d391)

一次主循环后,将获取到的A,B,C,D当作下一轮的A,B,C,D的初始值,进行下一轮的计算。
主循环的计算次数在3.1节中已给出。

5 获取摘要

5.1 计算A’,B’,C’,D’
经过指定轮的主循环的计算,可以获得最终结果A,B,C,D(16进制格式)
假设A=3A 6F 62 0E
则A’= A 的反转 = 0E 62 6F 3A
将A,B,C,D 按上面的方式转化成A’,B’,C’,D’

5.2 获取最终结果
将A’,B’,C’,D’ 合并后,就是MD5标准加密后的16进制结果。
例子中的结果为:0E626F3A097331FE132F59DF4091F775

6 md5盐值加密

md5盐值加密基于md5标准加密算法
6.1 盐值
1)盐值为一个字符串salt,是程序员定义的
2)可以是定值,也可以是通过明文构造出来的字符串

6.2 加密过程
原明文为 M,盐值为salt,MD5标准加密算法函数为md5(x)
则加密对象为M+ salt
加密结果 = md5(M+salt),这就是盐值加密结果

MD5 标准算法详解相关推荐

  1. MD5算法详解及实现(C语言)

    其他现代密码学算法详解及实现见专栏合集~ MD5算法 算法过程 (i)消息填充 首先填充消息,使它的长度比512的整数倍少64位(这64位用来记录原数据长度).填充的内容由一个1和后续的0组成.必须进 ...

  2. md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?

    算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...

  3. MD5信息摘要算法详解

    MD5信息摘要算法详解 文章目录 MD5信息摘要算法详解 01 MD5概要 02 MD5特性 03 MD5应用 04 MD5实现算法 05 MD5在线网站 01 MD5概要 MD5信息摘要算法,一种被 ...

  4. java break 在if 中使用_java中使用国密SM4算法详解

    前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...

  5. 新颖性搜索(Novelty Search,NS)算法详解与实现

    新颖性搜索(Novelty Search,NS)算法详解与实现 基于目标的进化算法的缺点 新颖性搜索与自然进化 新颖性指标 算法描述 新颖性搜索算法实践 基于目标的进化算法的缺点 大多数机器学习方法( ...

  6. NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)

    NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python) NEAT算法详解 NEAT算法概述 NEAT编码方案 结构突变 ...

  7. Unicode双向算法详解(bidi算法)(二)

    作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...

  8. Unicode双向算法详解(bidi算法)(一)

    Unicode双向算法详解(bidi算法)(一) 注:本文已独家授权给脚本之家(ID:jb51net)公众号发布 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是 ...

  9. Unicode双向算法详解(bidi算法)(三)

    Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...

最新文章

  1. mysql新建表96k_innodb表 手工导入导出
  2. IE7及以下浏览器不支持json的解决方法
  3. 初探Apache Impala
  4. DAY5-小别-2018-1-15
  5. BugkuCTF-MISC题这是一张单纯的图片
  6. 诺基亚:你以为他死了,他却靠这一点重回世界第二
  7. (六)使用ResNet50迁移学习进行COVID-19诊断:从头开始构建深度学习网络
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生社团管理系统
  9. 进销存单机版 vb.net + access_某年某月_新浪博客
  10. 压力测试工具Siege详解
  11. git error 已解决【Another git process seems to be running in this repository, e.g. an editor opened by】
  12. git 仓库分支多文件夹管理
  13. HTML期末学生大作业-新闻网页作业html+css
  14. 阿里云国际版建立云端数据库操作流程
  15. 敏捷(Agile)是什么?有哪些优缺点?敏捷落地需不需工具?
  16. html网页文字链接的若干问题
  17. js 变量、函数重复声明和变量提升浅析
  18. python gil全局锁_什么是Python全局解释器锁(GIL)?
  19. [转载]一种水果治一种病 你吃对了吗?
  20. 教你快速批量打印多个文档的方法

热门文章

  1. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.26
  2. 十种心态毁掉你的职场生涯
  3. 全国程序员12月工资新鲜出炉,又降了!?
  4. 电脑维修中的十个笑话
  5. 风火编程--opencv使用记事
  6. type_traits之 析取 合取 否定
  7. 【JY|理念】结构概念设计之(设计理念进展)
  8. Git与GitHub基础全套完整版教程(持续更新....)
  9. MFC Windows 程序设计[192]之六只眼八卦图按钮组(附源码)
  10. 小米手机5s简单刷成开发版获得ROOT权限的方法