MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被普遍使用的密码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。html
将数据(如一段文字)运算变为另外一固定长度值,是散列算法的基础原理。java
1996年后被证明存在弱点,能够被加以破解,对于须要高度安全性的数据,专家通常建议改用其余算法,如SHA-2。2004年,证明MD5算法没法防止碰撞(collision),所以不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。算法
Figure 1. 一个MD5运算— 由相似的64次循环构成,分红4组16次。F 一个非线性函数;一个函数运算一次。Mi 表示一个 32-bits 的输入数据,Ki 表示一个 32-bits 常数,用来完成每次不一样的计算。安全
MD5是输入不定长度信息,输出固定长度128-bits的算法。通过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与连接变量进行循环运算。得出结果。app
package com.Test; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 采用MD5加密解密 * @author tfq * @datetime 2011-10-13 */ public class MD5Util { /*** * MD5加码 生成32位md5码 */ public static String string2MD5(String inStr){ MessageDigest md5 = null; try{ //引用 java.security.MessageDigest公共类 // getInstance("MD5")方法 设置加密格式 md5 = MessageDigest.getInstance("MD5"); //此句是核心 }catch (Exception e){ System.out.println(e.toString()); e.printStackTrace(); return ""; } char[] charArray = inStr.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++) byteArray[i] = (byte) charArray[i]; byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++){ int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) hexValue.append("0"); hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } /** * 加密解密算法[可逆] 执行一次加密,执行两次解密 */ public static String convertMD5(String inStr){ char[] a = inStr.toCharArray(); for (int i = 0; i < a.length; i++){ a[i] = (char) (a[i] ^ 't'); } String s = new String(a); return s; } // 测试主函数 public static void main(String args[]) { String s = new String("tangfuqiang"); System.out.println("原始:" + s); System.out.println("MD5后:" + string2MD5(s)); System.out.println("加密的:" + convertMD5(s)); System.out.println("解密的:" + convertMD5(convertMD5(s))); } }
ヽ( ̄▽ ̄)ノ开箱即食函数