Erreurs de noeud-rsa lors de la tentative de déchiffrement du message avec une clé privée

J’ai donc essayé d’utiliser noeud avec node-rsa et javascript avec jsencrypt pour créer un site Web (pour une affectation) où le client javascript obtient la clé publique générée par le serveur (node-rsa), chiffre le message (jsencrypt). que l’utilisateur a entré, l’envoie au serveur et lui demande de le déchiffrer (node-rsa). La génération des clés fonctionne, le cryptage fonctionne mais le décryptage ne fonctionne pas. Lorsque je lance le script de noeud, je procède comme suit pour le chiffrement …

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

Lorsque le client demande la clé (j’utilise express), la procédure suivante est exécutée.

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

Le client enregistre alors cette clé comme ceci …

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

Quand je dois chiffrer et envoyer le message sur le client, je le fais …

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

Lorsque le serveur reçoit un message, c’est ce qui se passe, c’est là que j’obtiens les erreurs.

 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’erreur que je reçois est …

 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) 

Voici cependant où cela devient intéressant, pour obtenir ce message d’erreur ci-dessus, j’avais une clé privée de …

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

et la clé publique envoyée au client était …

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

Les messages chiffrés (stackoverflow) étaient …

 XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g== 

La chose intéressante est que lorsque j’utilise la démo sur le site Web jsencrypt et que je saisis ma clé privée ainsi que le message crypté, je reçois le message décrypté correct.

Donc ma question est …

Qu’est-ce que je fais mal avec mon décryptage noeud-rsa ???

Si vous avez besoin de plus d’informations / code s’il vous plaît mettez-le dans les commentaires ci-dessous.

Pour répondre à votre question @Curious_Programmer être par défaut, node-rsa utilise pkcs1_oaep pour le cryptage et le décryptage, tandis que jsencrypt utilise pkcs1. Heureusement, le noeud vous permet de modifier l’encryptionScheme, vous devez simplement append …

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

sous

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

et tout fonctionnera comme un charme, j’espérais vous avoir aidé;)

Il semble que le texte chiffré soit un tampon, c’est-à-dire des données binarys. Ensuite, il est transporté à l’aide de JSON, qui consiste en texte. Vous devez utiliser un codage de texte sur les données binarys pour le transporter sur une interface textuelle.


Vérifiez la définition suivante de la méthode de encrypt :

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

avec le rappel que la valeur par défaut est 'buffer' pour [encoding] .

Donc, vous devriez utiliser:

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

'base64' est utilisé pour le codage en texte chiffré et 'utf-8' pour le codage en texte brut.


La routine de décryptage doit automatiquement utiliser le décodage en base64 du texte chiffré:

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

ça devrait aller.

J’ai eu le même problème.

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

Mais cela a encore échoué.

J’ai changé la lib de node-rsa en ursa , comme ceci:

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

Le problème a été résolu en ursa .