2

所以我有一个我似乎无法解决的问题。我需要使用生成的哈希 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")));
}
4

1 回答 1

2

如果无法查看用于进行加密的代码,就无法确定您是否在做正确的事情。我在 Android 应用程序中有非常相似的代码,它运行良好。一个区别是我将 a 传递javax.crypto.spec.IvParameterSpecCipher.init(). 此外,Android Base64 类需要一个 flags 参数,decode()但我认为这不是你的问题。

您的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"));
于 2018-11-24T16:05:17.853 回答