Закрытый ключ RSA не может расшифровать данные - PullRequest
1 голос
/ 24 сентября 2019

Я использую JavaScript и Node.js для работы над своего рода проектом обмена сообщениями.Когда пользователь создается, сервер использует библиотеку Node.js crypto для генерации пары ключей RSA.Закрытый ключ шифруется с использованием пароля пользователя.В веб-приложении, когда пользователь A отправляет сообщение пользователю B, данные шифруются с использованием открытого ключа пользователя B.Когда пользователь B получает сообщение, оно дешифруется с использованием его личного ключа и пароля.

Моя проблема заключается в том, что, хотя приложение, похоже, шифрует данные, я не могу дешифровать данные.Выдающееся сообщение об ошибке буквально «не может расшифровать данные», что бесполезно.

Код на стороне сервера для генерации пар ключей:

// Generate public/private keypairs
exports.generateKeyPair = (password) => {
    return new Promise((resolve, reject) => {
        crypto.generateKeyPair('rsa', {
            modulusLength: 4096,
            publicKeyEncoding: {
                type: 'spki',
                format: 'pem'
            },
            privateKeyEncoding: {
                type: 'pkcs8',
                format: 'pem',
                cipher: 'aes-256-cbc',
                passphrase: password
            }
        }, (err, publicKey, privateKey) => {
                if (err) reject(err);
                else resolve([publicKey, privateKey]);
        });
    })
}

Код на стороне клиента для дешифрования и шифрования(Узел шифрования библиотеки отправляется клиенту с помощью Browserify):

var crypto = require('crypto');

window.encrypt = function (data, publicKey) {
    let buffer = Buffer.from(data);
    let encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString('base64');
}

window.decrypt = function(data, privateKey, password) {
    let buffer = Buffer.from(data, 'base64');
    let decrypted = crypto.privateDecrypt({
        key: privateKey,
        passphrase: password
    }, buffer);
    return decrypted.toString('utf8');
}

Код на стороне клиента, который взаимодействует с пользовательским интерфейсом:

var sendMsg = function() {
    let token = $('#token').val();
    let toUser = $('#toUser').val();
    let message = btoa($('#sendMessage').val());
    fetch(`/keypairs/public/${toUser}?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.pubKey;
    })
    .then((pubKey) => encrypt(message, pubKey))
    .then((encrypted) => $('#send-result').html(encrypted))
    .catch((err) => alert(err));
};

var decryptMsg = function() {
    let token = $('#token').val();
    let encrypted = $('#decrypt-text').val();
    let password = $('#decrypt-pass').val();

    fetch(`/keypairs/private?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.privKey;
    })
    .then((privKey) => decrypt(encrypted, privKey, password))
    .then((decrypted) => $('#decrypt-result').html(decrypted))
    .catch((err) => (console.error(err), alert(err))); // <-- this line gives useless info
};

Я вставляю зашифрованные данные в поле #'decrypt-text.Я также передаю пароль пользователя B.Токен извлекается во время входа в систему, чтобы связать пользователя с ключом в базе данных.Как я уже упоминал, единственная ошибка, которую я получаю, это «Невозможно расшифровать данные».Есть идеи?Возможно, мне нужно сгенерировать ключи с типом pkcs1?

1 Ответ

1 голос
/ 24 сентября 2019

Я понял это.Эта проблема заключалась в том, что когда я создавал открытые ключи, типы были spki и pkcs8.По какой-то причине изменение как на pkcs1, так и восстановление ключей смогли это исправить.Я также попытался передать type: 'pkcs8 в функцию расшифровки, но это не сработало.

...