Генерация пары ключей RSA из ключей «N», «E», «D» с использованием криптомодуля - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в криптографии.

Я создаю пары ключей RSA, используя crypto.generateKeyPairSync()

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", можно ли создать новый publi c и закрытый ключ с использованием существующих ключей "n", "e", "d" из другого приложения?

1 Ответ

0 голосов
/ 26 февраля 2020

Это работает нормально, но мне нужно извлечь ключи "n", "e", "d", чтобы другое приложение могло шифровать и дешифровать сообщения. Было бы замечательно, если бы это было возможно без каких-либо сторонних библиотек, только собственный криптографический модуль NodeJS.

Прежде всего, модуль n, показатель e publi c и частный показатель d это не ключи, это компоненты, которые используются для создания ключа. Поскольку ключ RSA содержит как минимум двух компонентов, вам нужен какой-то метод, чтобы отличать guish их друг от друга. Вам нужна какая-то структура данных, которая разделяет компоненты, и это именно то, что обеспечивают спецификации PKCS # 1 ASN.1. Достаточно указать, что вы будете доставлять ключ RSA с использованием PKCS # 1 в формате PEM.

Закрытый ключ, как следует из названия, на самом деле не должен использоваться совместно. В конце концов, не существует такого понятия, как общий закрытый ключ. Ключи генерируются для одного указанного c объекта и обычно хранятся там, где они генерируются (возможно, исключая зашифрованное резервное копирование).

Если вы используете только n и d, вы, вероятно, пропустите все сгенерированные параметры CRT для закрытый ключ, что означает, что в лучшем случае операции ключа RSA не выполняются. В худшем случае реализация RSA чрезвычайно требовательна и не будет работать вообще.

Наконец, как правильно указывает документация, вы должны использовать 'spki' в качестве выходного формата (ключ publi c как используется в сертификатах, называемых SubjectPublicKeyIdentifier, указанными в стандартах X.509) и 'pkcs8', поскольку они содержат указание на используемый ключ type . Они, вероятно, лучше поддерживаются другими приложениями, чем PKCS # 1.

Если они не могут самостоятельно его декодировать, просто скопируйте base 64 на этот сайт (онлайн-декодер ASN.1) и скопируйте соответствующие значения. Порядок значений (для 'pkcs1') можно найти в стандарте PKCS # 1 .

...