下面的截图是反编译后的一段md5的加密方法,能加密出32位的密码?
1(能,怎么用java实现)
2(不能,具体能加密出多少位的密码)
分数不够了只有这么多了
1(能,怎么用java实现)
2(不能,具体能加密出多少位的密码)
分数不够了只有这么多了
解决方案
10
md5 严格来说,应该叫hash函数,而不是加密函数
md5固定生成16字节的结果,可以转换成32位16进制的字符串
md5固定生成16字节的结果,可以转换成32位16进制的字符串
10
标准的md5处理后得到128 bit数据。所以digtest()返回的是一个长度为16的byte数组(16 * 8 = 128)。上面反编译出来的结果,应该不是一个通常计算md5的做法。通常的做法是,
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
上面的str是一个长度为32的byte数组,转成string得到长度为32的md5值,删除前8位、后位8位,可以得到16位的md5值。
///
10
public class MD5Util {
public final static String MD5(String s) {
try {
byte[] btInput = s.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
return sb.toString();
} catch (Exception e) {
return null;
}
}
}
或
使用之前的
char hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};