2017-02-13 16 views
0

公開鍵と秘密鍵をファイルストリームから直接読み込み、PublicKeyとPrivateKey Objectに変換することができます。しかし、文字列としてロードすると失敗します。コードメモリストリングを解析して秘密鍵と公開鍵を取得する方法

コード

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); 

} 

を動作しない

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); 
} 

作業

は、私が最初の行を削除せずに試みたが、文字列としてファイルを読み込むしようとします。それらのどれも働かない。これを使う正しい方法を教えてください。 java.security.InvalidKeyException: sun.security.rsa.RSAKeyFactoryで無効なキーの形式

私は取得していますエラーがスレッド "メイン" java.security.spec.InvalidKeySpecExceptionで

例外があります。 ja:MyClass.main(MyClass.java:MyClass.java:136) で j.MyClass.parsePublicKey(MyClass.java:136)での、java.security.KeyFactory.generatePublic(KeyFactory.java:334)の のengineGeneratePublic(RSAKeyFactory.java:205) 223)原因: java.security.InvalidKeyException:キーのフォーマットが無効です sun.security.x509.X509Key.d eCode(X509Key.java:387)at sun.security.x509.X509Key.decode(X509Key.java:403)at sun.security.rsa.RSAPublicKeyImpl。(RSAPublicKeyImpl.java:84)at sun.security.rsa .RSAKeyFactory.generatePublic sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)で(RSAKeyFactory.java:298) ... 3もっと

私のユースケースがあり、

dbからキーを読み込み、変換を行います。

+0

あなたの置き換えコードでは、あなたは '----- BEGIN PRIVATE KEY -----'を使っていますが、キーには '----- BEGIN RSA PRIVATE KEY -----'があります。 pkcs1キーが含まれている場合は、ロードする前にpcks8に変換するか、bouncycastleを使用する必要があります。 http://stackoverflow.com/questions/8290435/convert-pem-traditional-private-key-to-pkcs8-private-key – pedrofb

+0

@pedrofbをご覧ください。申し訳ありませんが、これも試しました。 ----- RSAプライベートキーを始める-----しかし、運はありません。 –

答えて

1

PEMのヘッダーとフッターの行(-----で始まる)内のテキストをデコードするベース64の代わりにcontent.getBytes(StandardCharsets.UTF_8)を使用しています。

+0

これを変更した後 byte [] encoded = Base64.decodeBase64(content);X509EncodedKeySpec x509EncodedKeySpec =新しいX509EncodedKeySpec(エンコード)。 、それは "algid解析エラーではなく、シーケンスエラー"を与える:( –

+0

それはPKCS#8の代わりにエンコードされたPKCS#1は、例えば[この回答](http://stackoverflow.com/q/7216969/589259) –

関連する問題