2011-12-09 31 views
4

で秘密鍵を読む私は、PKCS#8形式DER形式のJava

public void encryptHash(String hashToEncrypt, String pathOfKey, String Algorithm) { 
    FileInputStream fis = null; 
    byte[] encodedKey = null; 
    try { 

     File f = new File(pathOfKey); 
     encodedKey = new byte[(int)f.length()]; 

     fis = new FileInputStream(f); 
     fis.read(encodedKey); 
     fis.close(); 

     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(encodedKey)); 

     Signature rsaSigner = Signature.getInstance("SHA1withRSA"); 
     rsaSigner.initSign(privateKey); 

     fis = new FileInputStream(hashToEncrypt); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     byte[] buffer = new byte[1024]; 
     int len = 0; 
     while ((len = bis.read(buffer)) >= 0) { 
      try { 
       rsaSigner.update(buffer, 0, len); 
      } catch (SignatureException ex) { 
       Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     bis.close(); 

     byte[] signature = rsaSigner.sign(); 

     System.out.println(new String(signature)); 

    } catch (SignatureException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InvalidKeyException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InvalidKeySpecException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchAlgorithmException ex) { 
     Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     try { 
      fis.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(DataEncryptor.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

で秘密鍵を読み取るために、次のコードを持っているしかし、私は次の例外を取得しています。

dic 09, 2011 1:59:59 PM firmaelectronica.DataEncryptor encryptHash 
Grave: null 
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error 
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217) 
    at java.security.KeyFactory.generatePrivate(KeyFactory.java:372) 
    at firmaelectronica.DataEncryptor.encryptHash(DataEncryptor.java:40) 
    at firmaelectronica.FirmaElectronica.main(FirmaElectronica.java:39) 
Caused by: java.security.InvalidKeyException: IOException : DER input, Integer tag error 
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:361) 
    at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:367) 
    at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91) 
    at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75) 
    at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316) 
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213) 
    ... 3 more 

何が間違っていますか?私はOpenSSL openssl pkcs8 -inform DER -in aaa010101aaa_FIEL.key -out aaa010101aaa_FIEL_key.pemでこれを試してみましたが、動作しますが、DER形式のキーを読みたいときは、その例外を送信します。

答えて

4

よくこのスレッドを見てEncrypting with RSA private key in Java答えを見つけました。

まず

openssl pkcs8 -inform DER -in myDERPassProtectedPrivate.key -outform PEM -out myPEMPrivate.key

が、それは私のパスワードを私に尋ねた後、私は一度、このパスワードを取り除くために進んで行って、ファイルmyPEMPrivate.keyを持っていた次のように私は、キーの保護を解除しなければなりませんでしたこれで

openssl pkcs8 -topk8 -nocrypt -in myPEMPrivate.key -outform DER -out myNotAnyMoreProtectedPrivate.key

を次のようにキーを保護し、私は今、上記のコードでキーをロードすることができますよ。 Javaでパス保護されたキーを使用する場合は、キーストアを使用することを強くお勧めします。

P.S.私はopenssl pkcs8 -topk8 -nocrypt -inform der -in myDERPassProtectedPrivate.key -outform der -out myDERNoPassProtectedPrivate.keyとキーを保護するパスワードを取り除くために2つの手順を回避しようとしましたが、なぜ私はエラーがあったのかわかりません鍵を復号化するエラー私はWinOpenSSLを多分使用したので、

0

使用この:

入力ファイルのパスワードソース引数-passin。 argの形式の詳細については、openssl(1)のPASS PHRASE ARGUMENTSセクションを参照してください。

コマンドは次のようになります。

opensslのPKCS8 -inform DER -in myDERPassProtectedPrivate.key -outform PEM -passin渡す:myPEMPrivate.key

-out 12345678a

をOpenSSLウェブサイトhttps://www.openssl.org/docs/apps/pkcs8.html