如何用Node.js内置crypto模块从n、e生成PKCS8-PUBLIC-PEM格式RSA公钥
用Node.js原生crypto模块替代node-rsa生成RSA公钥并加密
你可以直接通过crypto.createPublicKey()传入n和e组件构造公钥,无需依赖第三方库。以下是替换后的实现代码:
const crypto = require('crypto'); // 第三方API返回的RSA公钥组件 const n = Buffer.from('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'); const e = 0x10001; // 常见的RSA公钥指数 // 构造RSA公钥对象 const publicKey = crypto.createPublicKey({ key: { n, e }, type: 'public', format: 'object' }); // (可选)导出PKCS8-PUBLIC-PEM格式的公钥字符串 const publicKeyPem = publicKey.export({ type: 'spki', format: 'pem' }); // 加密数据(注意填充方式需与第三方要求一致) const data = '123'; const encryptedText = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING // 匹配node-rsa默认填充,若第三方要求OAEP则换为RSA_PKCS1_OAEP_PADDING }, Buffer.from(data) ); console.info(`Encrypted text: ${encryptedText.toString('base64')}`);
关键说明:
- 公钥构造:
crypto.createPublicKey()支持直接接收包含n(Buffer类型模值)和e(指数,可传数字或Buffer)的对象,指定format: 'object'即可识别为RSA组件格式。 - PKCS8格式导出:通过公钥对象的
export()方法,指定type: 'spki'即可生成标准的PKCS8公钥PEM(开头为-----BEGIN PUBLIC KEY-----)。 - 填充一致性:node-rsa默认使用
RSA_PKCS1_PADDING,而crypto.publicEncrypt默认是RSA_PKCS1_OAEP_PADDING,必须根据第三方API的加密要求调整填充方式,否则加密结果会不兼容。
内容的提问来源于stack exchange,提问作者Donghua Liu
相关产品推荐
相关产品推荐

