Я должен сгенерировать два ключа (частный и открытый), чтобы зашифровать текст с помощью открытого ключа и позволить пользователю с помощью личного ключа расшифровать текст.
Возможно ли это с модулем Crypto?
Я должен сгенерировать два ключа (частный и открытый), чтобы зашифровать текст с помощью открытого ключа и позволить пользователю с помощью личного ключа расшифровать текст.
Возможно ли это с модулем Crypto?
Используйте крипто-модуль из npm для генерации KeyPair.
var crypto = require('crypto');
var prime_length = 60;
var diffHell = crypto.createDiffieHellman(prime_length);
diffHell.generateKeys('base64');
console.log("Public Key : " ,diffHell.getPublicKey('base64'));
console.log("Private Key : " ,diffHell.getPrivateKey('base64'));
console.log("Public Key : " ,diffHell.getPublicKey('hex'));
console.log("Private Key : " ,diffHell.getPrivateKey('hex'));
Выше приведен пример фрагмента. Чтобы узнать больше документации для проверки http://nodejs.org/api/crypto.html
nodejs v10.12 теперь поддерживает это изначально с помощью crypto.generateKeyPair
const { generateKeyPair } = require('crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret'
}
}, (err, publicKey, privateKey) => {
// Handle errors and use the generated key pair.
});
Следующий код работает, но я не профессиональный криптограф, поэтому некоторые комментарии здесь были бы полезны.
Я использовал модуль ursa RSA вместо криптограммы.
Я обеспокоен тем, что, если подобные данные были зашифрованы напрямую, без прохода AES или подобного, тогда было бы тривиально разорвать это. Комментарии, пожалуйста...
var ursa = require('ursa');
var fs = require('fs');
// create a pair of keys (a private key contains both keys...)
var keys = ursa.generatePrivateKey();
console.log('keys:', keys);
// reconstitute the private key from a base64 encoding
var privPem = keys.toPrivatePem('base64');
console.log('privPem:', privPem);
var priv = ursa.createPrivateKey(privPem, '', 'base64');
// make a public key, to be used for encryption
var pubPem = keys.toPublicPem('base64');
console.log('pubPem:', pubPem);
var pub = ursa.createPublicKey(pubPem, 'base64');
// encrypt, with the public key, then decrypt with the private
var data = new Buffer('hello world');
console.log('data:', data);
var enc = pub.encrypt(data);
console.log('enc:', enc);
var unenc = priv.decrypt(enc);
console.log('unenc:', unenc);
После некоторого дальнейшего исследования http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29§ion=12#Attacks_against_plain_RSA похоже, что урса уже выполняет отступы.
Если вы знаете, как получить то, что вы хотите от OpenSSL, я считаю вполне разумным запустить OpenSSL с помощью Node child_process
.
var cp = require('child_process')
, assert = require('assert')
;
var privateKey, publicKey;
publicKey = '';
cp.exec('openssl genrsa 2048', function(err, stdout, stderr) {
assert.ok(!err);
privateKey = stdout;
console.log(privateKey);
makepub = cp.spawn('openssl', ['rsa', '-pubout']);
makepub.on('exit', function(code) {
assert.equal(code, 0);
console.log(publicKey);
});
makepub.stdout.on('data', function(data) {
publicKey += data;
});
makepub.stdout.setEncoding('ascii');
makepub.stdin.write(privateKey);
makepub.stdin.end();
});
Я не использовал его, но это может быть полезно:
http://ox.no/posts/diffie-hellman-support-in-node-js
Документация сильно отсутствует на этом (нет примеров, которые я мог бы найти).
Вы можете использовать этот модуль rsa-json. Он просто запускает процесс openssl, поэтому он довольно зависит от ОС (он не работает по умолчанию в окнах).
маршрут child_process - ужасное и не масштабируемое решение imo. Держись подальше.
Я решил пойти с парой ключей вместо этого.