使用Node.js crypto模块解密时遇error:1C800064错误求助
解密报错Error: error:1C800064:Provider routines::bad decrypt的解决方法
核心问题:解密时编码参数传递错误
你的解密代码中,decipher.update()和decipher.final()的编码参数完全写反了:
- 加密流程是:
utf8明文 → hex密文,对应cipher.update(message, 'utf8', 'hex') - 解密流程需要反向:
hex密文 → utf8明文,但你写成了utf8 → hex,导致解密时无法正确解析密文,触发"bad decrypt"错误。
修复后的解密代码
const crypto = require('crypto'); // 从加密模块获取的密钥 const key = '2e6c7f292306cd6518aff5ff99dba46e'; // 注意:和加密端使用完全一致的IV(当前示例用全0,仅作演示) const iv = Buffer.alloc(16).fill(0); // 从加密模块获取的密文 const encryptedMessage = '187145680cd07efad27ea86dbdbf7a0e7434dd5e753af1c427a147d621d7bb9980ac4ef633ec2504b8318e000757ed42'; // 创建解密器 const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(key, 'hex'), iv); // 修正编码参数:将hex格式的密文转换为utf8明文 let decryptedMessage = decipher.update(encryptedMessage, 'hex', 'utf8'); // 最终输出也要指定utf8编码 decryptedMessage += decipher.final('utf8'); console.log('Decrypted Message:', decryptedMessage); console.log('Key:', key);
额外的安全最佳实践
- IV必须随机生成:AES-CBC模式下,IV不能固定为全0(当前代码仅作演示)。加密时应使用
const iv = crypto.randomBytes(16)生成随机IV,然后将IV和密文一起传递给解密端(IV无需保密,可以明文存储/传输)。 - 添加消息认证:建议对加密后的密文生成HMAC认证码,解密前先验证HMAC,防止密文被篡改导致解密失败或伪造内容。
内容的提问来源于stack exchange,提问作者codeKar
相关产品推荐
相关产品推荐

