混合加密中为什么RSA加密后的数据用AES解密会失败?

Mc.会静 阅读 207

我在做混合加密时遇到问题:前端用RSA公钥加密了AES的对称密钥,但后端用RSA私钥解密后得到的数据,用AES解密明文总是失败。

尝试过检查密钥长度和算法配置,但没发现问题。比如下面这段加密代码,是不是哪里处理错了?后端解密时提示”Invalid AES key”


const crypto = require('crypto');

// 生成AES密钥
const aesKey = crypto.randomBytes(32);

// 用RSA公钥加密AES密钥
const encryptedKey = crypto.publicEncrypt({
  key: '-----BEGIN PUBLIC KEY-----n...RSA公钥...n-----END PUBLIC KEY-----',
  padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
}, aesKey);

// 发送给后端的数据
const payload = {
  encryptedKey: encryptedKey.toString('base64'),
  cipherText: crypto.createCipheriv('aes-256-cbc', aesKey, iv).update(data)
};

后端用RSA私钥解密后的密钥直接拿去解密报错,但单独用AES加密解密测试是正常的。是不是加密流程顺序有问题?或者密钥格式需要转换?

我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
 ___若惜
你这个问题是编码格式导致的,RSA解密出来的AES密钥是Buffer对象,但AES解密时需要的是原始字节格式,不能直接用字符串处理。后端解密AES前,确保从RSA解密结果转换成Buffer后再使用。

后端代码改这里:
const decryptedAesKey = crypto.privateDecrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING}, Buffer.from(encryptedKey, 'base64'));

// 确保用Buffer作为AES密钥
const decipher = crypto.createDecipheriv('aes-256-cbc', decryptedAesKey, iv);


记住,加密解密时所有中间数据都尽量用Buffer,别乱转字符串,不然容易坏数据。
点赞 3
2026-02-01 10:00