MD5.docx

上传人:b****4 文档编号:4703507 上传时间:2022-12-07 格式:DOCX 页数:17 大小:31.32KB
下载 相关 举报
MD5.docx_第1页
第1页 / 共17页
MD5.docx_第2页
第2页 / 共17页
MD5.docx_第3页
第3页 / 共17页
MD5.docx_第4页
第4页 / 共17页
MD5.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

MD5.docx

《MD5.docx》由会员分享,可在线阅读,更多相关《MD5.docx(17页珍藏版)》请在冰豆网上搜索。

MD5.docx

MD5

MD5

目录·MD5简介

·算法的应用

·算法描述

·具体的一个MD5实现

·一些破解MD5的网站

    

MD5简介

    md5的全称是message-digestalgorithm5(信息-摘要算法),在90年代初由mitlaboratoryforcomputerscience和rsadatasecurityinc的ronaldl.rivest开发出来,经md2、md3和md4发展而来。

它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。

不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。

虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。

这三个算法的描述和c语言源代码在internetrfcs1321中有详细的描述(http:

//www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由ronaldl.rivest在1992年8月向ieft提交。

  rivest在1989年开发出md2算法。

在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。

然后,以一个16位的检验和追加到信息末尾。

并且根据这个新产生的信息计算出散列值。

后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。

md2算法的加密后结果是唯一的--既没有重复。

  为了加强算法的安全性,rivest在1990年又开发出md4算法。

md4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod512=448)。

然后,一个以64位二进制表示的信息的最初长度被添加进来。

信息被处理成512位damg?

rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。

denboer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。

dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。

毫无疑问,md4就此被淘汰掉了。

  尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。

除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。

  一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。

它在md4的基础上增加了"安全-带子"(safety-belts)的概念。

虽然md5比md4稍微慢一些,但却更为安全。

这个算法很明显的由四个和md4设计有少许不同的步骤组成。

在md5算法中,信息-摘要的大小和填充的必要条件与md4完全相同。

denboer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

  vanoorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-forcehashfunction),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。

但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响md5的安全性。

上面所有这些都不足以成为md5的在实际应用中的问题。

并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。

但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。

  2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。

宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。

  MD5破解工程权威网站是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:

“中国研究人员发现了完整MD5算法的碰撞;Wang,Feng,Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个Hash函数的碰撞。

这是近年来密码学领域最具实质性的研究进展。

使用他们的技术,在数个小时内就可以找到MD5碰撞。

……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。

  MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.

算法的应用

  MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。

比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

   MD5(tanajiya.tar.gz)=0ca175b9c0f726a831d895e269332461

  这就是tanajiya.tar.gz文件的数字签名。

MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。

为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程:

大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。

我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如WindowsMD5Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。

利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。

  

  MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。

举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。

如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

  所以,要遇到了md5密码的问题,比较好的办法是:

你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码覆盖原来的就行了。

  MD5还广泛用于加密解密技术上,如Unix、各类BSD系统登录密码(在MD5诞生前采用的是DES加密算法,后因MD5安全性更高,DES被淘汰)、通信信息加密(如大家熟悉的即时通信软件MyIM)、数字签名等诸多方。

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

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

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

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

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

所以,要遇到了md5密码的问题,比较好的办法是:

你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码覆盖原来的就行了。

  正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。

有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。

