关于MD5说明及代码实现.docx

上传人:b****6 文档编号:8705189 上传时间:2023-02-01 格式:DOCX 页数:26 大小:67.67KB
下载 相关 举报
关于MD5说明及代码实现.docx_第1页
第1页 / 共26页
关于MD5说明及代码实现.docx_第2页
第2页 / 共26页
关于MD5说明及代码实现.docx_第3页
第3页 / 共26页
关于MD5说明及代码实现.docx_第4页
第4页 / 共26页
关于MD5说明及代码实现.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

关于MD5说明及代码实现.docx

《关于MD5说明及代码实现.docx》由会员分享,可在线阅读,更多相关《关于MD5说明及代码实现.docx(26页珍藏版)》请在冰豆网上搜索。

关于MD5说明及代码实现.docx

关于MD5说明及代码实现

一、MD5概念

MD5,全名MessageDigestAlgorithm5,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

MD5是一种信息摘要算法,主要是通过特定的hash散列方法将文本信息转换成简短的信息摘要,压缩+加密+hash算法的结合体,是绝对不可逆的。

备注:

HASH算法,哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。

哈希值是一段数据唯一且极其紧凑的数值表示形式。

如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。

要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。

一般用于快速查找和加密算法。

二、MD5计算步骤

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

备注:

512位(64字节)分组=16*32位(4字节)子分组。

输出为4*32位(4字节)=128位(16字节),16字节用16进制表示为32个ASCII码。

第一步、填充。

在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448,并且填充必须进行,即使其位长对512求余的结果等于448(则需要填充512位)。

因此,信息的位长(BitsLength)将被扩展至N*512+448,N为一个非负整数,N可以是零(如填充前的位长<448位,填充后N=0)。

填充的方法如下:

(下图有例子)

1)在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。

2)在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二进制表示的填充前信息长度超过64位,则取低64位。

经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。

这样做的原因是为满足后面处理中对信息长度的要求。

第二步、初始化变量。

关于大小端数据的问题,见参考后面的截图。

初始的128位值为初始链接变量,这些参数用于第一轮的运算,以大端字节序来表示,他们分别为:

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

