2017-10-29 2 views
0

Der folgende Code entschlüsselt wird, wird verwendet, um einen 2048-Bit-RSA-Public/Private Key zu generieren. Der öffentliche Schlüssel wird an die Android-App gesendet, die zum Verschlüsseln einer Nachricht verwendet wird, die am Dienstende entschlüsselt werden soll.generieren RSA-Public-Key auf dem Server, auf Android senden, die eine Nachricht wiederum verschlüsselt und sendet sie zurück an den Server, auf dem es

Bei Verwendung des privaten Schlüssels führte jede Entschlüsselung zu einer fehlerhaften Padding-Ausnahme.

, der folgende Code verwendet wurde, zu verschlüsseln:

 Cipher cipher = Cipher.getInstance("RSA"); 
     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded); 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     PublicKey pKey = keyFactory.generatePublic(keySpec); 
     cipher.init(Cipher.ENCRYPT_MODE, pKey); 
     encoded = cipher.doFinal(clearText.getBytes()); 
+0

'Cipher cipher = Cipher.getInstance (" RSA ");'. Verlassen Sie sich nicht auf Standardwerte, sondern * immer * geben Sie die vollständige Zeichenfolge "" an. Durch die Verwendung von Standardeinstellungen erhalten Sie anbieterspezifisches Verhalten, das von Natur aus nicht portabel ist. Es war ein Irrglaube der Java-Kryptographie-Entwickler, sogar solches Verhalten zuzulassen, und sich darauf zu verlassen, ist ein Java-Krypto-Anti-Pattern. –

+0

Ja, Sie haben Recht. Aber wenn Sie bemerken, gibt es verschiedene Muster, die von Android akzeptiert werden, aber nicht von Java unterstützt werden und umgekehrt. Also, welches sollte das geeignete Muster sein, das an beiden Enden akzeptabel ist? – sbs

+0

Für jede einigermaßen moderne Plattform "RSA/ECB/OAEPWithSHA-256AndMGF1Padding". Für alte Plattformen, die OAEP nicht unterstützen können, ist "RSA/ECB/PKCS1Padding" –

Antwort

0

Während sowohl der Android und der Service beim Debuggen (mit Spring-Boot als Backend) Ende habe ich festgestellt, dass der Anbieter in Android (einige OpenSSLRSA der Umsetzung ..) und Service (SunRSASign) Ende war anders.

Da ich schon darüber nachdachte, auf Bouncy Castle umzusteigen, musste ich nur noch den Bouncy Castle Provider für beide Plattformen erwähnen und sowohl die Verschlüsselung als auch die Entschlüsselung war erfolgreich.

So:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM, "BC"); 

// OR 

KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC"); 

hoffe, das hilft jemand!

+0

Falsch! Sie müssen keinen Provider angeben und sollten * keinen * Provider angeben, es sei denn, Sie benötigen etwas über einen bestimmten Provider (z. B. der Provider arbeitet mit spezieller Hardware). In Ihrem Fall haben Sie sich auf Standardwerte verlassen und dann nach einer Lösung gesucht. Sie sind über die Tatsache gestolpert, dass Sie mit demselben Anbieter dieselben Standardwerte erhalten. Aber die Verwendung von Standardeinstellungen ist der wahre Fehler. –

Verwandte Themen