MD5算法详解

article/2025/9/23 18:28:26

0x00 前言

MD5是一种哈希算法,用来保证信息的完整性。
就一段信息对应一个哈希值,且不能通过哈希值推出这段信息,而且还需要保证不存在任意两段不相同的信息对应同一个哈希值。不过MD5算法算出来的值也就16个字节(16*8=128,即128位),肯定存在相同的,找到另一个所花时间长短而已。

0x01 填充信息

在计算机中,数据存储都是二进制存储的,所以任意一个文件都是些二进制。
每个文件(消息)的大小(长短)都不一样,所以在计算MD5值之前,要将这些文件(消息)用特定内容填充到指定的情况为止。(这里的大小长度是指字节数)

填充的过程如下:
1.先判断文件(消息)的大小(长度) mod 512 == 448 mod 512 ,就是大小(长度)对512求余等于448。(这里的512、448是“位”为单位,转成“字节”就是64、56,即mod 64 == 56 mod 64)

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

3.如果大小(长度)不满足要求,就执行以下操作:
(1)填充1个1
(2)填充0,直到满足满足过程的第一步。
注意:这里是以位为单位,假如是以字节为单位,第一个填充的是0x80(1000 0000),然后就填0x0
举例:消息内容为“gnubd”,就能得到以下内容

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 = 0x67452301;
DWORD md5::B = 0xEFCDAB89;
DWORD md5::C = 0x98BADCFE;
DWORD md5::D = 0x10325476;DWORD md5::T[64] = {0xD76AA478,0xE8C7B756,0x242070DB,0xC1BDCEEE,0xF57C0FAF,0x4787C62A,0xA8304613,0xFD469501,0x698098D8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,0x6B901122,0xFD987193,0xA679438E,0x49B40821,0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,0xD62F105D,0x02441453,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,0xF4292244,0x432AFF97,0xAB9423A7,0xFC93A039,0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1,0x6FA87E4F,0xFE2CE6E0,0xA3014314,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
};

看上去很复杂,其实不是。
首先前4个数值A、B、C、D,它们原本的值是这样的:

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

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

A = 0x67452301;
B = 0xEFCDAB89;
C = 0x98BADCFE;
D = 0x10325476;

0x03 处理信息

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

对于每一段信息,都会经过下列的运算处理,共4种函数
FF(a,b,c,d,mj,s,ti)
GG(a,b,c,d,mj,s,ti)
HH(a,b,c,d,mj,s,ti)
II(a,b,c,d,mj,s,ti)

对于每种函数都会执行64次
执行顺序是:
先执行16次FF,再执行16次GG,再执行16次HH,最后执行16次II,可以把这个4种函数各执行16次看作一次周期,那么这样的周期有4个,可以简单理解为:

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){ //每次增加4FF(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]);
}

M是上面每一段的16个小段了,其中m[j]表示每次函数处理的小段都不同,按照一定的顺序来处理每个小段,其中的顺序就在m中保存了。
s是循环左移的位数,也有一定顺序。
T是常数,共64个,意味着64次的函数调用都是用不同的数值
对于第一段消息(前512位(64个字节))传入的a,b,c,d的值是上面的ABCD4个有规律的值。
第一段消息处理完后(即4个函数各执行了16次之后),得到新的a,b,c,d的值,将它们分别加上原来a,b,c,d的值(即计算前的值),作为下一段消息(第2个512位(64个字节))的初始a,b,c,d的值。

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


http://chatgpt.dhexx.cn/article/CBGcfKsC.shtml

相关文章

跟庄买股票得新技巧(2023.05.16)(绝密资料,只发一次)

昨天学了一个跟庄买卖股票的得新技能 统计昨天庄家异动的情况&#xff0c;按照行业分类&#xff08;板块&#xff09;板块对涨幅进行排序&#xff0c;涨幅排名分前三的是&#xff0c;龙头一&#xff0c;龙头二&#xff0c;龙头三买卖规则&#xff1a;看龙一&#xff0c;玩龙二…

股票策略 —— 指数择时 + 因子选股1

1、概述 我们希望建立一个择时策略 因子选股的复合策略&#xff0c;因为指数择时无法直接落地&#xff0c;而单纯的因子选股策略&#xff0c;回撤太大。本贴观察其效果。 2、策略规则 1、大盘指数择时&#xff0c;有持仓信号时&#xff0c;采用某量价因子筛选指数成份股&am…

md5加密算法

md5是什么&#xff1f; md5是一种信息摘要算法&#xff08;message-digest algorithm 5 &#xff09;&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff0c;用来确保信息传输完整一致性。 特点 不可逆 …

bat表白脚本(变色桃心+vbs问答)

