我是密码学的新手。
我正在使用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: '...'
}