2017-12-31 106 views
0

Ich muss einen privaten RSA-Schlüssel im Speicher im PEM-Format in eine PrivateKey auf Android konvertieren.PEM zu PrivateKey

Das Problem scheint for public keys gelöst worden zu sein, aber ich kämpfe, um es für einen privaten Schlüssel zu arbeiten. Ich versuche, den folgenden Code:

String pemkey = "MIICWwIBAAKBgQDIuL0SzG1+wgyaoyDyHvYIaG10ePXBHqaKTnYyZfY5RzaEFLE/vBdFN2Di7AMH3/5iN/YFQqLsVjKqzX3E3LM2dJOZ9qSWeYArSyQPbhy0eM/3amwchvtLvhVLm2UqVFLjiPGlyYX3D75ETD5tmgulAc5ZDRtGqYVoLKPmZ0USPwIDAQABAoGAErfDjf65UUJISZ1fw6Rmfic62csz47P3hNtHQ3Dlsra020FQvChOpTpCUzb+G1xkjQU58Iijx9VL+Uiba2HHZmiJX2LgS3KKqKFZKmbKZnZQTiw+2o+4AXhtcAYfSAJE9TgRPEhwhZmzV2cvfUk5AjnOghSn2gGjdD1g4xtH22ECQQD/ZbfEd2HEGqHf6j/AVMW+N/Q1xtYIB8r0CWxF6cNw5iq/8Ce9ujpnAFi0vgtojyKDlgwBp4XMU2C4is49EkFhAkEAyTH96mS8dExAAmi3Mm2seUIEOtKwuLD6BEECecPyZSIOd24tfNbmA7Ri6MpGjyLZoNoJQ0AJGcnWU1tnc8bXnwJAS+jYyP1OwrHDwUDnt+u6ZoJNBJrXzMU8LnKKivEjFPBkbm4b8cljSHAS7Y266FX6xS+Y2/kFzKhPjCo9iGtfoQJAOv39hYyj9TWmTw6FKLQfri49L0I3ru+1Xynwn+NkX2Ls+vfDPqeEKfHqTneA2NdPGGrV7HIKORWFUkuqubfD4QJAK60RuhDSeH+ZljcYLhbHLoTnja/uTcvDAd0M4ll2HUNId4jPbYl1qw7OQwfg8apKmGwp7HGW50o/EItvvJrR7w=="; 
byte[] encoded = Base64.decode(pemkey, Base64.DEFAULT); 
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PrivateKey sessionkey = kf.generatePrivate(keySpec); 

(Der Schlüssel ist nicht das gleiche wie für meine Bitcoin Brieftasche so nicht die Mühe machen ^^)

Die letzte Zeile

java.security.spec.InvalidKeySpecException: 
     Must use RSAPublicKeySpec or PKCS8EncodedKeySpec; 
     was java.security.spec.X509EncodedKeySpec 
den Fehler gibt

Ich testete die pemkey Zeichenfolge in anderen Sprachen (zB Python RSA.importkey) in Ordnung zu sein, und es funktioniert gut.

Edit:

Auf Vorschlag durch einen Kommentar (und die Antwort auf die als doublicate verknüpfte Frage), habe ich auch mit X509EncodedKeySpec durch PKCS8EncodedKeySpec ersetzt versucht. Dann ist der neue Fehler, den ich bekomme,

+0

Können Sie versuchen, 'PKCS8EncodedKeySpec' für den privaten Schlüssel und' RSAPublicKeySpec' für den öffentlichen Schlüssel zu verwenden. Sagen Sie mir, wenn es funktioniert, aber sicher müssen Sie den neuen privaten Schlüssel verwenden – Greggz

+0

Ich bekomme 'java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: Fehler: 0D0680A8: ASN1 Codierung Routinen: ASN1_CHECK_TLEN: falsches Tag' nach dem Ersetzen' X509EncodedKeySpec' von 'PKCS8EncodedKeySpec'. – matec

+0

Mögliches Duplikat von [Android RSA privaten und öffentlichen Schlüssel speichern] (https://stackoverflow.com/questions/28306782/android-save-rs-a-private-and-public-key) – Greggz

Antwort

1

Dank Kommentare von Greggz und James konnte ich es zur Arbeit bekommen. Es gab zwei Probleme:

  • X509EncodedKeySpec hatte durch PKCS8EncodedKeySpec ersetzt werden
  • Die bereitgestellten pemkey wurde PKCS # 1 (von erkannt werden 'BEGIN RSA PRIVATE KEY'), muss aber PKCS # 8 (sein erkannt von "BEGIN PRIVATE KEY").
+0

Schwer zu erkennen, warum Sie das ursprünglich auf Base-64 umgestellt haben. Es war schon größtenteils. – EJP

Verwandte Themen