You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rijndael-js解密函数输出数字列表而非原字符串问题求助

问题分析与解决

核心问题

你的代码存在两个关键问题:

  1. 异步执行顺序错误:encryptor是异步函数,但你调用它后立即同步执行decryptor,此时加密逻辑还未完成,keyData、ivData、encryptedData可能未被正确赋值(虽然你的输出显示有数据,但这是事件循环的偶然结果,逻辑上存在时序漏洞)。
  2. 数据类型处理错误:rijndael-js的decrypt方法返回数字数组,pkcs7-padding的unpad函数接收数组时也会返回数组。你直接调用数组的toString()方法,会默认把数组元素用逗号拼接成字符串,而非将字节转换为UTF-8文本。

修复后的代码

import RijndaelManaged from 'rijndael-js'
import padder from 'pkcs7-padding'
import crypto from 'crypto'

let plainText, padded, keyData, ivData, cipher, encryptedData

const encryptor = async () => {
    plainText = Buffer.from('Here is my plain text', 'utf8')
    padded = padder.pad(plainText, 32)
    keyData = crypto.randomBytes(32)
    ivData = crypto.randomBytes(32)
    cipher = new RijndaelManaged(keyData, 'cbc')
    encryptedData = cipher.encrypt(padded, 256, ivData)
    console.log('加密结果:', encryptedData)
}

const decryptor = () => {
    const key = keyData
    const iv = ivData
    const encrypted = encryptedData
    const decipher = new RijndaelManaged(key, 'cbc')
    const decryptedPadded = decipher.decrypt(encrypted, 256, iv)
    // 将解密得到的数组转换为Buffer后再处理
    const decryptedBuffer = Buffer.from(decryptedPadded)
    const decrypted = padder.unpad(decryptedBuffer, 32)
    const clearText = decrypted.toString('utf-8')
    console.log('解密结果:', clearText)
}

// 确保加密完成后再执行解密
encryptor().then(() => {
    decryptor()
})

关键修改点

  • 修正执行顺序:用then()等待encryptor异步执行完成后再调用decryptor,保证加密相关变量已被正确赋值。
  • 数据类型转换:把decrypt返回的数组转成Buffer,再传入padder.unpad,这样unpad返回的也是Buffer,调用toString('utf-8')就能正确转换为原明文字符串。

验证结果

修复后,解密函数将输出预期内容:

Here is my plain text

内容的提问来源于stack exchange,提问作者Nasyx Nadeem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:31:07