Javascript 在CBC模式下使用aes js库解密时出现不支持的类似数组的对象错误

Javascript 在CBC模式下使用aes js库解密时出现不支持的类似数组的对象错误,javascript,node.js,Javascript,Node.js,我正在使用库测试AES加密。当我试图解密密文时,我得到以下错误 错误:不支持类似数组的对象 在强制array(/data/data/com.suspendresume/files/nodejs project/node_modules/aes js/index.js:51:15) 以新的操作模式CBC(/data/data/com.suspendresume/files/nodejs project/node_modules/aes js/index.js:442:33) 在MyEmitter.

我正在使用库测试AES加密。当我试图解密密文时,我得到以下错误

错误:不支持类似数组的对象 在强制array(/data/data/com.suspendresume/files/nodejs project/node_modules/aes js/index.js:51:15) 以新的操作模式CBC(/data/data/com.suspendresume/files/nodejs project/node_modules/aes js/index.js:442:33) 在MyEmitter.rn_bridge.channel.on(/data/data/com.suspendresume/files/nodejs project/main.js:76:15) 在emitOne(events.js:115:13) 在MyEmitter.emit(events.js:210:7) 在Immediate.setImmediate[as _onImmediate](/data/data/com.suspendresume/files/nodejs-builtin_modules/rn bridge/index.js:14:13) 运行时回调(timers.js:781:20) 在tryOnImmediate(timers.js:743:5) 在processImmediate[as_immediateCallback](timers.js:714:5)

下面是我的代码

 encryptedHex ='yRe2x6Gf2uVzfesp1I7ISkkAjTo2xoH2SPSqXzdWKHg+HhosYblfTFUJVoPVgpyf'
  iv= 'ec8902010adc3d63';
  key='aa54c24fae5e52a5861c80f466a90922'
  key= aesjs.utils.hex.toBytes(key)
 // When ready to decrypt the hex string, convert it back to bytes
 var encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex);

 // The cipher-block chaining mode of operation maintains internal
 // state, so to decrypt a new instance must be instantiated.

 var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv);
 var decryptedBytes = aesCbc.decrypt(encryptedBytes);

 // Convert our bytes back into text
 var decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes);
 console.log(decryptedText);

请帮助我解决此问题

您的代码存在一些问题:

  • 初始化向量还必须作为数组传递
  • 初始化向量(即十六进制中的32)。你的只有8个字节
  • 名为
    encryptedHex
    的变量不包含十六进制,但包含base64。十六进制仅允许数字和字母A-F,但字符串包含其他字母,甚至
    +
  • 我已经像这样解决了这些问题:

  • 使用
    aesjs.utils.hex.toBytes将其转换为字节
  • 因为我没有原始的16字节IV,我无法解密你的文本。相反,我创建了一个新的加密文本、IV和密钥来演示代码的工作原理
  • 我使用将base64字符串转换为Uint8Array
  • 这是结果。它应该在控制台中打印
    Hello

    encryptedB64='kcGz8P/m0lRRRxcT3tJiSw=';
    iv='6162636465666768696a6b6c6d6e6f70';
    iv=八角体(iv);
    键='313233343536373839330313233343536';
    key=aesjs.utils.hex.toBytes(key);
    //准备解密base64字符串时,将其转换回字节
    var encryptedBytes=Uint8Array.from(atob(encryptedB64),c=>c.charCodeAt(0));
    //密码块链接操作模式保持内部
    //状态,因此必须实例化一个新实例才能解密。
    var aesCbc=新aesjs.操作模式.cbc(键,iv);
    var decryptedBytes=aesCbc.decrypt(encryptedBytes);
    //将字节转换回文本
    var decryptedText=aesjs.utils.utf8.fromBytes(decryptedBytes);
    console.log(decryptedText.trimEnd('\0'))
    
    您能解释一下您是如何加密Hello字符串的吗?@BharatModi使用给定的IV和密钥以及PKCS#7填充对文本“Hello”进行常规AES-128加密的。您可以使用任何加密工具和任何编程语言来实现这一点。我已经为您制作了一个小程序,因此您可以看到如何使用aesjs库来完成它。