首页 > 编程知识 正文

md5底层原理,md5作用

时间:2023-05-05 20:20:02 阅读:274008 作者:2916

文章目录 1.MD5加密简介2.MD5加密原理3.MD5加密相关代码4.MD5 不是加密算法

1.MD5加密简介 MD5加密简介
哈希算法,又叫散列算法,是把任意数据转换为定长的算法统称。而MD5实质上,也是一种哈希算法,它的输出则是生成一个128位输出结果。若输入两个不同的明文,则会输出两个不相同的输出值,且根据输出值,不能得到原始的明文,其过程是不可逆的。 2.MD5加密原理 MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。在MD5算法中,首先需要对信息进行填充,填充方法如下:先在信息后面填充一个1,之后就是无数个0,直到使其字节长度对512求余数的结果等于448,即(n*512) + 448 ,为什么要是余数为448呢,因为剩下的512-448 等于64位 是用于表示填充前的信息长度。加上剩下的64位,即(n+1)*512,长度刚刚好是512的整数倍数。然后就与链接变量进行循环运算,得出结果。MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。当设置好这四个链接变量后,就开始进入算法的四轮循环运算。具体内部怎么运算,是关于数学方面的,有兴趣的同学可以自行去了解下,这里不进行更加多的解释。 3.MD5加密相关代码

下面是java自带jar工具MessageDigest实现

import java.security.MessageDigest;public class T2 { public static String Test_MD5(String str) { try {   //MessageDigest类是一个加密算法的抽象类,需要先获取它的对象   MessageDigest md = MessageDigest.getInstance("MD5"); //获取MD5的对象。      //getBytes(),把字符串转为byte[]数组。   //是对信息的填充和打乱   md.update(str.getBytes());      //对摘要后的信息进行哈希计算得到一个16字节的字节数组   byte b[] = md.digest();   //System.out.println("b的长度为:" + b.length);//16      //String与StringBuffer它们都可以存储和操作字符串,StringBuffer操作字符串要比String性能好    StringBuffer buf = new StringBuffer();      int i;      //为了得到定长的数据,因此还需要对数据进行处理,我们知道Byte是8位即一字节,先转换为int整型再转为16进制时一般是会转换为两位的16进制。   //0.为什么要转换为整型呢,因为java 中对byte的所有运算操作均会是首先将byte转化为int, 再行运算。   //1.为什么要转为16进制,因为MD5的输出是16进制,为什么呢,因为原本MD5是输出128位,但是128位太长且不易存储,即转换为32位的16进制。32*4=128.   //2.我们知道Byte的范围是在[-128,127],即在byte转化为整型的时候会出现负数,而我们输出的结果不该有负数,即我们需要对于负数的值转化为正数。   //3.对于第二点的方法,就是判断若为负数,则需要对其  加256 为什么是256呢,这又是一个大的话题,请看另一篇博客:   //  https://blog.csdn.net/xueyijin/article/details/105290824   //4.还有一种情况,如果数值小于16,那么只会产生一位16进制,而我们需要得到的是2位的16进制,因此需要进行补0,如 若值为 15,则对应16进制应该写出:0F   for(int offset = 0; offset < b.length; offset++) {        //先把 byte转化为int。    i = b[offset];        //这种情况是i为负数情况    if(i < 0) {     i += 256; //相当于  i = i & 0xff;为什么呢,请看上面第三点的博客。    }       //这种情况是i小于16,只会有一位16进制,则我们自己补个0    if(i < 16) {     buf.append("0");    }    buf.append(Integer.toHexString(i));   }   str = buf.toString();   } catch (Exception e) {   e.printStackTrace();  }  //最后128位就变成了 32位的16进制,即32*4=128; return str;} public static void main(String[] arg) {  System.out.println("待加密内容为:  " + "adc");  System.out.println("加密后内容为:  " +Test_MD5("adc")); }}

4.MD5 不是加密算法 加密,是指对数据进行转换以后,数据变成了另一种格式,若拿到了解密方法,则可以把数据转换回来。而事实上,使用 加密算法 加密后的消息是完整的,并且基于解密算法后,可以恢复原始数据。而MD5算法 得到的消息是不完整的,并且无法通过摘要的数据也无法得到原始数据。MD5算法 对比 加密算法 缺少了解密过程,因此,MD5算法不是加密算法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。