2016-03-25 18 views
2

Ich verschlüssele Daten im Browser mit JS und versuche dann, sie im Backend mit PHP zu entschlüsseln.Wie kann ich Daten, die von npm-rsa in PHP erstellt wurden, entschlüsseln?

In JS verwende ich npm-rsa, die mit browserify erstellt wurde.

key = new rsa({ 
      environment: 'browser', 
      encryptionScheme: 'pkcs1_oaep', 
      signingScheme: 'pkcs1-sha256', 
      b: 2048 
     }); 

cleartext = 'this is a test'; 
console.log(key.encrypt(cleartext, 'base64')); 
console.log(this.key.exportKey('pkcs8-private-pem')); 

Ich nehme dann meinen öffentlichen Schlüssel und Schlüsseltext zu PHP:

$rsa = new RSA(); 
$rsa->load($privkey, 'pkcs8'); 
$cleartext = $rsa->decrypt(base64_decode($cyphertext)); 

Als ich dies ausführen, $cleartext ist null In PHP, ich phpseclib

Meinen JS verwenden. Unter Verwendung von Xdebug kann ich sehen, dass $rsa->load($pubkey, 'pkcs8'); anscheinend die Modulo-, Exponenten-, Primzahl-, Koeffizienten-, usw.-Felder von $rsa aufzufüllen scheint.

Ich habe sogar versucht $rsa->setHash('sha256'); vor dem Aufruf decrypt(), aber es ist mein Verständnis, dass die Hash-Methode nur für die Verschlüsselung verwendet wird und nicht einmal in der Entschlüsselung verwendet.

Auch ich verstehe, dass dies nicht sicher ist, weil ich den privaten Schlüssel teile. Ich versuche nur, die Kompatibilität zwischen den beiden Bibliotheken zu überprüfen.

Ich habe getestet, dass ich mit beiden Bibliotheken unabhängig verschlüsseln und entschlüsseln kann, aber einen Schlüssel von der JS-Bibliothek zur PHP-Bibliothek nehmend, kann ich nicht arbeiten.

EDIT: Exportierte privaten Schlüssel:

-----BEGIN PRIVATE KEY----- 
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDX7/224Phogd/B 
4DGOf81GeNAkE0bAWieN9Tmq6S1Xe0iMY56J9hJ86HveCcJcJCMNAJtGVPjOObNf 
HZ58CUrqyMoj6VJ8wXGVPZuwkvBQrVFg4k/h+8+b3p5Z0cb8J9m8WWpnL/hifoyt 
9O7aEiSnkvHBWBgEK6qxEYVLJKUPI94HlZe4B+ScCaflUMw1/uMfp1pVGxVUAfER 
f8URfCjCUY8cL+yFNQ5/CVNMQ8CTlb6HItpfS/QVBqTUD3wNf97oFZDPzbFfFCD7 
M50NbCal6CfRTaMBPoWrhsUGVab/Nj81qcY7dpoYEFyLLnJ80jHR6+o1fKDSinuQ 
KIYkQ9PxAgMBAAECggEBANKs7tgx/anYrDo3RaJFxjzvOgM4W1rnmpfBnRXGkdo8 
CbgOqWrojXkYSWGEHABRsXDKGrQvyt9JJFu0Rh+14UXXyH/o7/WPtgVpKjDH63aK 
4k6n/k/4ocDtHYl8RatWJfTBODKcdrWByjceNLrF4MUtdHiyPhwzjkFbWrTJd9Cf 
3wEh0aD83JT/wg1VkRYEOdJTPeq2kCpgoukBFXYAnGj9DYL2+Kityhnx/GB0RG/8 
GGpMyG8R72P6zYkXr0YfLhGLlW7+XbLT+WiPThjT9+e00uPAKMj7d0qaerKR6Asf 
NGSAg83eWG9ZKT1GXtn8mOP6p+15DcVLBbFXvPAA/cECgYEA7IYRWGNhEJ9l+XJH 
DYQVndS9KN8+zMx5OM/wy47v9FiiwGdAnwwHFAX3GyZe6eJ2sAX73tPm56QadRPK 
HGZFNnYx3BBdcl7WKT13DrmgpsH9CO6ish+2TwHfYDqOKs5EvT3yHJIG4T/Z50JM 
bUKSdrndV6LtOT2gplLxjUwastUCgYEA6bf23y5p8t9Unn55bIYKdFWj/5kLJdI1 
d/MBP3eZ405veVzZqvhs04JscElx1M0U1mTx7g96IWnBTuqsgkU9TLlXg8N5nLM0 
AWVlFlu657NwJaAc9zfmaamI4UKwNHCXDoxx+u2zJuzNOJwttPV3d7NTBWZOh+P+ 
DEgAzNYOEq0CgYEA42Oo/U7dnHuCMCTbhnT7yzchfE/UMlRKHoJbP3f13PXx0gPy 
LnYDwA5UGLf0++oKrQOzt/AEx6IPBYu2/UKdO9S57pWVIUVno1JCSdfQSUGqoJG7 
vH+cZ6ynMf5Ze3G+yCjrwOfq0VbviNNGYqxj3tylnYE3i5ZiAkUvkOYfrNkCgYBa 
rZBvyN88Zt+62pEbxOm7dxq46VUE6IjsL/EVAb9IDL99U8Pz7Iy0h06xRh2PFb52 
7BVdas3UtuZUSwKBTIHbCbHlomrFnFWaEQ/mW9KpYNorDvMOC7cu2aMM2sXooqJI 
976lP6IZgRiiVR36rp4aaA3W83mWiaOgejMtRgORxQKBgQDTMG0Wl3FbPZ57uqmi 
rE2Gwr1TiZ7LcYSEt4Z7KQV/u0Q7b9hyNXctaK2DzcEz+wA1eiAzioC9ZULOVVvW 
xZzVvj2D741A6EXMITa3E/Wv1XkbotNg8RXG8lvNY/IJ+35TZGBNzJ4gD+n0lOCK 
IrdIMYPrt9dcGIqqRE4wwaeLmA== 
-----END PRIVATE KEY----- 

