我之所以问这个问题,是因为我这两天读了很多关于加密 AES 加密的文章,就在我以为我明白了的时候,我意识到我根本没有明白。
这篇文章是与我的问题最接近的一篇,我有完全相同的问题,但尚未得到解答:
CryptoJS AES 加密与 JAVA AES 解密值不匹配
我尝试过很多方法,但都没有做对。
首先
我得到了已经加密的字符串(我只得到了代码来看看他们是如何做到的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都没有用。
Second
我确实可以访问密钥并且可以修改它(因此如果需要,可以选择调整长度)。
加密是在 CryptoJS 上完成的,他们将加密的字符串作为 GET 参数发送。
GetParamsForAppUrl.prototype.generateUrlParams = function() {
const self = this;
return new Promise((resolve, reject) => {
const currentDateInMilliseconds = new Date().getTime();
const secret = tokenSecret.secret;
var encrypted = CryptoJS.AES.encrypt(self.authorization, secret);
encrypted = encrypted.toString();
self.urlParams = {
token: encrypted,
time: currentDateInMilliseconds
};
resolve();
});
};
我可以使用 CryptoJS 在 javascript 上轻松解密:
var decrypted = CryptoJS.AES.decrypt(encrypted_string, secret);
console.log(decrypted.toString(CryptoJS.enc.Utf8));
但出于安全原因,我不想在 Javascript 上执行此操作,因此我尝试在 Java 上解密:
String secret = "secret";
byte[] cipherText = encrypted_string.getBytes("UTF8");
SecretKey secKey = new SecretKeySpec(secret.getBytes(), "AES");
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
String myDecryptedText = = new String(bytePlainText);
在我对自己在做什么有任何想法之前,我尝试了base64解码,添加了一些IV和我读过的很多东西,当然它们都不起作用。
但是当我开始理解我在做什么之后,我写了上面那个简单的脚本,并在帖子中得到了同样的错误:AES 密钥长度无效
我不知道从这里该去哪里。阅读了很多相关内容后,解决方案似乎是散列或填充,但我无法控制加密方法,所以我无法真正散列秘密或填充它。
但正如我所说,我可以更改密钥,以便它可以匹配某些特定长度,并且我已经尝试更改它,但当我在这里在黑暗中拍摄时,我真的不知道这是否是解决方案。
所以,我的问题基本上是,如果我得到加密的字符串(在 javascript 中,就像第一个脚本一样)和密钥,有没有办法解密它(in Java)?如果可以的话,该怎么办呢?