细谈MD5加密

一、MD5的概念:

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。

MD5的基本功能:

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);

不同的输入得到的不同的结果(唯一性);

MD5的其他用途:

1、防止被篡改;

2、防止直接看到明文;

3、防止抵赖(数字签名)。

其实,MD5就是文件或者字符串的指纹,只要文件或者字符串出现小小的一点改动,经过MD5加密算法后生成的数字指纹就完全不一样了。文件的字符编码方式不同也会导致该文件的数字指纹发生巨变。另外,甚至连文件中的空格符号也会影响到数字指纹。

二、MD5算法实现过程:

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

1、第一步、填充:

如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);必须填充

2、第二步、记录信息长度:

附加一个以64位二进制表示的填充前信息长度(单位为Bit),这64位加在第一步结果的后面,如果二进制表示的填充前信息长度超过64位,则取低64位。这样信息长度就变为N*512+448+64=(N+1)*512位。

3、第三步、装入标准的幻数(四个整数):

标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。

如果在程序中定义应该是:

(A=0X67452301,B=0XEFCDAB89,C=0X98BADCFE,D=0X10325476)

4、第四步、四轮循环运算:

循环的次数是分组的个数(N+1)

1)将每一512字节细分成16个小组,每个小组64位(8个字节)

2)先认识四个线性函数(&是与,|是或,~是非,^是异或)

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

3)设Mj表示消息的第j个子分组(从0到15),常数ti是4294967296*abs( sin(i) )的整数部分,i 取值从1到64,单位是弧度。(4294967296=2^(32))

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)

4)四轮运算

第一轮

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)

5)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环。

三、MD5测试结果:

首先进行字符串加密处理:命令行输入想要加密的字符,按下回车,程序会返回加密之后的数字指纹,在这里一个中文字符是占3个字节共24位,而一个字母或者数字只占用一个字节8位。

在进行字符串加密处理是,如果在字符串后面误加了空格之类肉眼看不见的字符的话,同样会引起数字指纹的巨变。

在测试过程中,我将测试输出的结果与网上在线加密工具得到的结果相比较,从而发现,对于中文字符,如果编码方式不一致,同样的字符在经过加密后得到的数字指纹也是差异巨大的。下面图1是字符串测试结果,图2是在线加密的结果:

图1

图2

    接下来是对文件的加密测试,就如上面所说的一样,文本的编码格式是会影响到加密的结果的,相同的字符串,直接测试和放到文件里面进行测试就极有可能因为编码的问题而导致结果不一致,所以一开始我就在读取文本信息进行加密的时候耗费了大量的时间,包括尝试利用iconv库对字符集进行转换,和将新建的.txt文件保存为utf-8格式。但这些尝试都没有达到理想的效果,最后经过不断的常识发现只有在代码编辑工具新建的文件才能保证文本的编辑格式一致。突然醒悟,我竟然将精力放在了与MD5算法几乎无关的字符问题上了。下面图3是文件测试的结果,图4是在线加密的结果,图5是文件的文本内容:

图3

图4

图5

接下来是个人扩展加密,我对字符串的扩展加密是,将字符串的MD5数字指纹输出后再后面添加字符101,然后再一次进行字符串加密,而对文件的扩展加密则是再文件加密得到的数字指纹后加上字符串102,然后再进行一次字符串加密,图6-9分别是字符串扩展加密和文件扩展加密的测试结果:

图6

图7

 

图9

    最后是利用MD5强大而又独特的数字指纹进行对比从而判断文件或者字符串内容是否一致,可以说这是MD5的一个简单的应用吧。图10和图11分别是比对的结果:

图10

图11

最后进行超过512位的数据的测试:因为加密数据量果断的话,大循环的次数只有一次,无法验证程序的正确性,所以进行比较长的数据量的测试:结果分别如下所示:

图12

图13

四、总结:

    由于一开始就被文件中文字符的读取问题所困扰,并在这些地方耗费了大量的时间,导致后面对于MD5算法的理解还有所欠缺,而算法实现的核心代码也是从仿照github上面的例程的。接下来还需要去认真深入的理解一下MD5算法的实现过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值