1、浅析MD5算法的原理及应用摘要随着网络技术的广泛应用,网络信息平安越来越引起人们的重视。针对数据在存储的时候存在大量的平安问题,目前通常将需要存储的数据进行加密然后再存储,应用MD5算法是一个不错的选择。MD5算法的全称是Message-Digestalgorithm5,是一种用于产生数字签名的单项散列算法。它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式,即将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的串。该毕业设计是运用microsoftvisualc+6.0软件而开发的,主要是通过算法实现数据的加密存储。文章分成五局部。第一
2、二局部描述了MD5的目前现状和相关理论知识,也让我们了解MD5的定义。重点是MD5的流程实现和封装DLLo在MD5算法的DLL封装这章,主要是描述我们为什么要选用封装DLL的原因,以及封装的好处。设计流程这一局部里包含读取,修改,插入,删除这几个功能的实现情况,并用流程图的方式来分别描述了这四大功能模块的实现过程。最后一局部显示了系统测试的内容和系统主要功能运行界面图。关键词:信息平安;MD5;加密;封装TheResearchandImplementationforMD5AlgorithmDataStorageandEncryptionAbstractWiththewideapplicati
3、onofthenetworktechnology,theinformationofthenetworksafetycausespeoplesattentionmoreandmore.Alargenumberofsecurityquestionsappearwhilestoringdata,thedatathatusuallystoreneedingatpresentareencryptedthenstored,itisagoodchoicetouseMD5algorithm.ThefullnameofMD5algorithmisMessage-Digestalgorithm5,isthatak
4、indofindividualeventusedforproducingfiguresandsignedbreaksupandarrangesalgorithms.Itsfunctionistoletlargecapacityinformation,compress,andbecomeakindofsecretformbeforesigningtheprivatekeywiththedigitalsignaturesoftware,vary,bytebunch*ofawantonlengthintoagreatintegerofone128bitthroughanirreversibleone
5、bunchofalgorithmsofvaryingofcharacter.UsedMicrosoftVisualC+6.0softwareanddevelopedinthisgraduationproject,ismainlytorealizethroughthealgorithmthattheencryptionofthedataisstored.Thearticleisdividedintofiveparts.Thefirstandsecondpartsaredescribingthecurrentsituationandrelevanttheoryknowledgeatpresento
6、fMD5,letusunderstandthedefinitionofMD5.ThefocalpointistheprocedureofMD5isrealizedandencapsulationtoDynamicLinkLibrary.InthischapterofencapsulationMD5classlibrarytoDynamicLinkLibrary,mainlydescribewhywewillselectencapsulationDynamicLinkLibraryforuse,andtheadvantageofencapsulation.Designthisofprocedur
7、eandincludereadinginthepart,revise,insert,deletetherealizationsituationsofthesefunctions,andhasdescribedtherealizationcourseofthisfourmorfunctionsmodulerespectivelyinwayoftheflowchart.Thelastparthasshownthatthecontentofsystemtestingandmainfunctionofsystemoperatetheinterfacepicture.KeyWordsnnformatio
8、nsecurity;MD5;encrypt;Packaging论文总页数:23页1引言11.1研究现状11.2选题意义21.3选题背景22相关理论根底31. 1单向散列函数3单向散列函数的根本原理3散列值的长度42. 2MD5算法的根本原理43. 3MD5的应用93需求分析及设计方案113.1主要功能模块11数据加密11数据存储11数据库设计114. 2主要流程图114MD5算法的DLL封装115. 1加载时动态链接126. 2运行时动态链接124. 3DLL封装情况125具体设计流程及实现135. 1读取的设计和实现135. 2插入的设计和实现135. 3修改的设计和实现137. 4删除的设
9、计和实现136调试与分析148. 1概述149. 2测试分析报告14结论14参考文献141引言随着网络通信技术和Internet的联系日益增强,出现了一系列与网络平安相关的问题:如对主机的攻击,网络上传输的信息被截取、篡改、重发等,由此,它对网络应用的进一步推广构成了巨大威胁,因此密码体制就在这种背景下应运而生了。存储加密涉及大量文件、资料、新建等文档处理,需要高效,可靠的进行各种信息交换,同时对信息流转的整个过程需要有效的组织和监控。对数据的平安存储和平安传输具有较高的要求。数据加密技术不仅具有保证信息机密性的信息加密功能,而且具有数字签名、秘密分存、系统平安等性能。因而可以保障信息的机密性
10、完整性和准确性,防止信息被篡改、伪造和假冒。虽然目前已有很多加密技术应用于各个领域,但是存在加密强度、运算量大等缺陷,因而本文提出了一种新的加密机制一MD5加密。同时,在竞争日趋剧烈的今天,只有实行对数据加密的加强管理,建设性提高信息平安在网络中的地位,以至在竞争中求生存,以期更好地开展下去。1.1 研究现状MD5的全称是MeSSage-DigeStalgorithm5(信息一摘要算法),MD5是一种不可逆的算法,即对生成的密文求逆,对应着无穷多个逆。在90年代初由MrrLaboratoryforComputerScience(IT计算机科学实验室)和RSADataSecurityInc(R
11、SA数据平安公司)的RonaldL.Rivest开发出来,经MD2,MD3和MD4开展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式(把一个任意长度的字节串变换成一定长的大整数)。不管是MD2,MD4还是MD5,它们都需要获得一个随机长度的信息,并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但是MD2的设计与MD4和MD5完全不同,是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。RiVeSt在1989年开发出MD2算法,在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数,然后,以一个16位的
12、检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现,如果忽略了检验和,那样就将产生MD2冲突。MD2算法的加密后结果是唯一的一-即没有重复。为了加强算法的平安性,RiVeSt在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod512=448o然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位迭代结构的区块,而且每个区块要通过三个不同步骤的处理。DenBoer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbe
13、rtin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果),毫无疑问,MD4就此被淘汰掉了。一年以后,即1991年,RiVeSt开发出技术上更为趋近成熟的MD5算法。它在MD4的根底上增加了“平安-带子”(Safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为平安。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息一摘要的大小和填充的必要条件与MD4完全相同。DenBoer和Bosselaers曾发现MD5算法中的假冲突(PSeUdO-ColI
14、iSions),但除此之外就没有其他被发现的加密后结果了。VanOorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-forcehashfunction),而且他们猜想一个被设计专门用来搜索MD5冲突的机器可以平均每24天就找到一个冲突,但单从1991年到2001年这10年间,竟没有出现替代MD5算法的新算法,我们可以看出这个瑕疵并没有太多的影响MD5的平安性。而所有这些都缺乏以成为MD5在实际应用中的问题,并且由于MD5算法的使用不需要支付任何版权费用,所以在一般的情况下,MD5可以算是比拟平安的了。1.2 选题意义随着网络技术的广泛应用,网络信息平安越来越引起
15、人们的重视。最初的计算机应用程序通常没有或很少有平安性,那是因为当时的系统是专属和封闭的,简单地说,计算机之间虽然也交换数据和信息,但形成的网络完全在组织控制之下。在那个时候,计算机之间通信的协议也是不公开的,因此,别人很难访问交换的信息。同时,因为当时信息平安并不是个重要问题,所以导致了很多人都忽略了数据的平安性,直到后来人们真正的认识和了解到数据的重要性。而选该毕业设计,主要是针对数据在存储的时候存在大量的平安问题,并且在现有MD5加密算法根底上,提出了一种数据存储加密策略。同时,针对md5算法而进行进一步的了解和研究。1.3 选题背景现阶段,信息平安性已成为全社会共同关心问题,密码学研究
16、也越来越被人们所关注。密码学主要研究的是通讯保密。近年来,密码学研究之所以十分活泼,主要原因是它与计算机科学的蓬勃开展息息相关。由于公共和私人部门的一些机构越来越多的应用电子数据处理,将数据存储在数据库中,因此防止非法泄露,删除,修改等是必须重视的问题。对数据进行加密能够防止他人盗取需要保密的信息,但这只是解决了一方面的问题,至于如何防止他人对重要数据进行破坏,如何确定交易者的身份,以及如何防止日后发生纠纷时交易者抵赖,还需要采取其它的手段,这一手段就是数字签名。数字签名技术实际上是在数据加密技术根底上的一种延伸应用。数字签名经常和单向散列(HaSh)函数一起使用,而单向散列(HaSh)函数是
17、现代密码学的核心。最常见的散列算法有MD5,SHA和Snefru,MD5是当今非常流行的优秀的典型Hash加密技术。本毕业设计主要是对MD5算法进行研究,并在此根底上编程实现MD5算法函数,并实现封装;开发一个简单的数据存储程序验证算法的正确性和可用性。2相关理论根底2.1 单向散列函数单向散列函数也称HaSh(哈希)函数。它是现代密码学的核心。散列函数一直在计算机科学中使用,散列函数就是把可变的输入长度串转换成固定长度输出值(叫做散列值)的一种函数。而单向散列函数是在一个方向上工作的散列函数,从预映射的值很容易计算出它的散列值,但要使它的散列值等于一个特殊值却很难。散列函数是公开的,对处理过
18、程并不保密,单向散列函数的平安性是它的单向性,其输出不依赖于输入。平均而言,预映射值的单个位的改变,将引起散列值中一半位的改变。一个散列值,要找到预映射的值,使它的值等于的散列值在计算上是不可行的,可把单向散列函数看作是构成指纹文件的一种方法。如果你验证某人持有一个特定的文件(你同时也持有该文件),但你不想他将文件传给你,那么,就要通知他将该文件的散列值传给你,如果他传送的散列值是正确的,那么可以肯定他持有那份文件。2.1.1 单向散列函数的根本原理单向散列函数H(M)是对一个任意长度的消息M进行运算。返回一个固定长度的值h。h=H(M)其中h的长度为m。输入为任意长度且输出为固定长度的函数有
19、很多种,但意向散列函数具有使其单向的如下特性:1)给定值M,可以很方便地计算出h值。2)给定h,根据H(M)=h计算M很难。3)给定M,要找到另一那么消息M,并使得H(m)=H(m)很难。也就是说,如果某个入侵者想要获得一那么消息,他必须破坏掉每个运用单向函数的协议的平安性,因为单向性函数的关键在于产生M的一个唯一的消息摘要。事实上,单向散列函数是建立在压缩函数的思想根底之上的。单向散列函数的输出值为一个长度为n的散列值,该长度比输入值的长度In要小很多,即nH,函数go同时该散列值又将作为下一步运算的输入值之一,由此推算可知,整个消息的散列值n即为最后一个消息片段经计算所得的散列值。这样,我
20、们最终得到的将是一个固定长度的函数值。2.1.2 散列值的长度我们都知道,散列值越长那么平安性越好,MD5算法就是单向散列函数产生128位的散列值,以此保证了它的平安性,以下即为生成一个长散列值的方法:1)运用单向散列函数生成一那么消息的散列值。2)将该散列值附于消息之后。3)产生包含散列值和消息在内的一连串的数值的散列值。4)将第一步产生的散列值与第三步产生的散列值组合起来生成一个更大的散列值。5)重复1)至3)步假设干次。2.2 MD5算法的根本原理MD5算法以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由4个32位分组组成,将它们级联形成一个128位散列值。
21、第1步:填充MD5的第1步是在原消息中增加填充位,目的是使原消息长度等于一个值,即比512的倍数少64位。例如,如果原消息长度为100O位,那么要填充472位,使消息长度为1472位,因为64+1472=1536,是512的倍数(1536=512*3)。这样,填充后,原消息的长度为448位(比512少64),960位(比1024少64位),1472位(比1536少64位),等等。图2填充过程填充对用一个1位和多个0位进行填充。如果消息长度已经是448,那么要填充512位,使长度变成960位。因此,填充长度为1512的值。图2显示了填充过程。第2步:添加长度增加填充位后,下一步要计算机消息原长,
22、将其加进填充后的消息末尾。先计算消息长度,不包括填充位(即增加填充位前的长度)。例如,如果原消息为100O位,那么填充472位,使其变成比512的倍数(1536)少64位,但长度为1000,而不是1472o这个消息原长表示为64位值,添加到加进填充后的消息末尾,如图3所示。如果消息长度超过2*位(即64位无法表示,因为消息太长),那么只用长度的低64位,即等于计算lengthmod24o我们看到,这时消息长度为512的倍数,成为要散列的消息。图3添加长度第3步:将输入分成512位的块下面要将输入分成512位的块,如图4所示。图4将输入分成512块第4步:初始化链接变量第4步要初始化四个链接变量
23、分别称为A,B,C,D,它们都是32位的数字,这些链接变量的初始十六进制值如表1所示,低的字节在前面。表1链接变量注意低位的字节在前面指的是LittleBndian平台上内存中字节的排列方式,而在程序中书写时,要写成:A=0x01234567B=0x89abcdefC=0xfedcba98D=0x76543210第5步:处理块初始化之后,就要开始实际算法了。这是个循环,对消息中的多个512位块运行。5.1步:将四个链接变量复制到四个变量a,b,c,d中,使a=A,b=B,c=Cfd=D,如图5所示,图5将四个链接变量复制到四个变量中实际上,这个算法将a,b,c,Cl组合成128位存放器(ab
24、ed),存放器(abed)在实际算法运算中保存中间结果和最终结果,如图6所示。图6链接变量抽象视图5.2步:将当前512位块分解为16个子块,每个子块为32位,如图7所示。图7将当前512块分解为16个子块5.3步:主循环有四轮,每轮很相似。每一轮的操作,都要处理一个块中的16个子块。每一轮的输入如下:(a)16个子块;(b)变量a,b,c,d;(C)常量t,如图8所示。图8每一轮处理这四轮中的第1步进行不同处理,其他步骤是相同的。一每一轮有16个输入子块M0,Ml,M15,或表示为Mi,其中i为115。我们知道,每个子块为32位。一T是个常量数组,包含64个元素,每个元素为32位。我们把数组
25、t的元素表示为tl,t2,t64,或ti,其中i为164。由于有四轮,因此每一轮用64个t值中的16个。下面总结这四轮的迭代。每一轮输出的中间和最终结果复制到存放器abed中,注意,每一轮有16个存放器。D首先对b,c,d作一次非线性函数运算,这个运算在四轮中不同。2)变量a加进第1步的输出(即存放器abed)o3)消息子块Mi加进第2步的输出(即存放器abed)o4)常量ti加进第3步输出(即存放器abed)o5)第4步的输出(即存放器abed)循环左移s位。6)变量b加进第5步输出(即存放器abed)o7)第6步的输出成为下一步的新abedo图9和图10显示了MD5操作过程。图9MD5主循
26、环图10MD5的一个执行过程以下是每次操作中用到的四个线性函数(每轮一个),简单的说,就是布尔运算。F(x,y,z)=(x&y)|(x)&z)G(x,y,z)=(x&z)|(y&(z)H(x,y,z)=xyzI(x,y,z)=yNx(z)(&是与,I是或,、是非,、是异或)这些函数是这样设计的:如果X,y和Z的对应位是独立和均匀的,那么结果的每一位也是独立和均匀的,函数F是按逐位方式操作;如果X,那么Y,否那么Z,函数H是逐位奇偶操作。设Mi表示消息的第i个子分组(从0到15)。S表示循环左移S位,那么四种操作为:FF(a,b,c,d,Mi,s,ti)表示a=b+(a+(F(b,c,d)+Mi
27、ti)s)GG(a,b,c,d,Mi,s,ti)表示a=b+(a+(G(b,c,d)+Mi+ti)s)HH(a,b,c,d,Mi,s,ti)表示a=b+(a+(H(b,c,d)+Mi+ti)s)11(a,b,c,d,Mi,s,ti)表示a=b+(a+(I(b,c,d)+Mi+ti)s)这四轮(64步)是:第一轮FF(a,b,c,d,Mo,7,Oxd76aa478)FF(d,a,b,c,M1,12,0xe8c7b756)FF(c,d,a,b,M2,17,0x242070db)FF(b,c,d,a,M3,22,Oxclbdceee)FF(a,b,c,d,M1,7,0xf57c0faf)FF(d,
28、a,b,c,M5,12,0x4787c62a)FF(c,d,a,b,M6,l7,0xa8304613)FF(b,c,d,a,M7,22,0xfd469501)FF(a,b,c,d,Mx,7,0x698098d8)FF(d,a,b,c,M9,l2,0x8b44f7af)FF(c,d,a,b,Ml0,l7,0xffff5bb1)FF(b,c,d,a,Mu,22,0x895cd7be)FF(a,b,c,d,Ml2,7,0x6b901122)FF(d,a,b,c,M%12,0xfd987193)FF(Cda,b,Mm,17,0xa679438e)FF(b,c,d,a,M15,22,0x49b40821
29、)第二轮GG(a,b,c,d,Ml,5,0xf61e2562)GG(d,a,b,c,M6,9,0xc040b340)GG(c,d,a,b,Mn,14,0x265e5a51)GG(b,c,d,a,Mo,20,0xe9b6c7aa)GG(a,b,c,d,Ms,5,0xd62fl05d)GG(d,a,b,c,M,9,0x02441453)GG(C,d,a,b,M5,l4,0xd8a1e681)GG(b,c,d,a,M,20,0xe7d3dbc8)GG(a,b,c,d,M9,5,0x2Ielcde6)GG(d,a,b,c,M11,9,0xc33707d6)GG(c,d,a,b,M,14,0xf4d50
30、d87)GG(b,c,d,a,Ms,20,0x455al4ed)GG(a,b,c,d,Mt,5,0xa9e3e905)GG(d,a,b,c,M2,9,0xfcefa3f8)GG(c,d,a,b,M7,14,0x676f02d9)GG(b,c,d,a,M1,20,0x8d2a4c8a)第三轮HH(a,b,c,d,M5,4,0xfffa3942)HH(d,a,b,c,M8,H,0x877lf681)HH(c,d,a,b,Mhl6,0x6d9d6122)HH(b,c,d,a,M,23,0xfde5380c)HH(a,b,c,d,Mh4,0xa4beea44)HH(d,a,b,c,M4,ll,0x4d
31、becfa9)HH(c,d,a,b,M7,16,0xf6bb4b60)HH(b,c,d,a,Mo,23,0xbebfbc70)HH(a,b,c,Mi3,4,0x289b7ec6)HH(d,a,b,c,M0,ll,0xeaal27fa)HH(c,d,a,b,M3,l6,0xd4ef3085)HH(b,c,d,a,M6,23,0x04881d05)HH(a,b,c,dM,4,0xd9d4d039)HH(d,a,b,c,M12,lI,xe6db99e5)HH(c,d,a,b,M15,l6,OxIfa27cf8)HH(b,c,d,a,M2,23,0xc4ac5665)第四轮II(a,b,c,d,Mo,
32、6,Oxf4292244)II(d,a,b,c,M7,l0,0x432aff97)11(c,d,a,b,Mbl5,0xab9423a7)11(b,c,d,a,M5,2l,0xfc93a039)11(a,b,c,d,M12,6,0x655b59c3)11(d,a,b,c,M3,l0,0x8f0ccc92)11(c,d,a,b,Mo,15,0xffeff47d)11(b,c,d,a,M,2l,0x85845dd1)11(a,b,c,d,M8,6,0x6fa87e4f)11(d,a,b,c,Mi5,10,0xfe2ce6e0)II(c,d,a,b,M6,l5,0xa3014314)11(b,c,d,
33、a,M%21,0x4e08llal)II(a,b,c,d,M4,6,0xf7537e82)II(d,a,b,c,Mll,10,0xbd3ad235)II(c,d,a,b,M2,l5,0x2ad7d2bb)11(b,c,d,a,M9,2l,0xeb86d391)所有这些完成之后,将A,B,C,D分别加上a,b,c,d,然后用下一分组数据继续运行算法,最后MD5算法产生128位的输出是A,B,C和D的级联,其中低字节始于A,高字节终于D。至此整个MD5算法处理结束。2.3MD5的应用1)MD5在电子商务领域内的应用在很多电子商务和社区应用中,管理用户的Account是一种最常用的基木功能,尽管很多
34、APPIiCatiOnSerVer提供了这些根本组件,但很多应用开发者为了管理的灵活性还是喜欢采用关系数据库来管理用户,懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中,因此这些用户的密码对软件开发者或系统管理员来说可以说毫无保密可言。2)MD5在加密和解密技术上的应用MD5还广泛用于加密和解密技术上。比方在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比拟,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况小就可以确定
35、用户登录系统的合法性,这不但可以防止用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8个字节,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数那么是P(62,1)P(62,2)+p(62,8),那也已经是一个天文数字了,存储这个字典就需要TB级的磁盘阵
36、列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNlX系统中,这也是为什么UNIX系统比一般操作系统更为巩固一个重要原因。3)MD5在注册信息中的应用MD5算法的不可逆性在实际应用中产生什么作用呢。这里我举一个例子:我们到银行取钱输入密码时,一般是源码被存近了银行的主机,如果银行的内部人员或黑客侵入到数据库,很轻易地就窃取了你的源码。如果输入源码后,立即用MD5加密,把所得密文储存进系统。而以后用户每次仍是自己输源码,但我们只需比对MD5密文即可。系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。由于MD5不可逆,所以
37、MD5密文无论被谁知道都无法窃得源码。现在大多数网站的数据库系统储存密码时都是使用MD5算法加密。4)MD5在PGP中的应用PGP是一个基于RSA公钥加密体系的邮件加密软件。可以用它对你的邮件保密以防止非授权者阅读,它还能对你的邮件加上数字签名从而使收信人可以确信邮件是你发来的。假设A要向B发一封信。PGP用MD5来计算邮件文摘,A用自己的私钥将邮件文摘加密,附一加在邮件上,再用B的公钥将整个邮件加密。这样这份密文被B收到以后,B用自己的私钥将邮件解密,得到A的原文和签名,B的PGP也从原文计算出一个128位的文摘来,再用A的公钥解密签名得到的数比拟,如果符合就说明这份邮件确实是A寄来的。这样
38、两个要求都得到了满足。5)MD5算法在保护文件系统完整性中的应用MD5算法在文件系统完整性保护中的应用是利用它构造完整性检查程序,对文件系统的完整性进行分析和检查,监视文件系统的非授权或不期望的改变,检测和通知系统管理员改变的、增加的和删除的文件。我们从着重考虑承当关键任务的UNIX主机上文件系统完整性保护的角度出发,利用MD5报文摘要算法设计并实现了一个类Tripwire的文件系统完整性检查程序MAFFIC(MD5AlgorithmForFileIntegrityCheCker)。其基木原理是,文件系统完整性检查程序(MAFFlC)采用的技术核心就是对每个要监控的文件利用MD5算法产生一个数
39、字指纹并保存下来,如果文件的数字指纹与保存的数字指纹不一致,那么这个文件必定被改动过了,当MAFFIC运行在数据库生成模式时,根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件结合MD5加密手段生成相应数字指纹,并将这些结果保存在自己的数据库中,当疑心系统被入侵时,由MAFFlC根据先前生成的数据库文件来做一次数字指纹的对照,如果文件被替换,那么与MAFFIC数据库内相应数字指纹不匹配,这时它报告相应的文件被更改,管理员就明白系统遭受了入侵。6) MD5在数据库中的应用网站往往将用户的账号,密码等信息使用非加密的方式存到数据库,账号使用类为VarChar的UserCount字段
40、同样,密码也是采用VarChar的password字段,但如果采用加密方式存储密码信息,就必须改变密码字段password的类型为了6位二进制方式,但MD5是单次加密算法,加密以后的信息不可以解密,所以如果用户丧失密码,任何人很难找到用户原来的密码。这时,网站失去了很重要的功能,就是获取已忘记的密码的功能。另外采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册。此外,MD5还应用于802.1认证中,PAP-MD5认证采用MD5算法,用户密码不以明文方式在网上传输,从而保证了认证信息的平安。另外,大家比拟熟悉的即时通信软件MylM也使用MD5算法。利用MD5算法来进行文件校验
41、的方案,被大量应用在软件下载站点、论坛数据库和系统文件平安等方面。3需求分析及设计方案设计中要求实现局部功能:MD5算法函数库;数据加密;数据存储等,最后将加密后的数据存放在ACCESS数据库中。6.1 主要功能模块6.1.1 数据加密主要是通过MD5算法的调用,对用户密码进行加密,使得加密前和加密后的密码都一起显示出来。6.1.2 数据存储主要是将加密前和加密以后的数据存入到ACCESS数据库中。6.1.3 数据库设计表2字段值设置6.2 主要流程图图11主功能流程图4MD5算法的DLL封装DLL是DynanliCLinkLibrary的缩写,翻译为动态链接库,是WindOWS采用的一种极其
42、重要的技术。DLL本身采用内存共享机制。动态链接库是一些过程和函数及资源(包括:Bitmap、Ieon等)的集合,是一种二进制文件,它能够同时被假设干个应用程序或其他DLL所调用。当某个DLL被调用的时候,Win32系统便在内存中建一个相应的副本及一个计数器,如有多个应用程序同时调用这个DLL时,变化的只是计数器的值,并不增加系统开销,当计数器为0的时候,系统便释放这个DLL所占用的资源。一个独立的DLL程序本身即为可执行程序,但它一般不能单独执行,它和普通可执行程序的区别就在于它并不主动获取CPlK中央处理器的简称)效劳,通常是被其他真正的可执行程序或DLL所调用。4.1 加载时动态链接在加
43、载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。4.2 运行时动态链接在运行时动态链接中,应用程序调用LOadLibra”函数或LOadLibraTyEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetPrOCAddreSS函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,无需使用导入库文件。4.3 DLL封装情况主要是把定义申明导出为DLL,所以DLL的生成代码如
44、下:同时需要注意的是,在调用的时候要记得把先前生成的MD5.dll及MD5.Iib拷到源程序目录下,这样才能够保证运行正确不出错。特别注意是:MD5CTX是MD5.DLL里定义的类,然后要用这个类生成自己的对象。也就是说它主要就是把类实例化,然后产生了对象后再调用了对象,然后就可以实现MD5加密了。#ifdefUSINGMPoRT#defineDLL_EXP0RT_declspec(dllimport)#else#defineDLL_EXPORT_declspec(dllexport)#endif#ifndef_LGY_MD5_H#define_LGY_MD5_H*MD5Class.*/cla
45、ssDLL_EXP0RTMD5_CTXpublic:MD5_CTX();virtual-MD5.CTX();voidMD5Update(unsignedchar*input,unsignedintinputLen);voidMD5Final(unsignedchardigest16);private:unsignedlongintstate4;unsignedlongintCOUnt;unsignedcharbuffer64;unsignedcharPADDING64;private:voidMD5Init();voidMD5Transfbrm(unsignedlongintstate4,un
46、signedcharblock64);voidMD5_memcpy(unsignedchar*output,unsignedchar*input,unsignedintlen);voidEncode(unsignedchar*output,unsignedlongint*input,unsignedintlen);voidDecode(unsignedlongint*output,unsignedchar*input,unsignedintlen);voidMD5_memset(unsignedchar*output,intvalue,unsignedintlen);;#endif下面为局部调
47、用代码:MD5_CTXmd5T;unsignedchardigest16;md5T.MD5Update(unsignedchar*)pBuf,iTotal);md5T.MD5Final(digest);5具体设计流程及实现5.1 读取的设计和实现主要是在界面里显示数据库的内容,并把密码加密,显示加密后的密码。主要流程如下:图12读取功能的实现流程图5.2 插入的设计和实现5.3 修改的设计和实现5.4 删除的设计和实现需要先读取数据,然后才能进行删除,数据被删除后,界面里不再显示,数据库里也不再显示,在界面和数据库中只会显示还未被删除的数据。6调试与分析6.1 概述该设计主要是针对MD5算法的应用和理解,对算法进行研究和实现,并在此根底上编程实现MD5算法函数和封装;同时开发一个简单的数据存储程序验证算法的正确性和可用性。最后是将数据存入到ACCESS数据库中。6.2 测试分析报告经过测试和调试,一切都运行正常,能实现读取,插入,修改,删除,关于,退出功能。下列图为一读取功能的实现图:图16运行结果图结论