Создание пары ключей RSA в javascript на основе пароля

Насколько я понимаю, ключи RSA обычно генерируются на основе (сильного) случайного генератора.

Вместо этого я хочу создать их на основе пароля.

Или, скорее, на его хэш, например sha512 (sha512 (пароль + соль) + пароль + перец)

Это нужно сделать на стороне клиента, в JavaScript.

Кто-нибудь знает, как это сделать? Есть ли простая библиотека JavaScript, которая создает пары ключей RSA детерминистически, на основе заданного ввода?

(На самом деле, я упоминаю RSA, но достаточного безопасного асимметричного шифрования было бы достаточно, мне просто нужно публично-частное шифрование)


Дополнение: Мне нужно это, потому что я создаю какое-то безопасное коммуникационное решение, которое не нужно полагаться на соединение или даже на сервер, чтобы быть в безопасности.

Я шифрую весь контент с помощью AES с использованием случайных ключей, а ключи шифруются RSA. Идея заключается в том, что Алиса может RSA-шифровать свой контент (или, фактически, AES-ключ для своего контента) с открытым ключом Боба (поэтому открытый ключ Bob должен храниться в Интернете).

Позже, когда Боб снова вводит свой пароль, его браузер может детерминистически рассчитать свой частный и открытый ключ RSA на месте, загрузить контент из Алисы и дешифровать его локально с помощью его закрытого ключа.

Ответ 1

Похоже, Cryptico может помочь вам, когда вы кормите свой пароль в качестве семени для RNG.

Ответ 2

RSA-ключи - это не просто случайные биты, как большинство симметричных алгоритмов, они являются показателями и модулюзами, полученными из больших простых чисел. Поэтому я не вижу разумного способа генерировать их из пароля. См. эту статью в википедии.

Для чего вы используете эти пары ключей? Почему они должны быть получены из пароля? Если вы хотите использовать пароль для шифрования, вы можете использовать SHA256 (пароль) для получения ключа AES256. (убедитесь, что прочитали укрепление ключа, если вы собираетесь это сделать).

Ответ 3

Я не могу прокомментировать мою пунктуацию, но, кроме того, что он сказал + Eugene_Mayevski_'EldoS

для javascript pure: https://www.npmjs.com/package/cryptico

для nodejs: https://www.npmjs.com/package/cryptico вам нужно:

npm install cryptico

И добавьте эту строку:

var cryptico = require("cryptico");

для создания объектов:

function cryptoObj(passPhrase)
{
   this.bits = 1024; //2048;
   this.passPhrase = passPhrase;
   this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits);
   this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey);

   this.encrypt = function(message){
     var result = cryptico.encrypt(message,this.rsaPublicKey);
     return result.cipher;
   };

   this.decrypt = function(message){
     var result = cryptico.decrypt(message, this.rsaKey);
     return result.plaintext;
   };
}

console.log('---------------------------------------------------------');
var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX");

var encryptedMessage = localEncryptor.encrypt('new message or json code here');
var decryptedMessage = localEncryptor.decrypt(encryptedMessage);

console.log('');
console.log('>>> Encrypted Message: '+encryptedMessage);
console.log('');
console.log('>>> Decrypted Message: '+decryptedMessage);