Chiffriertext:

mbPLBF3YNmyb5AD1vk6D8K0C9AiRU3C2a2aCKXpzDXb1uUCy7KYUFB3bOoU4ZhU7RXcWr9VHZq3APxtdyqKyEqr48NqVEPeBuYsDjcgDfPBFdPXf36f1FveeCJ7cFtHIvGy9/2EHIyNyXKy/6VaoakGRwBB3V14shXdqCDIW2FfEdUcfka5X8sAroq9pKrTGbN21hwtbiAjP2MmTHDYWu1zhDmrKxdcBbP6wdBgnZodCwGhBw11uXoEAnL1/yYFFqGZeKAhzxfjdPY2irvAuQOPN3U7UDBF0zhyMNF07JbCccCsNIguX4esferShw8w1mVzAxgwHzbjDpudko1/VSg== 

gespeichert ich diese in zwei Dateien, privatekey.pem und cypher.text. Dann Base64 ich die Chiffriertext decodiert:

cat cypher.text | base64 --decode > -in cypher.bin 

Und Verwendung OpenSSL zu entschlüsseln diese:

openssl rsautl -decrypt -inkey privatekey.pem -in cypher.bin -oaep 

Das gibt mir die unverschlüsselt! Es scheint also, dass phpseclib ein Problem bei der Decodierung hat.

+0

Wissen Sie nicht genug In welcher Reihenfolge arbeiten RSA und base64? Wenn Ihr JavaScript zuerst mit base64 codiert und dann verschlüsselt, macht Ihr PHP es andersherum und die Entschlüsselung/Entschlüsselung wird 'null' zurückgeben, weil es nicht mit dem bereitgestellten Format arbeiten kann. – Glubus

+0

Die JS-Version glaube ich verschlüsselt, dann codiert Base64. Die resultierende Ausgabe ist Base64 sicher. Dann nimmt die Funktion in PHP normalerweise eine Bytefolgeneingabe, also entschlüssele ich sie manuell, bevor ich sie in die Entschlüsselungsmethode einfüge. Ich habe versucht in beiden Bibliotheken zu überprüfen, dass dies die Formate sind, die sie eingeben und ausgeben. – DAB

+0

Alrighty (vielleicht möchten Sie dies in Ihre Frage bearbeiten), haben Sie verifiziert, dass das Senden des Ciphertext gut geht, wie in ... ist '$ cyphertext' gesetzt? (tut mir leid dass ich gefragt habe).Überprüfen Sie außerdem, ob der Chiffretext vor der Kodierung nach der Dekodierung gleich dem Chiffretext ist. – Glubus

Antwort

1

Es stellt sich heraus, dass der Hash in der Entschlüsselungsverfahren eingestellt werden muss mit beiden:

$rsa->setMGFHash('sha1'); 
$rsa->setHash('sha1'); 

Obwohl ich es mit setHash() versucht hatte, ohne auch in setMGFHash()