In dem Artikel RSA mit JAVA und PHP – Teil 1 (JAVA -> PHP) habe ich bereits die RSA Verschlüsselung in JAVA und die dazugehörige Entschlüsselung in PHP dargestellt. In diesem Artikel geht es nun um die andere Richtung, also der Verschlüsselung in PHP und dem Entschlüsseln in JAVA. Für die folgenden Codebeispiele benötigen wir die Schlüsel die wir bereits in dem anderen Blogeintrag angelegt haben:
- clientPublicKey.pem
- clientPrivateKey.der
-
Öffentlichen Schlüssel des Clients in PHP importieren, Daten verschlüsseln und in Datei abspeichern:
123456789<?php$publicKey = openssl_get_publickey(file_get_contents('keys/clientPublicKey.pem'));$data = "Geheimer Text....";$encrypted = '';openssl_public_encrypt($data, $encrypted, $publicKey, OPENSSL_PKCS1_PADDING);file_put_contents('/tmp/encrypted', $encrypted); -
Privaten Schlüssel in Java importieren:
123456789File privKeyFile = new File("keys/clientPrivateKey.der");byte[] buffer = new byte[(int) privKeyFile.length()];DataInputStream in = new DataInputStream(new FileInputStream(privKeyFile));in.readFully(buffer);in.close();KeyFactory keyFactory = KeyFactory.getInstance("RSA");RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(new PKCS8EncodedKeySpec(buffer));
-
Verschlüsselte Datei lesen:
123456File cryptedData = new File("/tmp/encrypted");buffer = new byte[(int) cryptedData.length()];in = new DataInputStream(new FileInputStream(cryptedData));in.readFully(buffer);in.close();
-
Entschlüsseln:
12345678Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decrypted = cipher.doFinal(buffer);String data = new String(decrypted);System.out.println(data);
- Sich über die Ausgabe “Geheimer Text….” freuen.
Eine kleine Anmerkung zur RSA Verschlüsselung allgemein, RSA ist im Vergleich zu symmetrischen Verschlüsselungen wie z.B. AES um ca. Faktor 1000 langsamer. Daher eignet sich RSA nur zum verschlüsseln kleiner Daten, für größere Datein verwendet man daher in der Regel ein “Hybrides Verfahren” indem man die Daten mit z.B. AES verschlüsselt und nur den Schlüssel dann mit RSA. So kann der Empfänger dann mit RSA den AES-Schlüssel entschlüsseln und mit diesem dann die Daten an sich. So ein hybrides Verfahren im Zusammenhang mit JAVA,PHP und RSA werde ich in einem meiner nächsten Posts vorstellen.