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

Node.js:解密加密对称密钥时出现Invalid RSAES-OAEP padding错误

解决「Invalid RSAES-OAEP padding」错误的方案

嘿,我之前也踩过这个坑!你遇到的这个填充错误,根源是Node.js原生Buffer和node-forge的二进制数据格式不兼容导致的,咱们一步步来解决:

问题原因

你用_crypto.randomBytes(32)生成的对称密钥是Node.js的Buffer对象,但node-forge的RSA加密方法默认只认自己的ByteBuffer或者二进制字符串。直接把Buffer传进去的话,forge会错误地按照UTF-8编码去解析字节,把原始的对称密钥给破坏了,解密时自然过不了OAEP的填充校验,就抛出这个错误了。

修正后的完整代码

我们只需要把Buffer转换成forge能正确识别的格式就行,这里提供两种常用方式:

var forge = require('node-forge');
var _crypto = require('crypto');
var rsa = forge.pki.rsa;

// 生成32字节的对称密钥(Node.js Buffer)
var masterKey = _crypto.randomBytes(32);

// 生成2048位RSA密钥对
var keypair = rsa.generateKeyPair(2048);

// --- 关键转换步骤:把Buffer转成forge兼容的格式 ---
// 方式1:转成二进制字符串(推荐)
var masterKeyBinary = masterKey.toString('binary');
// 方式2:用forge的Buffer包装
// var masterKeyForgeBuffer = forge.util.createBuffer(masterKey, 'raw');

// 用RSA-OAEP加密对称密钥
var encryptedVal = keypair.publicKey.encrypt(masterKeyBinary, 'RSA-OAEP');

// 解密测试
var decryptedVal = keypair.privateKey.decrypt(encryptedVal, 'RSA-OAEP');

// 把解密后的二进制字符串转回Node.js Buffer
var decryptedMasterKey = Buffer.from(decryptedVal, 'binary');

// 验证密钥是否一致(应该输出true)
console.log(Buffer.compare(masterKey, decryptedMasterKey) === 0);

额外注意事项

  • 如果需要用SHA-256(而非默认的SHA-1)作为OAEP的哈希函数,加密和解密时要统一指定,不然也会触发填充错误:
    // 加密时指定SHA-256
    var encryptedVal = keypair.publicKey.encrypt(masterKeyBinary, 'RSA-OAEP', {
      md: forge.md.sha256.create()
    });
    // 解密时也要对应指定
    var decryptedVal = keypair.privateKey.decrypt(encryptedVal, 'RSA-OAEP', {
      md: forge.md.sha256.create()
    });
    
  • 确保加密和解密使用的密钥对是同一组,别搞混了公钥和私钥的用途。

内容的提问来源于stack exchange,提问作者Neetu Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:23:16