MD5信息摘要算法详解

文章目录

  • MD5信息摘要算法详解
  • 01 MD5概要
  • 02 MD5特性
  • 03 MD5应用
  • 04 MD5实现算法
  • 05 MD5在线网站

01 MD5概要

MD5信息摘要算法,一种被广泛使用的密码散列函数,提供消息完整性,MD5的长度为128位(按照16进制编码,16字节,得到32个字符)是一个散列值(hash value)。

MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。
1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途[1]。

02 MD5特性

  1. 长度固定,任意长度的数据都会输出相同长度的md5值
  2. 不可逆
  3. 对原数据进行任何改动,改变一个字节输出数据也会有很大差异

  1. 抗碰撞性,很少能碰到两个不同的数据具有相同的md5值

在浏览各种博客的时候,发现很多很多评论都在指出各种文章中,作者定义md5为加密算法,在这里,我非常认同其中一篇[2]的观点:
认为MD5属于加密算法的人觉得MD5与其他加密算法相似,都为将明文进行运算等各种操作得到与明文完全不相同的数据,而认为MD5不属于加密算法的人认为没有解密算法,无法称为加密算法,当然,第二种相比来说更加严谨,默认情况下不称为加密算法。

03 MD5应用

  1. 密码保护,“如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。”,利用MD5,在后台可以不记录密码本身,并且在后台进行校验密码
  2. 电子签名
    通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。
  3. 在百科上还看到一个很有用的应用实例,就是筛选垃圾邮件,

1)建立邮件MD5库,分别储存邮件的 MD5 值、允许出现的次数(假定为 3)和出现次数(初值为零)。
2)对每一封收到的邮件进行MD5计算,并与MD5库中的值进行比较
3)如未发现相同的 MD5 值,说明此邮件是第一次收到,将此 MD5 值存入资料库,并将出现次数置为1
4)如发现相同的 MD5 值,说明收到过同样内容的邮件,将出现次数+1[3]

04 MD5实现算法

首先需要对信息进行填充,对输入数据进行按位(bit)数据填充,长度进行补齐使消息的长度 X 变成
X = n*512+448

也就是
X mod 512=448

在进行填充时,在消息后面进行填充,填充第一位为1,其余为0
如果数据长度正好为n*512+448,我们也要对数据进行填充,变成(n+1)*512+448

之后的448为(448 = 512-64),64位用于填充原消息的长度。
最终被用来处理的数据就为
n512+448+64 = N512

四个幻数在内存地址上从低到高为:
A = 0×01234567
B = 0×89ABCDEF
C = 0xFEDCBA98
D = 0×76543210

大小为 4*4 = 16字节

每个标准幻数的大小 与 md5输出大小一致

在程序中,使用小端字节序,md5为四个标准幻数进行多轮哈希运算
(小端模式:高字节在前,低字节在后)
则在程序中应该为:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

在数据填充部分,我们知道,我们已经将原始数据填充为:N个512位(n个64字节)

然后将每个64字节分成16份

每份4字节

分好后,定义4个函数
FF(a,b,c,d,Mi,s,tj)
GG(a,b,c,d,Mi,s,tj)
HH(a,b,c,d,Mi,s,tj)
II(a,b,c,d,Mi,s,tj)

其中,a,b,c,d表示4个标准幻数

第五个为每一份的四字节数据,也就是第i个子分组(一共有16个分组)

第六个和第七个表示为固定长度,用于执行逻辑与、或、非、异或运算、加法运算、移位运算

也就是每个512位(64字节)的分组,划分成16份,每份都运行一次FF,GG,HH,II中的一个函数
每个函数为一轮的话,要运行4*16=64次,每一次改变第一个参数的值

比如在第一轮的第一次运算[3]:
FF(a,b,c,d,M0,s,t1)
a = a+(F(b,c,d)+M0+t1);
a = (s<<a) | (s>>(32-a));
a = a + b;

在第一轮的第一次运算:
FF(b,c,d,a,M1,s,t2)
b = b+(F(c,d,a)+M1+t2);
b = (s<<b) | (s>>(32-b));
b = b + c;

而我们运行的64次则为:
第一轮

FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0×242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0×4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0×698098d8)
FF(d,a,b,c,M9,12,0×8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0×895cd7be)
FF(a,b,c,d,M12,7,0×6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0×49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0×265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0×02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0×21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0×455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0×676f02d9)
GG(b,c,d,a,M12,20,0×8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0×8771f681)
HH(c,d,a,b,M11,16,0×6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0×4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0×289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0×04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0×1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0×432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0×655b59c3)
II(d,a,b,c,M3,10,0×8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0×85845dd1)
II(a,b,c,d,M8,6,0×6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0×4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0×2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d39

4个函数都执行了16次

然后再将计算得到的4个标准幻数的值与上一轮或开始值相加,然后作为第二轮输入,重复每一次

最终得到的更新后的标准幻数,按顺序得出我们的md5值,这里再强调一下,前面也说了是小端排序,所以应该是这样的

当然了md5的c语言实现代码在之后进行详细补充,加密流程可以参考[4]是个非常详细的过程

05 MD5在线网站

https://www.cmd5.com/

参考文章
[1] https://baike.baidu.com/item/MD5/212708?fr=aladdin
[2] https://blog.csdn.net/u012611878/article/details/54000607
[3] https://blog.csdn.net/Oliver_xpl/article/details/90214896?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164493954316780269867160%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164493954316780269867160&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_ulrmf~default-2-90214896.pc_search_insert_ulrmf&utm_term=MD5&spm=1018.2226.3001.4187
[4] https://www.bilibili.com/video/BV1u44y1z7t1?from=search&seid=18258260943716626789&spm_id_from=333.337.0.0

MD5信息摘要算法详解相关推荐

  1. 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法

    1 介绍 1.1 DES对称加密算法介绍 对称加密算法 通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成.通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥 ...

  2. python md5加密_Python MD5加密实例详解

    详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待 ...

  3. linux服务器怎么查看cpu配置信息,linux服务器cpu信息查看详解

    在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...

  4. python微信自动发消息_Python使用微信itchat接口实现查看自己微信的信息功能详解...

    Python使用微信itchat接口实现查看自己微信的信息功能详解 发布时间:2020-09-09 04:20:11 来源:脚本之家 阅读:134 本文实例讲述了Python使用微信itchat接口实 ...

  5. python爬取12306_Python爬取12306车次信息代码详解

    详情查看下面的代码: 如果被识别就要添加一个cookie如果没有被识别的话就要一个user-agent就好了.如果出现乱码就设置编码格式为utf-8 #静态的数据一般在elements中(复制文字到s ...

  6. python itchat_Python使用微信itchat接口实现查看自己微信的信息功能详解

    本文实例讲述了Python使用微信itchat接口实现查看自己微信的信息功能.分享给大家供大家参考,具体如下: itchat是python的一个api,可以访问自己的微信信息,功能还蛮好玩的,可以扒取 ...

  7. 密码学 MD5信息摘要算法

    一.简介 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确 ...

  8. 简述MD5信息摘要算法

    在之前的文章中,我们聊了不少的加密算法,今天我们聊一种被广泛使用的密码散列函数--MD5. MD5又叫MD5信息摘要算法,经常用于确保信息传输的完整性和一致性 .从严格意义上来说,MD5并不是加密算法 ...

  9. Sigar 获取CPU和Memory内存等信息使用详解

    一.  Sigar详细介绍 Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的. ...

最新文章

  1. DL之perceptron:利用perceptron感知机对股票实现预测
  2. uboot更改gpio电平_ECBM系列教程4:单片机的手和脚——GPIO
  3. 微信小程序 滚动选项卡 swiper高度自适应
  4. chrome恐龙游戏_如何玩没有互联网的Google Chrome恐龙游戏-在线和离线
  5. 一句命令删除docker所有镜像或容器
  6. 用python实现星期的转换_在Python中将秒转换为周-天-小时-分钟-秒
  7. markdown生成html不出效果,mdeditor: 简单markdown编辑器,同步预览html效果。不依赖任何插件,使用简单,原创,造轮子中。。。更新中。。。...
  8. Java并发编程中锁的正确使用方法
  9. docker搭建sonarqube做代码审计
  10. 2022大连理工887软件工程初试
  11. 极化码信道极化-构造-编码-译码(不断更新)
  12. Google Chrome浏览器翻译失败
  13. 【非功能性测试】软件测试之非功能性测试有哪些?
  14. excel中输入身份证号后三位变成0怎么办
  15. 机器学习:PageRank
  16. NISP管理中心|NISP二级证书介绍
  17. VICA 架构设计(1)
  18. C-V2X 与智能车路协同技术 的深度融合
  19. R报错|Package ‘MASS’ version 7.3.55 cannot be unloaded
  20. openstack-iass搭建 二

热门文章

  1. github新手用法详解(建议收藏!!!)
  2. CPU超线程技术到底有什么用?
  3. 《嗜血的皇冠-光武皇帝之刘秀的秀》——读后感
  4. Game(Chinese)
  5. Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers论文翻译
  6. F盘提示使用驱动器中的光盘之前需要将其格式化要怎样寻回资料
  7. Perl - use strict
  8. 油漆烘烤消泡剂死缠烂打的泡沫终于放手了
  9. BiliBili直播 弹幕信息抓取
  10. 0X80000000和0X7FFFFFFF