MD5一般用户文件完整性的校验,也有用来做密码加密的。
想要破解MD5,因其本身的算法不可逆,故只能使用穷举法,也就是不断拼字符串加密和已知的MD5字符串进行比对,这是一个相当大的工程,需要庞大的数据基础。
package endecryptimport 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{
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 = 0i <charArray.lengthi++)
byteArray[i] = (byte) charArray[i]
byte[] md5Bytes = md5.digest(byteArray)
StringBuffer hexValue = new StringBuffer()
for (int i = 0i <md5Bytes.lengthi++){
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 = 0i <a.lengthi++){
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)))
}
}
%ユZメΜ@ヌmq<ュ
这个很正常。加密是将字节按照一定的规则进行了转换,转换后出什么样的怪字符都是正常的。
一般的做法是将加密后的byte数组转换为十六进制的字符串。
---------------------------------------------------------------------------------------------------------
import java.security.MessageDigest
public class Main {
public static void main(String[] args) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5")
byte[] b = md.digest("12345678".getBytes())
System.out.println(new String(b))
String result = ""
for (int i = 0i <b.lengthi++) {
String tmp = Integer.toHexString(b[i] &0xFF)
if (tmp.length() == 1) {
result += "0" + tmp
} else {
result += tmp
}
}
System.out.println(result)
}
}
运行结果
-------------------------------
%ユZメΜ@
ヌmq<ュ
25d55ad283aa400af464c76d713c07ad