实验四:密码学MD5实验报告专业:计算机科学与技术班级:2015级姓名:孟亚超学号:20150402201006实验名称密码学MD5实验目的自学md5原理,编写MD5算法,了解算法工作过程实验原理MD5是一个不可逆的算法,是单向的,通常用于签名验证和一些不需要还原原文的算法,这种算法加密后就不能还原回原文,这种算法还原回原文有无穷种原文,所以理论上是不可能被还原的注意事项1、MD5不可能被还原2、MD5算法加密后的长度是固定的,长度为32位实验环境说明Window7JavajdkEclipseforEE实验步骤源代码packagecom.topcheer;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Scanner;publicclassEXEMD5{/*设置MD5值输出为16进制(从0到F)*/protectedstaticcharhexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*获取MD5算法,并判断是否存在MD5算法(判断是否正确导入了加密库)*/protectedstaticMessageDigestmessagedigest=null;static{try{messagedigest=MessageDigest.getInstance(MD5);}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}}/*计算文件(包括EXE文件)MD5值的算法*/publicstaticStringgetFileMD5String(Filefile)throwsIOException{FileInputStreamin=newFileInputStream(file);FileChannelch=in.getChannel();MappedByteBufferbyteBuffer=ch.map(FileChannel.MapMode.READ_ONLY,0,file.length());messagedigest.update(byteBuffer);returnbufferToHex(messagedigest.digest());}/*将字节数组转换为字符串类型*/privatestaticStringbufferToHex(bytebytes[]){returnbufferToHex(bytes,0,bytes.length);}/*将字节数组从第m位元素到第n位元素的部分转换成字符串类型*/privatestaticStringbufferToHex(bytebytes[],intm,intn){StringBufferstringbuffer=newStringBuffer(2*n);intk=m+n;for(intl=m;lk;l++){appendHexPair(bytes[l],stringbuffer);}returnstringbuffer.toString();}privatestaticvoidappendHexPair(bytebt,StringBufferstringbuffer){charc0=hexDigits[(bt&0xf0)4];charc1=hexDigits[bt&0xf];stringbuffer.append(c0);stringbuffer.append(c1);}publicstaticvoidmain(String[]args)throwsIOException{System.out.println(请选择你要计算MD5值的应用程序文件!);System.out.println(【1】erase.exe【2】hello.exe);intchoose=newScanner(System.in).nextInt();Fileexe=null;if(choose==1){exe=newFile(./src/erase.exe);}elseif(choose==2){exe=newFile(./src/hello.exe);}else{System.out.println(非法输入,请重新运行程序!);System.exit(0);}longbeginTime=System.nanoTime();Stringmd5=getFileMD5String(exe);longendTime=System.nanoTime();doubletime=endTime-beginTime;System.out.println(【运行结果】);System.out.println(选择的文件是:+exe.getName());System.out.println(该文件MD5值:+md5);System.out.println(计算MD5用时:+(time/1000000)+毫秒);}}程序运行结果截图实验结果分析我们不难发现,这两个EXE文件虽然内容不同,但是MD5值却是相同的!MD5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。MD5算法具有以下特点:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。2、容易计算:从原数据计算出MD5值很容易。3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。