2017-02-13 3 views
0

Ich bin in der Lage, den öffentlichen und privaten Schlüssel aus der Datei direkt als Dateistream zu PublicKey und PrivateKey-Objekt zu konvertieren. aber wenn als String geladen wird, schlägt es fehl.Wie in Speicherzeichenfolge zu interpretieren, um privaten und öffentlichen Schlüssel RSA

Arbeits Code

public static RSAPrivateKey getPrivateKey(String filename) throws IOException, GeneralSecurityException { 

      PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
        IOUtils.toByteArray(new FileInputStream(filename))); 
      return (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(pkcs8EncodedKeySpec); 
     } 

     public static RSAPublicKey getPublicKey(String filename) throws IOException, GeneralSecurityException { 
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(
        IOUtils.toByteArray(new FileInputStream(filename))); 
      return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec); 
     } 

public static void main(String[] args) throws JOSEException, ParseException, IOException, GeneralSecurityException { 

     String publicKeyPathName = "../public"; 
     String privateKeyPathName = "../private"; 
     /// loading from file 
     RSAPublicKey publicKey = new MYClass().getPublicKey(publicKeyPathName); 
     RSAPrivateKey privateKey = new MYClass().getPrivateKey(privateKeyPathName); 
} 

Nicht Code Arbeiten

public static RSAPrivateKey parsePrivateKey(String content) throws IOException, GeneralSecurityException { 
     content = content.replaceAll("\\n", "").replace("-----BEGIN RSA PRIVATE KEY-----", "") 
       .replace("-----END RSA PRIVATE KEY-----", ""); 
     PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(content.getBytes(StandardCharsets.UTF_8)); 
     return (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(pkcs8EncodedKeySpec); 
    } 

    public static RSAPublicKey parsePublicKey(String content) throws IOException, GeneralSecurityException { 
     content = content.replaceAll("\\n", "").replace("-----BEGIN PUBLIC KEY-----", "") 
       .replace("-----END PUBLIC KEY-----", ""); 
     X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(content.getBytes(StandardCharsets.UTF_8)); 
     return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec); 
    } 
public String getPublicKey() { 
     return "-----BEGIN PUBLIC KEY-----\n" 
       + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAswPxKZWJEQ0RVtiaoFIU" 
       + "jndalEp2sZF87Cy9IxW1FxxcfDmZRlkMDe+5X1lzpOjFHP8mBZa8vhMjSKbJY2wt" 
       + "MyxckbBoTjAIefi34KuD0Q6j9LRt1r1iQ+nMYezk5N83ruqyRHtB4a8AOkw3iE2z" 
       + "zA74uAkCzPiYUrAES1I9mVbpxJZf2Ej0px6drkd4OQ2aPnwR13gWTnmqFWV+Xkl6" 
       + "WapMArewaAUXU9zDqjn4ZpNCkgx6m4CK7PDt+VgYUi+sjI0WzPIb0FMDTYSe1iX6" 
       + "mfIabvoetxUmtyQgu4RfHIiOF0no6VEPh31of2B+KZX2OjHKjyKBGUxUkDLm+J2J" 
       + "CwIDAQAB\n" 
       + "-----END PUBLIC KEY-----"; 
    } 

    public String getPrivateKey() { 
     return "-----BEGIN RSA PRIVATE KEY-----\n" 
       + "MIIEowIBAAKCAQEAswPxKZWJEQ0RVtiaoFIUjndalEp2sZF87Cy9IxW1FxxcfDmZ" 
       + "RlkMDe+5X1lzpOjFHP8mBZa8vhMjSKbJY2wtMyxckbBoTjAIefi34KuD0Q6j9LRt" 
+ "1r1iQ+nMYezk5N83ruqyRHtB4a8AOkw3iE2zzA74uAkCzPiYUrAES1I9mVbpxJZf" 
+ "2Ej0px6drkd4OQ2aPnwR13gWTnmqFWV+Xkl6WapMArewaAUXU9zDqjn4ZpNCkgx6" 
+ "m4CK7PDt+VgYUi+sjI0WzPIb0FMDTYSe1iX6mfIabvoetxUmtyQgu4RfHIiOF0no" 
+ "6VEPh31of2B+KZX2OjHKjyKBGUxUkDLm+J2JCwIDAQABAoIBAFj59p4SoyQEeL/P" 
+ "vVs+MNV24WCfektb4tmIiyGrIm0wPY/JGTPsAp/SrTKFRYOL5p04/G7+syVOYdU0" 
+ "gRiXpgevXvtS0SU7nprxUoOq/EOmoTt5iraXPwY+aMWrd0GC6SxZnu2GzgIcd2KC" 
+ "i3+GD323W0wtvmSekydWMWw2nkNeKCL8WE/GqLjigRzdGl+RVviGC+N3IsZZvcf0" 
+ "toNXTxXBPgtcYYWV7MOLsFQkk1yvKh0ISncswkjmkRChi8KQ178hbIzeBuDq+jlY" 
+ "11epFjNUpyw2Y3jRHHkVSFKFaE6GeBpHMC0ucBJxyRzw19DZ+iPGI2xZBmW+wEOE" 
+ "+khw1WECgYEA6ETt3I9zszzytqh5jBma04EM08+aOw9+CVcCLWSC17vRBOiPGJTE" 
+ "bHq6Ln7+pjIErSTrlXOH6kPV0nRzmSDncsttmNXLKCuJUR5stVl/gQY4uaGesF/x" 
+ "Kk/orw/ddibukXiXHAkduZXC+3Wq4TaYHChUz/QZv/gamPSusi1zBlMCgYEAxU4k" 
+ "gJyKLqKfAXsrX0ilyvwkP4siwzORS1GFU5WfMf0E3ZD/3FMjmhjOLX5vnnWcIFtN" 
+ "ERungsyHF0AG5o23HTHkEIi2aZWnC2GiYfpEAJuLhkx08aO65o26RxeC7MOAgL1y" 
+ "0wC/b8ceIQkQuYbqdrPBywHry7+/vtPbHOggK2kCgYBIv+Y8shXMKyfefFBtyEtN" 
+ "Odt5sEmffA++/yiobRXqWmJyhiDj0xze2WXdUFuUVJBQZwL+8Yu9nXeojl7ytHKp" 
+ "6vut5jDWqSQ+aygjeR/NmtRDmFKq7bIMzbCUvIRiEHmiyMGTv2s3CKhkuItINSBZ" 
+ "mWxPIia6kQxLoj/hgQjJDwKBgGNTU0zrgSS4+RLlzo/JIq1tAVJ72KQr8ZjZESVi" 
+ "zSF9HlXsCOIBeIq6shB09fvveQlQ7RsPsORH0joCIXcvIF+yHf201R+SFuXD4Nsy" 
+ "AcnMhBC3rKd4pT4rWvsu+tn2EVq+BG/0kGrU8nXu+lxrbt0S4Rwxe2K2xPBr9oI2" 
+ "2PsBAoGBAJHPPAire0lHcPi+J8YkVKuzwEfP7NgeLZdtqjiZBCZiLoP8SRm68FJS" 
+ "2UpGX4K7rQhx66H6UwXHylBfush56Z8Y9g7PYel83sy+4bqjod1a5TqNBJMkhDQi" 
+ "DrQmDIfpFoRYcOyB4+BeF/w7wL+R5ofov4T+0vB3ST+aztphp2G4\n" 
+ "-----END RSA PRIVATE KEY-----"; 
    } 

