Rijndael-js解密函数输出数字列表而非原字符串问题求助
问题分析与解决
核心问题
你的代码存在两个关键问题:
- 异步执行顺序错误:
encryptor是异步函数,但你调用它后立即同步执行decryptor,此时加密逻辑还未完成,keyData、ivData、encryptedData可能未被正确赋值(虽然你的输出显示有数据,但这是事件循环的偶然结果,逻辑上存在时序漏洞)。 - 数据类型处理错误:
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
相关产品推荐
相关产品推荐

