关于javascript:在CBC模式下使用aes-js库解密时,出现不受支持的类似数组的对象错误

Unsupported array-like object error when decryption using aes-js library in CBC mode

我正在使用aes-js库来测试AES加密。当我尝试解密密文时,出现以下错误

Error: unsupported array-like object
at coerceArray (/data/data/com.suspendresume/files/nodejs-project/node_modules/aes-js/index.js:51:15)
at new ModeOfOperationCBC (/data/data/com.suspendresume/files/nodejs-project/node_modules/aes-js/index.js:442:33)
at MyEmitter.rn_bridge.channel.on (/data/data/com.suspendresume/files/nodejs-project/main.js:76:15)
at emitOne (events.js:115:13)
at MyEmitter.emit (events.js:210:7)
at Immediate.setImmediate [as _onImmediate] (/data/data/com.suspendresume/files/nodejs-builtin_modules/rn-bridge/index.js:14:13)
at runCallback (timers.js:781:20)
at tryOnImmediate (timers.js:743:5)
at processImmediate [as _immediateCallback] (timers.js:714:5)

以下是我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 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);

请帮助我解决此问题


您的代码存在一些问题:

  • 初始化向量也必须作为数组传递。
  • 初始化向量的长度必须为16个字节(十六进制为32)。您的只有8个字节。
  • 名为encryptedHex的变量不包含十六进制,但包含base64。十六进制仅允许数字和字母A-F,但是字符串包含其他字母,甚至是+
  • 我已经解决了以下问题:

  • 使用aesjs.utils.hex.toBytes将其转换为字节
  • 由于我没有原始的16个字节IV,因此无法解密您的文本。取而代之的是,我创建了一个新的加密文本IV和Key,以证明该代码有效。
  • 我使用此代码片段将base64字符串转换为Uint8Array。
  • 这是结果。它应该在控制台中打印Hello

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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'));

    1
    <script src="https://cdnjs.cloudflare.com/ajax/libs/aes-js/3.1.2/index.min.js">