当前位置:文档之家› 密码学MD5实验报告

密码学MD5实验报告

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