使用加密模块从"N"、"E"、"D"密钥生成 RSA 密钥对



我是密码学的新手。

我正在使用crypto.generateKeyPairSync()创建RSA密钥对

const crypto = require('crypto')
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicExponent: 3,
publicKeyEncoding: {
type: 'pkcs1',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs1',
format: 'pem'
}
})
console.log(publicKey)
console.log(privateKey)
// print "n", "e", "d" keys

这很好,但我需要提取"n", "e", "d"密钥,以便其他应用程序可以对消息进行加密和解密。如果这在没有任何第三方库的情况下(只有本地NodeJS加密模块(是可能的,那就太好了。

此外,如果无法提取"n", "e", "d"密钥,是否可以使用其他应用程序中的现有"n", "e", "d"密钥创建新的公钥和私钥?

这很好,但i需要提取;n〃"e"d";密钥,以便其他应用程序可以对消息进行加密和解密。如果这在没有任何第三方库的情况下(只有本地NodeJS加密模块(是可能的,那就太好了。

首先,模n、公共指数e和私有指数d不是键,它们是用于组成键的组件。由于RSA密钥包含至少两个组件,因此需要某种方法将它们区分开来。您需要某种分离组件的数据结构,这正是PKCS#1ASN.1规范所提供的。只要指定您将使用PEM格式的PKCS#1提供RSA密钥就足够了。

顾名思义,私钥实际上不应该被共享。毕竟不存在共享私钥这样的东西。密钥是为一个特定实体生成的,通常保存在生成密钥的位置(可能会免除加密备份(。

如果只使用n和d,那么可能会为私钥省去任何生成的CRT参数,这意味着在最好的情况下,RSA密钥操作不会运行。在最坏的情况下,RSA实施非常挑剔,根本无法运行。

最后,正如文档正确指出的那样,您应该使用'spki'作为输出格式(证书中使用的公钥,称为SubjectPublicKeyIdentifier,在X.509标准中指定(和'pkcs8',因为它们包含所使用的类型的指示。这些可能比PKCS#1更受其他应用程序的支持。

如果他们自己不能解码,那么简单地将基64复制到该站点(在线ASN.1解码器(中并复制相关值。您可以在PKCS#1标准中找到值的顺序(对于'pkcs1'(。

您可以使用库pem-jwk来提取公钥/私钥的组件,如下所示:

const pem2jwk = require('pem-jwk').pem2jwk
console.log(pem2jwk(pemPublicKey));
OUTPUT:
{
kty: '...',
n: '...',
e: '...'
}
console.log(pem2jwk(pemPrivateKey));
OUTPUT:
{
kty: '...',
n: '...',
e: '...',
d: '...',
p: '...',
q: '...',
dp: '...',
dq: '...',
qi: '...'
}

最新更新