node-RSA ошибки при попытке расшифровать сообщение с закрытым ключом

поэтому я пытался использовать node с узел-rsa и javascript с jsencrypt чтобы создать веб-сайт (для назначения), где клиент javascript получает открытый ключ, сгенерированный сервером (node-rsa), шифрует сообщение (jsencrypt), которое ввел пользователь, отправляет его на сервер и получает сервер для его расшифровки (node-rsa). Генерация ключей работает, шифрование работает, однако дешифрование не работает. Когда я запускаю сценарий узла, я делаю следующее для шифрования...

var NodeRSA = require('node-rsa');
var myDecrypter = new NodeRSA({b: 512});

когда клиент запрашивает ключ (я использую express), выполняется следующее.

app.get('/getPublicKey', function(req, res){
    var publicKeyJson = {"Key": ""};
    console.log(myDecrypter.exportKey('public'));
    publicKeyJson.Key = myDecrypter.exportKey('public');
    res.json(JSON.stringify(publicKeyJson));
});

затем клиент сохраняет этот ключ следующим образом...

var myEncrypter = new JSEncrypt();
var myJson  = "";
$.getJSON( "getPublicKey", function( data ) {
    myJson = JSON.parse(data).Key;
        setKey();
});
function setKey() {
    myEncrypter.setPublicKey(myJson);
}

когда я должен зашифровать и отправить сообщение на клиенте, я делаю это...

function messageEncrypt() {
    message = document.getElementById("message").value;
    var encrypted = myEncrypter.encrypt(message);
    myMessage = {"username": "", "userId": 0.0, "message": ""};
    myMessage.username = me.username;
    myMessage.userId = me.userId;
    myMessage.message = encrypted;
    console.log(encrypted);
    $.post("sendMessage", myMessage);
}

когда сервер получает сообщение, Вот что происходит, вот где я получаю ошибки.

app.post('/sendMessage', function(req, res){
    var message = req.body;
    var user = message.username;
    var id = message.userId;
    console.log("What a mess, " + user + " said " + message.message + " what on earth does that mean");
    //This line below errors
    var clearMessage = myDecrypter.decrypt(message.message, 'utf8');
    console.log(user + " said " + clearMessage);
});

ошибка, которую я получаю ...

Error: Error during decryption (probably incorrect key). Original error: Error: error:040A1079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
    at Error (native)
    at NodeRSA.module.exports.NodeRSA.$$decryptKey (/home/node_modules/node-rsa/src/NodeRSA.js:295:19)
    at NodeRSA.module.exports.NodeRSA.decrypt (/home/node_modules/node-rsa/src/NodeRSA.js:243:21)
    at /home/securechat/securechat.js:36:36
    at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
    at /home/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/home/node_modules/express/lib/router/index.js:330:12)

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

-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cEHmhFJB8m4bQUSTcSi4eg
sUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQJASds423cVH/c4NsqhXh8e
KvYwjBFeeNIjQegIq1KctbHmKNM5MMb4jnDqdY/S5XHHS22EGvLNheLgV8tlRjwG
UQIhANpNmbl215eOsGPJ0jqz1XPMBrO35V6I3P04kvr66R1JAiEAn+oL0jtAFETR
4PRfenye5MAu9US3V5MoDN8xUoEvKrcCIQDQT2ZWNNIrHAyzXB2QyJPxqInoqp1j
5QPDWl3ewtj5iQIgY3E1nKw/stsA8LTGUvMAFBv2l4r9wDXAaBC7KSUwYY0CIAj4
0gA9etDbPm3H/XDwK4WXs9mXkKroyxewkWoOoAw/
-----END RSA PRIVATE KEY-----

и открытый ключ, отправленный клиенту, был...

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cE
HmhFJB8m4bQUSTcSi4egsUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQ==
-----END PUBLIC KEY-----

зашифрованные сообщения (stackoverflow )были...

XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g==

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

Итак, мой вопрос...

что я делаю неправильно с моей расшифровкой node-rsa???

Если вам нужна дополнительная информация / код, пожалуйста, поместите его в комментариях ниже.

3 ответов


чтобы ответить на ваш вопрос @Curious_Programmer быть узлом по умолчанию-rsa использует pkcs1_oaep для шифрования и дешифрования, а jsencrypt использует pkcs1. К счастью, узел позволяет изменить encryptionScheme, что вам нужно сделать, это добавить ...

myDecrypter.setOptions({encryptionScheme: 'pkcs1'});

под

var myDecrypter = new NodeRSA({b: 512});

и все будет работать как шарм, я надеялся, что я помог вам ;)


кажется, что зашифрованный текст является буфером, т. е. двоичными данными. Затем он транспортируется с помощью JSON, который состоит из текста. Вам нужно использовать текстовую кодировку над двоичными данными, чтобы перенести ее через текстовый интерфейс.


проверьте следующее определение encrypt способ:

key.encrypt(buffer, [encoding], [source_encoding]);

с напоминанием о том, что по умолчанию -'buffer' на [encoding].

таким образом, вы должны использовать:

var encrypted = myEncrypter.encrypt(message, 'base64', 'utf-8');

здесь 'base64' для шифротекст кодирования и 'utf-8' для кодирования открытого текста.


процедура дешифрования должна автоматически использовать base64 декодирование зашифрованного текста:

var clearMessage = myDecrypter.decrypt(message.message, 'utf8');

должно быть просто отлично.


у меня была та же проблема.

encrypt.setOptions({encryptingScheme:'pkcs1'});  //Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'.

но, это все равно не удалось.

Я изменил lib с node-rsa to ursa, например:

privateKey.decrypt(thirdEncrypted, 'base64', 'utf8',ursa.RSA_PKCS1_PADDING);

проблема была решена в ursa.