MD5的全称是Message-Digest Algorithm 5,Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[] strTemp = s.getBytes();// 使用MD5创建MessageDigest对象
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;for (int i = 0; i < j; i++) {
byte b = md[i];
// System.out.println((int)b);
// 将没个数(int)b进行双字节加密
str[k++] = hexDigits[b >> 4 & 0xf];
str[k++] = hexDigits[b & 0xf];}//返回32位的字符串
System.out.println();return new String(str);
} catch (Exception e) {
return null;
}
}
验证:
public static void main(String[] args) {
System.out.println("caidao的MD5加密后:\n" + test_MD5.MD5("caidao"));
System.out.println("liusb的MD5加密后:\n" + test_MD5.MD5("liusb"));
}
输出结果:
caidao的MD5加密后:
cdd7b7420654eb16c1e1b748d5b7c5b8
baidu的MD5加密后:
bfe279945c6109d067bcd295b5189d86
/** * 加密解密算法 执行一次加密,两次解密 */
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后:" + test_MD5.MD5(s));
System.out.println("加密的:" + convertMD5(s));
System.out.println("解密的:" + convertMD5(convertMD5(s)));
}
验证结果:
原始:tangfuqiang
MD5后:20b75697d8bf931a6730662ae117c3bf
加密的:
解密的:tangfuqiang