所以我有一个似乎无法解决的问题。我需要使用生成的哈希md5作为键来解码一些Base64文本。我已经写了这段代码。输出结果不可读。密钥的"freeforall"
和"validate"
是实际的密钥。
任何人都可以告诉我这段代码有什么问题吗?或者可能是我对问题的解释。
private String decrypt(String data, byte[] key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(Base64.decode(data));
return new String(original, "UTF-8").trim();
}
private byte[] getMD5(String value) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(value.getBytes("utf-8"), 0, value.length());
return md.digest();
}
public static void main(String[] args) {
String grupo0 = "r8Z48nEsKskL+9mOb9EQ519MLNjeFkcTQe3M4+XMdmkWZ+7F3o027zOwuMpyr1XQKFDSILDSUxUhAIoDW4QcnoA0um0BKs4sA/ZczucCAEjCpQmy4xR3o+xR1Ve3bNV6/X3hq98hrlCdycgEwprn8qvQRAHwpA1FqseBl2NCuo+vn5VZA0GHKnuNPiApjCMDo6qpTIELy9FB+2vWZwYprA==";
String grupoMenos1 = "fGpu3YkXGxTdVTeHhC2FZT9utUOGJgvvmPlzlEq39oSTc419ashyqmBvYGSC7BqRvXQ3Wx+i8C7jIiaBo9fXAd/JLed+T6XvlSkJfH+PGX8xi8tuD+OoLhaA102mscVSatsKtGTzOWAt17DzWeLe2QKXbClN+ElGSQaPBRD/aHpNQJNAMrUOUEgPDNjbb7HmlmOfFsCpQZOEFq+n2SOMpA==";
System.out.println(decrypt(grupo0, getMD5("freeforall")));
System.out.println(decrypt(grupoMenos1, getMD5("validate")));
}
答案 0 :(得分:2)
无法看到用于执行加密的代码,因此无法确定您是否做对了。我在Android应用程序中有非常相似的代码,并且工作正常。一个区别是我将javax.crypto.spec.IvParameterSpec
传递给Cipher.init()
。另外,Android Base64类为decode()
接受了flags参数,但我认为这不是您的问题。
您的getMD5()
函数中还存在一个小错误,但是这里不是问题,因为您的键是纯ASCII码。计算摘要时,应使用UTF-8字节数组的长度而不是原始字符串的长度。
md.update(value.getBytes("utf-8"), 0, value.length());
应该是:
byte [] valueBytes = value.getBytes("utf-8");
md.update(valueBytes, 0, valueBytes.length);
编辑:正如James K Polk所建议的,您可以这样做:
md.update(value.getBytes("utf-8"));