(每一个变量给出的数值是高字节存于内存低地址,低字节存于内存高地址,即大端字节序。

在程序中变量A、B、C、D的值分别为0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,其实取决于MCU是多少位系统。

第三步、处理分组数据(512位)。

每一分组的算法流程如下:

第一分组(前512位)需要将上面四个链接变量复制到另外四个变量中:

A到a,B到b,C到c,D到d。

从第二分组(513-1024位)开始的变量为上一分组的运算结果,即A=a,B=b,C=c,D=d。

主循环有四轮(MD4只有三轮),每轮循环都很相似。

第一轮进行16次操作。

每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的1个子分组和一个常数。

再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。

最后用该结果取代a、b、c或d中之一。

以下是每次操作中用到的四个非线性函数(每轮一个)。

F(X,Y,Z)=(X&Y)|((~X)&Z)——第一轮16次操作使用

G(X,Y,Z)=(X&Z)|(Y&(~Z))——第二轮16次操作使用

H(X,Y,Z)=X^Y^Z——第三轮16次操作使用

I(X,Y,Z)=Y^(X|(~Z))——第四轮16次操作使用

(&是与(And),|是或(Or),~是非(Not),^是异或(Xor))

这四个函数的说明:

如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

F是一个逐位运算的函数。

即,如果X,那么Y,否则Z。

函数H是逐位奇偶操作符。

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

(4294967296=232)

现定义:

FF(a,b,c,d,Mj,s,ti)操作为a=b+((a+F(b,c,d)+Mj+ti)<

GG(a,b,c,d,Mj,s,ti)操作为a=b+((a+G(b,c,d)+Mj+ti)<

HH(a,b,c,d,Mj,s,ti)操作为a=b+((a+H(b,c,d)+Mj+ti)<

II(a,b,c,d,Mj,s,ti)操作为a=b+((a+I(b,c,d)+Mj+ti)<

注意:

“<<”表示循环左移位,不是左移位。

这四轮(共64步)是:

第一轮

FF(a,b,c,d,M0,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)

GG(d,a,b,c,M6,9,0xc040b340)

GG(c,d,a,b,M11,14,0x265e5a51)

GG(b,c,d,a,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(d,a,b,c,M10,9,0x02441453)

GG(c,d,a,b,M15,14,0xd8a1e681)

GG(b,c,d,a,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(d,a,b,c,M14,9,0xc33707d6)

GG(c,d,a,b,M3,14,0xf4d50d87)

GG(b,c,d,a,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(d,a,b,c,M2,9,0xfcefa3f8)

GG(c,d,a,b,M7,14,0x676f02d9)

GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)

HH(d,a,b,c,M8,11,0x8771f681)

HH(c,d,a,b,M11,16,0x6d9d6122)

HH(b,c,d,a,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(d,a,b,c,M4,11,0x4bdecfa9)

HH(c,d,a,b,M7,16,0xf6bb4b60)

HH(b,c,d,a,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(d,a,b,c,M0,11,0xeaa127fa)

HH(c,d,a,b,M3,16,0xd4ef3085)

HH(b,c,d,a,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(d,a,b,c,M12,11,0xe6db99e5)

HH(c,d,a,b,M15,16,0x1fa27cf8)

HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

II(a,b,c,d,M0,6,0xf4292244)

II(d,a,b,c,M7,10,0x432aff97)

II(c,d,a,b,M14,15,0xab9423a7)

II(b,c,d,a,M5,21,0xfc93a039)

II(a,b,c,d,M12,6,0x655b59c3)

II(d,a,b,c,M3,10,0x8f0ccc92)

II(c,d,a,b,M10,15,0xffeff47d)

II(b,c,d,a,M1,21,0x85845dd1)

II(a,b,c,d,M8,6,0x6fa87e4f)

II(d,a,b,c,M15,10,0xfe2ce6e0)

II(c,d,a,b,M6,15,0xa3014314)

II(b,c,d,a,M13,21,0x4e0811a1)

II(a,b,c,d,M4,6,0xf7537e82)

II(d,a,b,c,M11,10,0xbd3af235)

II(c,d,a,b,M2,15,0x2ad7d2bb)

II(b,c,d,a,M9,21,0xeb86d391)

所有这些完成之后,将a、b、c、d分别在原来基础上再加上A、B、C、D。

即a=a+A,b=b+B,c=c+C,d=d+D

然后用下一分组数据继续运行以上算法。

4.输出

最后的输出是a、b、c和d的级联。

当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

MD5("")=d41d8cd98f00b204e9800998ecf8427e

MD5("a")=0cc175b9c0f1b6a831c399e269772661

MD5("abc")=900150983cd24fb0d6963f7d28e17f72

MD5("messagedigest")=f96b697d7cb7938d525a2f31aaf161d0

MD5("abcdefghijklmnopqrstuvwxyz")=c3fcd3d76192e4007dfb496cca67e13b

MD5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")=

f29939a25efabaef3b87e2cbfe641315

MD5("8a683566bcc7801226b3d8b0cf35fd97")=cf2cb5c89c5e5eeebef4a76becddfcfd

MD5加密字符串实例

现以字符串“jklmn”为例。

该字符串在内存中表示为:

6A6B6C6D6E(从左到右为低地址到高地址,后同),信息长度为40bits,即0x28。

对其填充,填充至448位,即56字节。

结果为:

6A6B6C6D6E800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

剩下64位,即8字节填充填充前信息位长,按小端字节序填充剩下的8字节,结果为。

6A6B6C6D6E8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000

(64字节,512bits)

初始化A、B、C、D四个变量。

将这64字节填充后数据分成16个小组(程序中对应为16个数组),即:

M0:

6A6B6C6D(这是内存中的顺序,按照小端字节序原则,对应数组M(0)的值为0x6D6C6B6A,下同)

M1:

6E800000

M2:

00000000

.....

M14:

28000000

M15:

00000000

经过“3.分组数据处理”后,a、b、c、d值分别为0xD8523F60、0x837E0144、0x517726CA、0x1BB6E5FE

在内存中为a:

603F52D8

b:

44017E83

c:

CA267751

d:

FEE5B61B

a、b、c、d按内存顺序输出即为最终结果:

603F52D844017E83CA267751FEE5B61B。

这就是字符串“jklmn”的MD5值。

 

  

什么是MD5算法

MD5讯息摘要演算法(英语:

MD5Message-DigestAlgorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hashvalue),用于确保信息传输完整一致。

MD5功能

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

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

MD5属不属于加密算法

认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有解密算法,所以这部分人认为MD5只能属于算法,不能称为加密算法; 

认为属于的人是因为他们觉得经过MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法;我个人支持前者,正如认为BASE64算法只能算编码一样。

MD5算法是否可逆?

MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

不过有个地方值得指出的是,一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。

比如主流使用的MD5将任意长度的“字节串映射为一个128bit的大整数。

也就是一共有2^128种可能,大概是3.4*10^38,这个数字是有限多个的,而但是世界上可以被用来加密的原文则会有无数的可能性。

不过需要注意的一点是,尽量这是一个理论上的有限对无限,不过问题是这个无限在现实生活中并不完全成立,因为一方面现实中原文的长度往往是有限的(以常用的密码为例,一般人都在20位以内),另一方面目前想要发现两段原文对应同一个MD5(专业的说这叫杂凑冲撞)值非常困难,因此某种意义上来说,在一定范围内想构建MD5值与原文的一一对应关系是完全有可能的。

所以对于MD5目前最有效的攻击方式就是彩虹表,具体详情你可以通过谷歌了解。

MD5相当于超损压缩。

MD5用途

1.防止被篡改:

 

1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。

然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。

如果a与b一样就代表中途未被篡改。

 

2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。

 

3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

2.防止直接看到明文:

 

现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。

这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。

(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。

当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。

通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。

这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

3.防止抵赖(数字签名):

 

这需要一个第三方认证机构。

例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。

若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。

这就是所谓的“数字签名”。

MD5安全性

普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。

实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。

因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。

或者使用常用的一些吉利的数字,或者某个英文单词。

如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。

比如某个MD5破解网站

//基于51单片机MD5算法实现

//2010-09-1518:

03

/*

**********************************************************************************************

*文件名称:

md5.h

*作者:

曾光辉

*版本:

*硬件平台:

*软件平台:

*说明:

*创建日期:

2010-9-2

*修改记录:

**********************************************************************************************

*/

#ifndef__MD5_H__

#define__MD5_H__

//类型定义

#ifndef_TYPE

#define_TYPE

typedefunsignedcharINT8U;

typedefunsignedintINT16U;

typedefunsignedlongINT32U;

typedefdoubleINT64U;

#endif

//宏定义:

循环左移的位数

/*md5转换用到的常量,算法本身规定的*/

#defineS117

#defineS1212

#defineS1317

#defineS1422

#defineS215

#defineS229

#defineS2314

#defineS2420

#defineS314

#defineS3211

#defineS3316

#defineS3423

#defineS416

#defineS4210

#defineS4315

#defineS4421

/*循环左移*/

#defineROTATE_LEFT(x,n)(((x)<<(n))|((x)>>(32-(n))))

//外部函数

voidmd5(INT8U*);

#endif

/*

**********************************************************************************************

*文件名称:

md5.c

*作者:

曾光辉

*版本:

*硬件平台:

*软件平台:

*说明:

本程序实现的是一种非规范md5算法。

它不规范的地方在于有:

1)字符串的bit长度是8的整数倍,而不是任意的。

2)字符串的bit长度被限制在0~65535之间。

*创建日期:

2010-9-1

*修改记录:

**********************************************************************************************

*/

//文件包含

#include"md5.h"

#include

#include

//全局变量

INT32Uxdatax[16];/*分组暂存区*/

INT32Uxdataa,b,c,d;/*中间变量*/

INT32Uxdatastate[4];/*md5码*/

/*

**********************************************************************************************

*函数名称:

INT32Uf();INT32Ug();INT32Uh();INT32Ui();voidff();voidgg();voidhh();voidii()

*函数功能:

md5算法定义的函数

*入口参数:

*出口参数:

*作者:

曾光辉

*说明:

*创建日期:

2010-9-2

*修改记录:

**********************************************************************************************

*/

//注意形参的类型应该是U32

INT32Uf(INT32Ux,INT32Uy,INT32Uz)

{

return(x&y)|((~x)&z);

}

INT32Ug(INT32Ux,INT32Uy,INT32Uz)

{

return(x&z)|(y&(~z));

}

INT32Uh(INT32Ux,INT32Uy,INT32Uz)

{

returnx^y^z;

}

INT32Ui(INT32Ux

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1