当前位置: 首页 > 知识库问答 >
问题:

CryptoJS AES无法解密

邹弘
2023-03-14

我需要解密用AES加密的传入请求,我尝试使用共享示例但无法找到正确的参数集

  • 加密:AES/CBC/PKCS5添加AES/CBC/PKCS5
  • 初始化向量:长度为16的空字节数组
  • 测试密钥:1234567890123456
  • 纯文本:abcdefghigklmnopqrstuvwxyz0123456789
  • 加密:8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP VuJGePqIMv1uSaVErr

我使用next

const cryptkey = '1234567890123456';
const cleardata = "abcdefghigklmnopqrstuvwxyz0123456789";
const crypted = "8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP+VuJGePqIMv1uSaVErr";

var decrypt = CryptoJS.AES.decrypt(crypted, cryptkey, {
    iv: CryptoJS.enc.Hex.parse('0000000000000000'),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
var ddd = decrypt.toString(CryptoJS.enc.Utf8);
console.log(ddd);

每次我得到空字符串。我在哪里失败了?

------更新-----

已应用注释的新版本仍不起作用

const cryptkey = CryptoJS.enc.Utf8.parse('1234567890123456');
const crypted = CryptoJS.enc.Base64.parse("8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP+VuJGePqIMv1uSaVErr");

var decrypt = CryptoJS.AES.decrypt(crypted, cryptkey, {
    iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000'),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

共有3个答案

陶鹏
2023-03-14

这对我来说很有用,使用enc,而不仅仅是UTF8

const { AES, enc } = require('crypto-js')
const { decrypt, encrypt } = AES


const message = "Hi my friend"
const messageEncrypt = "oPVu8Dd8ERPIAWr+7rQzIQ=="
const key= "key123456"
const aesDecrypt = decrypt(messageEncrypt,key).toString(enc.Utf8)
console.log(aesDecrypt) // Hi my friend
舒枫涟
2023-03-14

您忘记了以64为基数解码cryted中的密文(我想你必须使用atob()来做到这一点)。您的IV也太小了,十六进制每字节取两个十六进制数。

何昆
2023-03-14

您必须首先解析UTF-8密钥:

const cryptkey = CryptoJS.enc.Utf8.parse('1234567890123456');

如果您不这样做,CryptoJS将假设它是一个密码并从中导出实际的密钥。

正如Maarten所指出的...

密文还必须从Base64解码:

const crypted = CryptoJS.enc.Base64.parse("8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP+VuJGePqIMv1uSaVErr");

请注意,解密程序需要一个CipherParams对象,您可以通过将〈code〉{ciphertext:crypted}传递给〈code〉decrypt函数来模拟该对象。或者,您可以依赖CryptoJS对Base64中的密文进行解码,然后按原样传入该字符串。

对于AES-CBC,IV必须为16字节长,如果编码为十六进制,则为32个字符:

CryptoJS.enc.Hex.parse('00000000000000000000000000000000')
const cryptkey = CryptoJS.enc.Utf8.parse('1234567890123456');
const crypted = CryptoJS.enc.Base64.parse("8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP+VuJGePqIMv1uSaVErr");

var decrypt = CryptoJS.AES.decrypt({ciphertext: crypted}, cryptkey, {
    iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000'),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

console.log(decrypt.toString(CryptoJS.enc.Utf8));
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
 类似资料:
  • 问题内容: 这是我在JSP文件中的Java代码。我正进入(状态 无法解析Base64Encoder。 为什么会这样呢?我必须添加与相关的内容。任何建议将不胜感激。 问题答案: 看起来您正在使用Web应用程序中包含的jar中不存在的类。您可以尝试以下吗?如有必要,请进行调整,我只是在查看通用文档,然后将其输入- 转到http://commons.apache.org/codec/index.html

  • 问题内容: 因此,我直接从Google的android网站复制了此教程示例内容,却收到一个错误,指出R.id无法解决。 这是我的Java文件 这是我的 问题答案: 您必须导入您的R类 同样,如需求发布一样,您必须为布局使用名称空间。

  • 问题内容: 之前一切正常。然后,我碰巧将一个新的xml文件添加到布局中。现在,当setContentView指向(R.layout.menu)时,我的一个类给出了错误。Eclipse告诉我R.layout.menu无法解析。我不知道为什么。我在布局文件夹中定义了一个称为菜单的布局。 有什么建议? 问题答案: 您是否执行过项目>清洁?有时,您只需要让Eclipse重新生成R文件即可。

  • 问题内容: 我是一个Java新手,因此遇到了这个问题。我尝试解码Json,为了做到这一点,我想导入这些包: “无法解决导入问题” …这些软件包是否不再可用,或者我是否需要做其他事情才能使它们起作用? 提前感谢。 问题答案: 可能您的简单json.jar文件不在您的类路径中。