密码学实验总结 [密码学md5实验报告]

  实验四:密码学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" 十六进制数字串)。

推荐访问:密码学 实验 报告 md5