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