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.
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
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
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