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
相关产品推荐
相关产品推荐

