如何在 Node.js 中获取 RSA 公钥的模数和指数

Dae*_*ast 8 javascript rsa node.js public-key

我正在创建一个ACME客户端,我需要找到我的 RSA 公钥的模数和指数,我使用以下代码生成该密钥:

crypto.generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem'
    }
});
Run Code Online (Sandbox Code Playgroud)

我需要模数和指数,以便我可以在JWSJWK部分中使用它们:

alg: 'RS256',
jwk: {
    kty: 'RSA',
    e: '...',
    n: '...'
},
nonce,
url: directory.newAccount
Run Code Online (Sandbox Code Playgroud)

我已成功使用以下行将公钥从base64解码为十六进制,但我不确定下一步该怎么做:

Buffer.from(publicKey, 'base64').toString('hex');
Run Code Online (Sandbox Code Playgroud)

如何在 Node.js 中找到 RSA 公钥的模数和指数?



编辑1

我发现 Node.js 默认使用公共指数 65537:Node.js 文档

Rom*_*nov 7

这就像小菜一碟一样简单;它不需要第三方库

import { createPublicKey } from 'crypto'

const pemPublicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAphRAj+tRfbrYwnSFbWrj
...
vQIDAQAB
-----END PUBLIC KEY-----
`
const publicKey = createPublicKey(pemPublicKey)
console.log(publicKey.export({ format: 'jwk' }))
Run Code Online (Sandbox Code Playgroud)

它将返回对象:

{
  kty: 'RSA',
  n: [modulus string],
  e: [exponent string]
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,从 NodeJS 版本 v15.9.0 开始,导出支持 jwk 格式。但事实上这个答案对我帮助很大。 (2认同)