Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CryptoJS AES加密和Java AES解密_Java_Encryption_Cryptography_Cryptojs - Fatal编程技术网

CryptoJS AES加密和Java AES解密

CryptoJS AES加密和Java AES解密,java,encryption,cryptography,cryptojs,Java,Encryption,Cryptography,Cryptojs,我之所以问这个问题,是因为我已经读了很多关于加密AES加密的帖子两天了,就在我以为我得到了它的时候,我意识到我根本没有得到它 这篇文章与我的问题最为接近,我也有同样的问题,但没有得到回答: 我试过很多方法,但都做得不对 先发 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我没有那么大用处。 秒 我确实有权访问密钥,我可以修改它(因此,如果必要,可以选择调整长度)。 加密是在CryptoJS上完成的,它们将加密字符

我之所以问这个问题,是因为我已经读了很多关于加密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中)?如果是这样的话,怎么做?

在一个系统上加密,在另一个系统上解密时,系统默认值会左右你。如果任何系统默认值不匹配(通常不匹配),则解密将失败

每件事都必须是一个字节一个字节,两边都是一样的。实际上,这意味着双方都要指定所有内容,而不是依赖默认值。只有在两端使用相同的系统时,才能使用默认值。即使如此,最好精确地指定

密钥、IV、加密模式、填充和字符串到字节的转换在两端都需要相同。特别值得检查密钥字节是否相同。如果使用密钥派生函数(KDF)生成密钥,则该函数的所有参数都必须相同,因此必须精确指定

“无效AES密钥长度”很可能表明生成密钥时出现问题。您可以使用
getBytes()
。这可能是一个错误。您需要指定要获取的字节类型:ANSI、UTF-8、EBCDIC等等。字符串到字节转换的默认假设可能是导致此问题的原因。指定要在两端显式使用的转换。这样你就可以确保他们匹配


如果加密和解密的参数不完全匹配,则加密将失败。例如,即使密钥中存在一位差异也会导致其失败。

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

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

给定以下Javascript代码:


var text=“敏捷的棕色狐狸跳过了懒狗。Javascript端的秘密是什么样子的?它也是一个字符串吗?它是一个十六进制字符串,例如“34D3724F1A”“?
String
不是二进制数据的容器。我已经安装了JCE,并且我读了一些关于密钥大小的信息,我相信有办法将其升级到256,但我不介意大小,128是可以的。这看起来很有希望,明天会尝试一下,然后回复给你,谢谢。如果你不能更改数据的加密方式,那么你就不能选择密钥长度。我必须使用256位。好的,我下载了文件,备份了当前文件并替换了它们。我重新启动了应用程序,重新启动了计算机,但仍然得到:aesCBC.init(Cipher.DECRYPT_模式,key,iv)的非法密钥大小;您的无限强度管辖权策略似乎未正确安装。问一个单独的问题,特别是关于这个问题。你如何用java加密相同的数据,你能不能也发布加密。你能帮助我们吗,我们必须在ionic 3前端使用AES 256,并在java层进行解密。加密的数据无法解密。