2015-11-20 6 views
6

Quindi ho cercato di utilizzare il nodo con node-rsa e javascript con jsencrypt per creare un sito Web (per un compito) in cui il client javascript ottiene la chiave pubblica generata dal server (nodo-rsa), crittografa il messaggio (jsencrypt) che l'utente ha inserito, lo invia al server e ottiene il server per decodificarlo (nodo-rsa). La generazione delle chiavi funziona, la crittografia funziona, tuttavia la decrittografia no. Quando inizio la sceneggiatura del nodo faccio la seguente per la crittografia ...errori nodo-rsa durante il tentativo di decrittografare il messaggio con chiave privata

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

Quando il client richiede la chiave (sto usando espresso) il seguente è Ran.

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

Il cliente quindi salva quella chiave come questo ...

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

Quando sono arrivato per crittografare e inviare il messaggio sul client faccio questo ...

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); 
} 

Quando il server riceve un messaggio questo è ciò che accade, questo è dove ottengo gli errori.

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); 
}); 

L'errore che ottengo è ...

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) 

Qui però è dove si fa interessante, per ottenere che il messaggio di errore di cui sopra ho avuto una chiave privata di ...

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

e la chiave pubblica inviata al client era ...

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

I messaggi cifrati (StackOverflow) era ...

XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g== 

La cosa interessante è che quando ho usato il demo sul sito jsencrypt ed entro la mia chiave privata così come il messaggio cifrato ottengo il messaggio decifrato corretta.

Quindi la mia domanda è ...

Che cosa sto facendo di sbagliato con il mio decrittazione nodo-rsa ???

Se hai bisogno di ulteriori informazioni/codice, inseriscilo nei commenti qui sotto.

+0

Probabilmente b/c il tuo esempio è complesso. Rendilo più semplice e forniscici un jsfiddle.net in mancanza – Oleander

risposta

9

Per rispondere alla tua domanda @Curious_Programmer essere predefinito node-rsa utilizza pkcs1_oaep per la crittografia e la decrittografia mentre jsencrypt utilizza pkcs1. Per fortuna nodo permette di cambiare l'encryptionScheme, che cosa dovete fare è aggiungere ...

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

sotto

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

e tutto funzionerà come un fascino, speravo che ti ho aiutato;)

+0

I grazie per l'aiuto M8 :) –

1

Sembra che il testo cifrato sia un buffer, cioè dati binari. Quindi viene trasportato usando JSON, che consiste in testo. È necessario utilizzare una codifica di testo sui dati binari per trasportarla su un'interfaccia testuale.


Controllare la seguente definizione del metodo encrypt:

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

con il ricordo che il default è 'buffer' per [encoding].

Così si dovrebbe usare:

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

dove 'base64' è per la codifica testo cifrato e 'utf-8' è per la codifica testo in chiaro.


La routine di decrittazione deve usare automaticamente la decodifica base64 del testo cifrato:

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

dovrebbe essere più che bene.

0

Ho lo stesso problema.

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

ma, questo è ancora fallito.

Ho cambiato la lib da node-rsa a ursa. come questo:

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

Il problema è risolto in Ursa.