MD5算法详解

MD5算法详解0x00 前言 MD5 是一种哈希算法 用来保证信息的完整性 就一段信息对应一个哈希值 且不能通过哈希值推出这段信息 而且还需要保证不存在任意两段不相同的信息对应同一个哈希值 不过 MD5 算法算出来的值也就 16 个字节 16 8 128 即 128 位 肯定存在相同的 找到另一个所花时间长短而已 0x01 填充信息在计算机中 数据存储都是二进制存储的 所以任意一个文件都是些二进制

0x00 前言

0x01 填充信息

2.如果大小(长度)满足 mod 512 == 448 mod 512,就在文件(消息)的末尾处添加64位(8字节)的值,值的内容是原消息的长度(以位为单位)

67 6E 75 62 64 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00 00 00 00 

注意到最后面这里有个0x28,数8个字节,就是0x0000000000000028,刚刚好是十进制的40,消息的内容是5个字节,也就是40位,还要注意到这里是小端字节序存储

0x02 数据说明

填充信息满足要求后就要开始计算MD5值了,首先先把需要的东西先列出来:

DWORD md5::A = 0x; DWORD md5::B = 0xEFCDAB89; DWORD md5::C = 0x98BADCFE; DWORD md5::D = 0x; DWORD md5::T[64] = { 0xD76AA478,0xE8C7B756,0xDB,0xC1BDCEEE,0xF57C0FAF,0x4787C62A,0xA,0xFD, 0xD8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,0x6B,0xFD,0xAE,0x49B40821, 0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,0xD62F105D,0x0,0xD8A1E681,0xE7D3FBC8, 0x21E1CDE6,0xC33707D6,0xF4D50D87,0x455A14ED,0xA9E3E905,0xFCEFA3F8,0x676F02D9,0x8D2A4C8A, 0xFFFA3942,0x8771F681,0x6D9D6122,0xFDE5380C,0xA4BEEA44,0x4BDECFA9,0xF6BB4B60,0xBEBFBC70, 0x289B7EC6,0xEAA127FA,0xD4EF3085,0x04881D05,0xD9D4D039,0xE6DB99E5,0x1FA27CF8,0xC4AC5665, 0xF,0x432AFF97,0xAB9423A7,0xFC93A039,0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1, 0x6FA87E4F,0xFE2CE6E0,0xA,0x4E0811A1,0xF7537E82,0xBD3AF235,0x2AD7D2BB,0xEB86D391 }; DWORD md5::s[64]={ 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22, 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23, 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21 }; DWORD md5::m[64]={ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12, 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2, 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }; 
A = 0x0 B = 0x89ABCDEF C = 0xFEDCBA89 D = 0x 

为了保证ABCD4个值在内存中的显示情况为上面情况,所以要调整数字的位置,故实际情况是:

A = 0x; B = 0xEFCDAB89; C = 0x98BADCFE; D = 0x; 

0x03 处理信息

经过信息填充后,填充后的信息长度肯定是512位(64字节)的倍数,也就是说每512位(64字节)为1段可以分成n段,(n大于等于1),对于每一段信息(512位,64字节)又划分成16小段(每段32位,4个字节,用M表示)

