2016-01-22 1 views
0

J'essaie de créer un WS pour faire une demande de savon. Dans le corps du message, il y a un champ qui contient un texte crypté. J'ai la clé publique pour crypter le texte mais le seul résultat que j'obtiens est que le texte n'est pas reconnu. J'utilise crypto module de noeud pour faire une requête et le texte est crypté mais je ne sais pas pourquoi n'est pas crypté correctement. Ps i fait la même chose sur php avec la fonction openssl_public_encrypt et de travail. Mais je dois le faire dans node.js.Node.js moyen correct de chiffrer rsa?

Une idée ou une suggestion? Qu'est-ce qui différencie openssl_public_encrypt de la fonction crypto.publicEncrypt?

Voici la partie chiffrent à Node.js:

var crypto = require("crypto"); 
var fs = require('fs'); 

fs.readFile("./certificate.pem", 'utf8', function (err, data) { 
    var bufferToEncrypt = new Buffer("textToEncrypt"); 
    var encrypted = crypto.publicEncrypt({"key":data, padding:crypto.RSA_NO_PADDING}, bufferToEncrypt).toString("base64"); 
    console.log(encrypted); // length 128 
} 

La même chose en php:

<?php 

    $publicKey = "./certificate.pem"; 
    $plaintext = "textToEncrypt"; 

    openssl_public_encrypt($plaintext, $encrypted, $publicKey); 

    echo base64_encode($encrypted); //encrypted string length 128 

?> 

Je n'ai pas la clé privée pour décrypter le texte, je ne dispose que la clé publique. Notez également que la longueur du texte crypté (en base64) est la même en php et en node.js.

+0

Il est peu probable que quiconque puisse vous aider ici à moins d'inclure le code que vous utilisez pour le chiffrement et le décryptage afin que nous puissions voir ce que vous avez et essayer de déterminer ce que vous avez mal fait. – jfriend00

+0

@ jfriend00 Vous avez raison! J'ai mis à jour le poste avec des morceaux de code pour la partie de cryptage – AngelPoyel

Répondre

2

Je suppose que le rembourrage est votre problème. Dans node.js, vous spécifiez padding:crypto.RSA_NO_PADDING. Lorsque vous recherchez le document de openssl_public_encrypt(), il indique qu'il utilise OPENSSL_PKCS1_PADDING par défaut. Effectuez les opérations suivantes:

var constants = require("constants"); 
var encrypted = crypto.publicEncrypt({"key":data, 
    padding:constants.RSA_PKCS1_PADDING}, bufferToEncrypt).toString("base64"); 

J'ai préparé une démonstration en ligne:

  1. Encrypt using node.js
  2. copie la chaîne résultante
  3. et le coller à $encrypted_encoded sur PHP decryption example

Conseil: En règle générale, n'utilisez pas le cryptage asymétrique pour les messages réels. Utilisez-le pour protéger une clé symétrique à la place. Cependant, votre cas d'utilisation est peut-être valide, je veux juste le déclarer chaque fois que quelqu'un parle de cryptage RSA.

+0

Désolé mais en changeant aussi le type de remplissage, selon votre solution, le texte crypté généré n'est pas reconnu par le système. – AngelPoyel

+0

Je vois que la clé publique que j'ai est un certificat. Aussi, j'essaie de créer une clé publique à partir de ce certificat en utilisant openssl, mais ne fonctionne pas – AngelPoyel

+0

@AngelPoyel J'ai corrigé le code, malheureusement les constantes n'étaient pas définies, donc le remplissage était toujours faux. J'ai aussi ajouté quelques démos pour le cryptage node.js et le décryptage php. – Scolytus