首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CBC模式下使用aes-js库解密时不支持类似数组的对象错误

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

Stack Overflow用户
提问于 2018-12-24 09:41:35
回答 1查看 1.4K关注 0票数 2

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

错误:不支持类似数组的对象在(/data/data/com.suspendresume/files/nodejs-project/node_modules/aes-js/index.js:51:15) at coerceArray ModeOfOperationCBC at MyEmitter.rn_bridge.channel.on (/data/data/com.suspendresume/files/nodejs-project/main.js:76:15) emitOne (events.js:115:13) at MyEmitter.emit (events.js:210:7),Immediate.setImmediate onImmediate at runCallback (timers.js:781:20) at tryOnImmediate (timers.js:743:5) at processImmediate immediateCallback

以下是我的代码

代码语言:javascript
复制
 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);

请帮我解决这个问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-24 12:01:16

您的代码有几个问题:

  1. 初始化向量还必须作为数组传递。
  2. 初始化向量必须长度为16字节 (即十六进制为32 )。你的只有8个字节。
  3. 名为encryptedHex的变量不包含十六进制,但包含base64。十六进制只允许数字和字母and,但字符串包含其他字母,甚至+

我已经解决了这样的问题:

  1. 使用aesjs.utils.hex.toBytes将其转换为字节
  2. 因为我没有原来的16个字节IV,所以我无法解密您的文本。相反,我创建了一个新的加密文本,IV和密钥,以证明代码工作。
  3. 我使用base64将Uint8Array字符串转换为这个片段

结果是这样的。它应该在控制台中打印Hello

代码语言:javascript
复制
encryptedB64 = 'kcGz8P/m0lRRRxcT3tJiSw==';

iv = '6162636465666768696a6b6c6d6e6f70';
iv = aesjs.utils.hex.toBytes(iv);

key = '31323334353637383930313233343536';
key = aesjs.utils.hex.toBytes(key);

// When ready to decrypt the base64 string, convert it back to bytes
var encryptedBytes = Uint8Array.from(atob(encryptedB64), c => c.charCodeAt(0));

// 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.trimEnd('\0'));
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/aes-js/3.1.2/index.min.js"></script>

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53911668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档