下面的截图是反编译后的一段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"};