public static void main(String[] args) throws JOSEException, ParseException, IOException, GeneralSecurityException { 

String publicKeyString = new MyClass().getPublicKey(); 
     RSAPublicKey publicKey = new MyClass().parsePublicKey(publicKeyString); 

     String privateKeyString = new MyClass().getPrivateKey(); 
     RSAPrivateKey privateKey = new 
     MyClass().parsePrivateKey(privateKeyString); 

} 

Ich habe versucht, ohne die erste Zeile zu entfernen, und versuchen, die Datei als Zeichenfolge zu lesen. keiner von ihnen oder arbeiten. sag mir den richtigen Weg, dies zu benutzen.

Der Fehler Ich erhalte ist

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: ungültige Schlüsselformat bei sun.security.rsa.RSAKeyFactory. machineGeneratePublic (RSAKeyFactory.java:205) bei java.security.KeyFactory.generatePublic (KeyFactory.java:334) um j.MyClass.parsePublicKey (MyClass.java:136) um j.MyClass.main (MyClass.java: 223) Erstellt von: java.security.InvalidKeyException: ungültiges Schlüsselformat unter sun.security.x509.X509Key.d ecode (X509Key.java:387) unter sun.security.x509.X509Key.decode (X509Key.java:403) um sun.security.rsa.RSAPublicKeyImpl. (RSAPublicKeyImpl.java:84) um sun.security.rsa .RSAKeyFactory.generatePublic (RSAKeyFactory.java:298) bei sun.security.rsa.RSAKeyFactory.engineGeneratePublic (RSAKeyFactory.java:201) ... 3 weitere

Mein usecase ist,

Lesen Sie einen Schlüssel aus der Datenbank und führen Sie die Konvertierung durch.

+0

In Ihrem Ersatzcode verwenden Sie '----- BEGIN PRIVATE KEY -----' aber der Schlüssel hat '----- BEGIN RSA PRIVATE KEY -----'. Wenn es einen Schlüssel pkcs1 enthält, müssen Sie es in pcks8 vor dem Laden konvertieren oder bouncycastle verwenden. Siehe http://stackoverflow.com/questions/8290435/convert-pem-traditional-private-key-to-pkcs8-private-key – pedrofb

+0

@pedrofb Entschuldigung, das habe ich auch versucht. ----- RSA PRIVATE KEY ANFANGEN -----, aber kein Glück. –

Antwort

1

Sie verwenden content.getBytes(StandardCharsets.UTF_8) anstelle der Basis 64 Dekodieren des Textes innerhalb der PEM-Kopf- und Fußzeilen (beginnend mit -----).

+0

nach Änderung dieses zu byte [] codiert = Base64.decodeBase64 (Inhalt); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec (codiert); es gibt "algid parse error, kein sequence error" :( –

+0

Es ist PKCS # 1 codiert anstelle von PKCS # 8 codiert, z. B. [diese Antwort] (http://stackoverflow.com/q/7216969/589259) –

Verwandte Themen