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

Node.js crypto:publicEncrypt加密后publicDecrypt解密报invalid padding错误

问题:使用crypto.publicEncrypt加密后,crypto.publicDecrypt解密报错invalid padding

我能成功用crypto.publicEncrypt加密消息,但用crypto.publicDecrypt反向解密时一直失败,报错信息始终是invalid padding。

密钥生成命令

openssl genrsa -out rsa.private 1024
openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM

代码实现

import fs from 'fs';
import path from 'path';
import crypto from 'crypto';

describe('PublicKeyEncryptor', () => {
  test('PublicKeyEncryptor', () => {
    // Arrange
    //const publicKey = fs.readFileSync(path.resolve('./src/tests/data/pubkey.pem'), 'utf8');
    const publicKey = fs.readFileSync(path.resolve('./src/tests/data/rsa.public'), 'utf8');
    const privateKey = fs.readFileSync(path.resolve('./src/tests/data/rsa.private'), 'utf8');

    console.log("")
    console.log(publicKey)
    console.log("")

    const messageKey = '0123456789012345';
    const plainText = Buffer.from('Foobar');

    // Act
    // const encryptedString = encryptWithPublicKey(plainText, publicKeyContent);
    const publicKeyObj = crypto.createPublicKey(publicKey);
    const privateKeyObj = crypto.createPrivateKey(privateKey);
    const encrypted = crypto.publicEncrypt(
      { key: publicKeyObj, padding: crypto.constants.RSA_PKCS1_PADDING },
      messageKey
    );

    console.log("encrypted", encrypted.toString('base64'))

    const msg = crypto.publicDecrypt(
        {
            key: privateKeyObj
            , padding: crypto.constants.RSA_PKCS1_PADDING
        },
        encrypted
    );
    console.log(msg)

    // Assert
    // console.log(encryptedString.toString('base64'));
    expect(encryptedString).not.toBeNull();
  });
});

错误输出

....
      encrypted ru/hr/uS8MzWLX69aTrX/Q/NJuFvnxAv9yhKDM3qO2ajCxCJo6Ql5fGwcaxJKhBPe0mP7/dDa/fb5R3MuCc0nH4a9yj6JGK5W97d7qts05CTLNxFvHiHtFNxftuDJoYoCMzXPmoYzk0U4KXFrECRWfdmsfETH/oybE/3qdBARgc=

      at Object.<anonymous> (encryption.ts:47:13)

  ● PublicKeyEncryptor › PublicKeyEncryptor

    error:0200008A:rsa routines::invalid padding

      47 |     console.log("encrypted", encrypted.toString('base64'))
      48 |
    > 49 |  const msg = crypto.publicDecrypt(
         |                     ^
      50 |         {
      51 |             key: privateKeyObj
      52 |             , padding: crypto.constants.RSA_PKCS1_PADDING

      at Object.<anonymous> (encryption.ts:49:21)

解决方案

核心问题是解密方法用错了:

  • 公钥加密的内容,必须用对应私钥通过crypto.privateDecrypt解密,crypto.publicDecrypt的作用是解密私钥加密的内容(多用于签名验证场景),不能用来解公钥加密的数据。

修改后的解密代码:

const msg = crypto.privateDecrypt(
    {
        key: privateKeyObj,
        padding: crypto.constants.RSA_PKCS1_PADDING
    },
    encrypted
);

额外注意:代码中encryptedString变量未定义,断言部分可调整为expect(msg.toString()).toBe(messageKey);来验证解密结果是否匹配原始内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:54:59