for(i = 0; i < 4; ++i) { 
    FF(16); //括号内为执行次数 GG(16); HH(16); II(16); } 

函数的内容分别是:

void md5::FF(DWORD &a,DWORD &b,DWORD &c,DWORD &d,DWORD mj,DWORD s,DWORD ti){ 
    DWORD temp = F(b,c,d) + a + mj + ti; temp = (temp<<s)|(temp>>(32-s)); a = b + temp; } void md5::GG(DWORD &a,DWORD &b,DWORD &c,DWORD &d,DWORD mj,DWORD s,DWORD ti){ 
    DWORD temp = G(b,c,d) + a + mj + ti; temp = (temp<<s)|(temp>>(32-s)); a = b + temp; } void md5::HH(DWORD &a,DWORD &b,DWORD &c,DWORD &d,DWORD mj,DWORD s,DWORD ti){ 
    DWORD temp = H(b,c,d) + a + mj + ti; temp = (temp<<s)|(temp>>(32-s)); a = b + temp; } void md5::II(DWORD &a,DWORD &b,DWORD &c,DWORD &d,DWORD mj,DWORD s,DWORD ti){ 
    DWORD temp = I(b,c,d) + a + mj + ti; temp = (temp<<s)|(temp>>(32-s)); a = b + temp; } 

其中,F,G,H,I分别是:

DWORD md5::F(DWORD X,DWORD Y,DWORD Z){ 
    return (X&Y)|((~X)&Z); } DWORD md5::G(DWORD X,DWORD Y,DWORD Z){ 
    return (X&Z)|(Y&(~Z)); } DWORD md5::H(DWORD X,DWORD Y,DWORD Z){ 
    return X^Y^Z; } DWORD md5::I(DWORD X,DWORD Y,DWORD Z){ 
    return Y^(X|(~Z)); } 

接下来是参数说明,由于每个函数的参数具有相同的意义,所以只说一个就行了。
a,b,c,d 4个参数对应的值是周期变化的,周期长度为4,所以是:

for(int j=0;j<16;j+=4){ 
    //每次增加4 FF(A,B,C,D,M[m[j]],s[j],T[j]); FF(D,A,B,C,M[m[j+1]],s[j+1],T[j+1]); FF(C,D,A,B,M[m[j+2]],s[j+2],T[j+2]); FF(B,C,D,A,M[m[j+3]],s[j+3],T[j+3]); } //GG、HH、II也类似,每种函数执行16次(1轮4次,4轮16次)后再执行下一种函数 for(int j=0;j<16;j+=4){ 
    GG(A,B,C,D,M[m[j]],s[j],T[j]); GG(D,A,B,C,M[m[j+1]],s[j+1],T[j+1]); GG(C,D,A,B,M[m[j+2]],s[j+2],T[j+2]); GG(B,C,D,A,M[m[j+3]],s[j+3],T[j+3]); } 

当每段消息(512位,64个字节)都处理完之后,得到的a,b,c,d的值,按照地址的顺序从低到高打印对应的值,就是所求的MD5值。

MD5算法详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214847.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:18
下一篇 2026年3月18日 下午3:18


相关推荐

  • restsharp 并发请求_JAVA应用

    restsharp 并发请求_JAVA应用C#RestSharp应用开通博客是想将自己所学的东西记录下来,以便自己查缺补漏,希望自己能坚持下去正题关于RestSharp的使用下载NuGet直接搜索即可,最新版本RestSharp需要.netframework4.5.2及以上支持Json序列化工具:Newtonsoft.Json,直接由NuGet下载官网说明:varclient=newRestClient(“http://ex…

    2025年10月8日
    9
  • 服务器系统sm总线控制器驱动,sm总线控制器驱动

    服务器系统sm总线控制器驱动,sm总线控制器驱动SM总线控制器是全称SystemManagement,是主板控制芯片上的一个通信控制器,主板芯片技术中的一种,如果你遇到设备管理器中quotm总线控制器quot有一黄色问号,下载您所使用的主板最新的系统所对应的驱动程序,在安装了正确的主机板驱动程序后,系统将能够正确识别您所有的芯片,问题即可解决。sm总线控制器是什么?它是SystemManagement的缩写,是主板芯片技术中的一种,主要是用…

    2022年6月6日
    110
  • PIC单片机入门教程(四)—— 第一个工程

    PIC单片机入门教程(四)—— 第一个工程PIC 单片机入门教程 三 新建工程

    2026年3月19日
    2
  • 英文名为什么最好不用joe?JOE英文名的寓意是什么?

    英文名为什么最好不用joe?JOE英文名的寓意是什么?英文名为什么最好不用 joe JOE 英文名的寓意是什么 Joe 的意思是乔 人名 意为 上帝还会赐予 Joe 乔 男子名 对不相识者非正式的称呼 Joseph 的昵称 GIJoe 美俚 美国兵 美俚 家伙 joe 苏 四便士的银币 joe 美俚 咖啡 joe 苏 情人是个泛指的称呼 所以最好不用

    2026年3月19日
    2
  • SVM支持向量机原理详解

    SVM支持向量机原理详解支持向量机 SVM SupportVecto 1 解决问题思路展开 要解决的问题 什么样的决策边界才是最好的 特征数据本身如果就很难分 该怎么办 计算负责度怎么样 能否实际应用 gt 目标 基于上述问题对 SVM 进行推导 1 1 决策边界右图中的决策边界更具容忍度 更加可靠 1 2 通过距离获得决策边界 求取点到面的距离 通过平面上两点可以得到平面的法向量 进而获得与法相量平行的单位方向向量 通过平面外一点 X 到平面上一点 x 的距离 D 在单位方向向量的投影可以求出距离 d

    2026年3月26日
    2
  • 将一个字符串对象数组转化为List<对象>

    将一个字符串对象数组转化为List<对象>Stringst Gsongson newGson TypelistType newTypeToken getType ListSearchMo gson fromJson st listType maven 依赖 dependencyg

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号