CryptoJS AES 加密和 Java AES 解密

2022-09-02 02:19:15

我只是问这个,因为我已经阅读了许多关于加密AES加密的帖子2天,就在我以为我得到了它时,我意识到我根本没有得到它。

这篇文章是最接近我的问题,我有完全相同的问题,但它没有得到解答:

CryptoJS AES 加密和 JAVA AES 解密值不匹配

我尝试过以多种方式做到这一点,但我没有做对。

首次关闭

我得到了已经加密的字符串(我只得到了代码来看看他们是如何做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都没有那么有用。

第二

我确实可以访问密钥,并且可以对其进行修改(因此,如有必要,可以选择调整长度)。

加密是在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中,就像第一个脚本一样)和密钥,有没有办法解密它(在Java中)?如果是这样,该怎么做?


答案 1

免责声明:除非您了解加密概念,包括链接模式,密钥派生功能,IV和块大小,否则不要使用加密。不要推出自己的安全方案,而是坚持使用已建立的安全方案。仅仅引入加密算法并不意味着应用程序变得更加安全。

CryptoJS实现了与OpenSSL相同的密钥派生功能,并且具有相同的格式将IV放入加密数据中。因此,所有处理OpenSSL编码数据的Java代码都适用。

给定以下 Javascript 代码:

var text = "The quick brown fox jumps over the lazy dog. 						

答案 2

推荐