我们假设密码的最大长度为8位字节(8Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。

这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。

算法描述

  对MD5算法简要的叙述可以为:

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

  在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。

因此,信息的字节长度(BitsLength)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。

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

然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。

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

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

  MD5中有四个32位被称作链接变量(ChainingVariable)的整数参数,他们分别为:

A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。

  当设置好这四个链接变量后,就开始进入算法的四轮循环运算。

循环的次数是信息中512位信息分组的数目。

  将上面四个链接变量复制到另外四个变量中:

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

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

第一轮进行16次操作。

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

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

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

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

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

   (&是与,|是或,~是非,^是异或)

  这四个函数的说明:

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

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

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

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

具体的一个MD5实现

=============================头文件Security.h===============================================

/*

使用方法:

charMd5Buffer[33];

CSecuritySecurity;

Security.MD5("astring",Md5Buffer);

执行完成之后Md5Buffer中即存储了由"astring"计算得到的MD5值

*/

//下列ifdef块是创建使从DLL导出更简单的

//宏的标准方法。

此DLL中的所有文件都是用命令行上定义的SECURITY_EXPORTS

//符号编译的。

在使用此DLL的

//任何其他项目上不应定义此符号。

这样,源文件中包含此文件的任何其他项目都会将

//SECURITY_API函数视为是从此DLL导入的,而此DLL则将用此宏定义的

//符号视为是被导出的。

//在使用该类的地方包含本文件即可

#ifdefSECURITY_EXPORTS

#defineSECURITY_API__declspec(dllexport)

#else

#defineSECURITY_API__declspec(dllimport)

#endif

/*POINTERdefinesagenericpointertype*/

typedefunsignedchar*POINTER;

/*UINT2definesatwobyteword*/

typedefunsignedshortintUINT2;

/*UINT4definesafourbyteword*/

typedefunsignedlongintUINT4;

#definePROTO_LIST(list)list

/*MD5context.*/

typedefstruct_MD5_CTX

{

UINT4state[4];/*state(ABCD)*/

UINT4count[2];/*numberofbits,modulo2^64(lsbfirst)*/

unsignedcharbuffer[64];/*inputbuffer*/

}MD5_CTX;

staticunsignedcharPADDING[64]={

0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

};

/*ConstantsforMD5Transformroutine.

*/

#defineS117

#defineS1212

#defineS1317

#defineS1422

#defineS215

#defineS229

#defineS2314

#defineS2420

#defineS314

#defineS3211

#defineS3316

#defineS3423

#defineS416

#defineS4210

#defineS4315

#defineS4421

/*F,G,HandIarebasicMD5functions.

*/

#defineF(x,y,z)(((x)&(y))|((~x)&(z)))

#defineG(x,y,z)(((x)&(z))|((y)&(~z)))

#defineH(x,y,z)((x)^(y)^(z))

#defineI(x,y,z)((y)^((x)|(~z)))

/*ROTATE_LEFTrotatesxleftnbits.

*/

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

/*FF,GG,HH,andIItransformationsforrounds1,2,3,and4.

Rotationisseparatefromadditiontopreventrecomputation.

*/

#defineFF(a,b,c,d,x,s,ac){(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}

#defineGG(a,b,c,d,x,s,ac){(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}

#defineHH(a,b,c,d,x,s,ac){  (a)+=H((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}

#defineII(a,b,c,d,x,s,ac){(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}

#defineTEST_BLOCK_LEN1000

#defineTEST_BLOCK_COUNT1000

//此类是从Security.dll导出的

classSECURITY_APICSecurity

{

public:

CSecurity(void);

voidCSecurity:

:

MD5(constchar*string,char*lpMD5StringBuffer);

private:

  voidMD5TransformPROTO_LIST((UINT4[4],unsignedchar[64]));

  voidMD5_memcpyPROTO_LIST((POINTER,POINTER,size_t));

  voidMD5_memsetPROTO_LIST((POINTER,int,size_t));

  voidMD5InitPROTO_LIST((MD5_CTX*));

  voidMD5UpdatePROTO_LIST((MD5_CTX*,unsignedchar*,size_t));

  voidMD5FinalPROTO_LIST((unsignedchar[16],MD5_CTX*));

  voidMDTimeTrialPROTO_LIST((void));

  voidStringAddOnePROTO_LIST((char*));

  voidEncodePROTO_LIST((unsignedchar*,UINT4*,size_t));

  voidDecodePROTO_LIST((UINT4*,unsignedchar*,size_t));

};

===============================Security.cpp====================================================

//Security.cpp:

定义DLL应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

#include

#include

#include"Security.h"

BOOLAPIENTRYDllMain(HANDLEhModule,

    DWORD  ul_reason_for_call,

    LPVOIDlpReserved

    )

{

switch(ul_reason_for_call)

{

caseDLL_PROCESS_ATTACH:

caseDLL_THREAD_ATTACH:

caseDLL_THREAD_DETACH:

caseDLL_PROCESS_DETACH:

  break;

}

  returnTRUE;

}

//这是已导出类的构造函数。

//有关类定义的信息,请参阅Security.h

CSecurity:

:

CSecurity()

{

return;

}

/*

MD5initialization.BeginsanMD5operation,writinganewcontext.

*/

voidCSecurity:

:

MD5Init(MD5_CTX*context)

{

context->count[0]=context->count[1]=0;

/*

Loadmagicinitializationconstants.

*/

context->state[0]=0x67452301;

context->state[1]=0xefcdab89;

context->state[2]=0x98badcfe;

context->state[3]=0x10325476;

}

/*

MD5blockupdateoperation.ContinuesanMD5message-digest

operation,processinganothermessageblock,andupdatingthe

context.

*/

voidCSecurity:

:

MD5Update(

    MD5_CTX*context,/*context*/

    unsignedchar*input,/*inputblock*/

    size_tinputLen/*lengthofinputblock*/

    )

{

size_ti,index,partLen;

/*Computenumberofbytesmod64*/

index=(size_t)((context->count[0]>>3)&0x3F);

/*Updatenumberofbits*/

if((context->count[0]+=(

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

当前位置:首页 > 工程科技 > 城乡园林规划

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

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