今天520,女朋友在抖音上看人家一个html代码就可以实现非常炫酷的表白效果,真是外行看热闹,内行看笑话!!! 殊不知html代码是引用的本地.js等各种文件才能完成,对于非前端开发人员来说想写成很难。 本人分享两个非常简单的表白编辑代码(bat+vbs) 一、bat 效果(变色桃…

表白代码

vbs脚本表白代码 代码一、做我女朋友非同意不可 msgbox ("我有一件事想跟你说"),vbQuestion,("在吗&#xff1f;") msgbox ("自从第一天遇见你&#xff0c;我便对你难以忘怀了&#xff01;") msgbox ("做我女朋友好吗&#xff1f;")…

抖音java表白教程_抖音vbs表白代码制作方法分享

抖音vbs表白代码在整个制作教程需要对代码的写入有一定的认知&#xff0c;对于具体的教程内容&#xff0c;下面一起来看看相关的介绍吧。 抖音vbs表白代码制作教程 步骤一&#xff1a; 在电脑上新建一个txt文件。 步骤二&#xff1a; 打开txt文件&#xff0c;复制以下代码粘贴进…

抖音记事本代码html,抖音记事本vbs弹窗表白代码怎么弄的?附教程

抖音记事本vbs弹窗表白代码怎么弄的&#xff1f;附教程 2018-06-20 10:14:07 来源&#xff1a;cr173.com 扫码可以&#xff1a; 1.在手机上浏览 2.分享给微信好友或朋友圈 摘要&#xff1a; 抖音上有很多新奇的玩法&#xff0c;比如最近就很火的就是利用弹窗表白噢! 抖音上有很…

html表白树代码程序怎么调,抖音表白弹窗vbs代码怎么制作 表白树特效程序代码教程详细介绍...

最近抖音上面很火的一个vbs的表白代码玩法很流行&#xff0c;这算是技术宅专用表白方式了&#xff0c;想要跟自己喜欢的人表白的小伙伴们快来看看了。下面小编给大家分享一下抖音表白弹窗代码。 两个代码例子分享给各位&#xff1a; 1.msgbox(“做我女朋友好吗?\") msgbo…

java整人代码大全_整人代码vbs大全分享

整人代码vbs大全分享 vbs制作方法 1、在记事本中粘贴vbs代码; 2、另存为vbs文件,双击即可运行。 以下是分享的一些代码 重要提示:关机和死机的代码自己玩玩就可以了,发给别人实在有点缺德,万一别人有重要的东西没保存自己可能要负相应的后果。 一、做我女朋友吗,告白(抖音…

简单制作vbs 对话框表白

右击桌面新建一个文本文档输入&#xff1a;msgbox("做我女朋友好吗&#xff1f;") msgbox("房产证写你名字...") msgbox("保大") msgbox("我妈会游泳") Xmsgbox("做我女朋友好不好",VBOKCancel) if xVBOK then msgbox("…

抖音快手vbs表白代码大全(操作方法)

抖音快手vbs表白代码大全使用方法 前言步骤一&#xff1a;步骤二&#xff1a;步骤三、步骤四、注意事项 总结 前言 作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、…

VBS表白代码以及一些注意事项

第一步&#xff1a;新建一个文本文档 第二步&#xff1a;命名为&#xff1a;表白代码.txt 第三步&#xff1a;输入一下代码&#xff1a; msgbox("做我女朋友好吗&#xff1f;") msgbox("房子写你的名字") msgbox("保大") msgbox("我妈妈会…

【欢迎白嫖】新·vbs表白代码

新vbs表白代码 前言 之前有在B站上发布过一个表白代码的视频&#xff0c;但是貌似Bug多的让人心痛&#xff0c;所以&#xff0c;今天返璞归真&#xff0c;重新做了一个表白代码&#xff0c;欢迎各位批评指正&#xff01; 分析问题 对于上一版的代码&#xff0c;我总结出了以…

java整人的代码_「vbs代码」vbs表白代码+整人代码,抖音vbscript表白代码 - seo实验室...

vbs代码 步骤一&#xff1a; 在电脑上新建一个txt文件 步骤二&#xff1a;将以下代码复制过去(中文可以改) const title “爱情测试” const yourname “嫦娥” const question “你最喜欢的人是谁&#xff1f;请在下面的方框中输入他(她)的名字。” const info “你在说谎…

抖音txt表白html,抖音vbs表白代码的技巧分享

今天小编分享一篇关于抖音vbs表白代码的技巧&#xff0c;有兴趣的可以来了解了解看看哦。 抖音vbs表白代码的技巧分享 抖音vbs表白代码制作教程 步骤一&#xff1a; 在电脑上新建一个txt文件。 步骤二&#xff1a; 打开txt文件&#xff0c;复制以下代码粘贴进去(可以修改中文部…

html自动增加vbs代码,vbs烟花代码

比如关机代码.和一些常用代码 首先在电脑鼠标右键 新建一个文本文档。 然后点开文本文档进行编辑,最重要的一个代码就是msgbox,然后在后面添加想要说的话,但是要使用英文标点符号,换行时候都需要在前面加上代码,最后保存。 我不要整人什么的,我要的是类似翻译的,还有句型…

vbs无法拒绝的表白代码

Case 6 j1 Case 7 msgbox(“再给你一次机会”) end Select loop msgbox(“我就知道你会同意的&#xff0c;哈哈哈哈”) 电脑桌面上新建一个txt文本&#xff0c;代码复制进去后需要修改编码格式&#xff08;文件>另存为>编码改为ANSI&#xff09;&#xff0c;然后保存…

情人节——vbs的学习(句子、情话)

文章目录 一、藏匿情话二、vbs脚本表白代码代码1&#xff1a;做我女朋友非同意不可代码2&#xff1a;做我女朋友不同意就关机代码3&#xff1a;做我女朋友&#xff0c;即使不同意因为更爱你所以撤销关机代码4&#xff1a;爱情测试代码5&#xff1a;求对象原谅 三、web网页表白程…

VBScript之表白代码(有运行视频)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言这是一个基于VBScript的表白脚本&#xff0c;有需要请自取&#xff01; 一、VBS是什么&#xff1f;二、脚本演示三、源代码 前言 这是一个基于VBScript的表白脚…

表白神器(VBS编程)

步骤一、打开记事本&#xff0c;输入以下代码&#xff08;建议直接复制&#xff09;&#xff1a; msgbox "我有一件事想跟你说",vbQuestion,"在吗" msgbox"自从第一天遇见你&#xff0c;我便对你难以忘怀了&#xff01;" CreateObject("SA…