我只是问这个问题是因为我已经阅读了许多有关加密货币AES加密的帖子,但就在我认为我懂了时,我意识到我根本不懂。
这篇文章是与我的问题最接近的,我完全有相同的问题,但没有得到答案:
CryptoJS AES encryption and JAVA AES decryption value mismatch
我尝试用许多种方法来做这件事,但都没有做对。
首先
我得到了已加密的字符串(我只是获取了代码来看他们是如何做的),因此修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是很有用。
其次
我确实可以访问秘密密钥并进行修改(因此如果需要,可以调整长度)。
加密是在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和我读到的很多东西,当然都没有起作用。
但是当我开始有点理解我在做什么时,我编写了上面那个简单的脚本,并在post中得到了相同的错误:无效的AES密钥长度
我不知道接下来该怎么办。 在阅读了很多关于此的文章之后,解决方法似乎是哈希或填充,但我无法控制加密方法,因此我实际上无法散列秘密或填充它。
但是正如我所说,我可以更改秘密密钥以匹配某些特定的长度,并且我已经尝试更改它,但由于我在摸索,我真的不知道这是否是解决方案。
所以,我的问题基本上是,如果我获得了加密字符串(在JavaScript中像第一个脚本一样)和秘密密钥,是否有一种方法可以对其进行解密(在Java中)? 如果有,如何做到?
String
不是二进制数据的容器。 - user207421