2009-09-21 19 views
33

JavaアプリケーションのGnuPGを使用して、ディスク上のファイルやメモリ内のデータを暗号化したいと考えています。可能であれば、私はGPGコマンドラインツールにシステムコールを出す必要がないようにしたいと思っています。Java/Scala用の優れたGnuPG暗号化ライブラリはありますか?

推奨ライブラリはありますか、Java(またはScala)からのGPG暗号化に最適なアプローチをお勧めしますか?

私は、Linux環境でアプリケーションを開発し、実行する予定ですが、クロスプラットフォームのソリューションが望ましいでしょう。

答えて

21

BouncyCastle.orgというJAVA APIを呼び出すことができます。

弾む城のCryptoパッケージは、暗号化アルゴリズムのJava実装である:言及documentation

その。

ここにはan example of openpgp ByteArrayHandlerがあります。

BouncyCastleはGnuPGを使用せず、OpenPGP(RFC2440)をJavaで実装しているため、incompatibility between BouncyCastle encryption and GnuGP encryptionがあるかもしれません。

+0

おかげ - 有望に見えます。 GnuPGで動作させることができるかどうかを報告します。相互に互換性のあるオプションを慎重に選択するだけのようです。 –

+6

これは今動作するようになっています。特にorg.bouncycastle.openpgp.examples.KeyBasedFileProcessorのサンプルコードを見ることをお勧めします。鍵リングコレクション内の希望の公開鍵を見つけて、標準のJDKで提供されているJCE実装が無効になっていることを確認し、「Java Cryptography Extension(JCE)Unlimited Strength JurisdictionポリシーファイルSun Webサイトから「6」を選択します。 –

+1

@James Shade:フィードバックいただきありがとうございます。非常に有益。 – VonC

3

私は最近、GPG暗号化/復号化に取り組み、BountyCastleのPGPライブラリがそのトリックをしていることを発見しました。手順は、実装クラスで)

 <!-- Dependency for PGP and GPG Encryption-Decryption --> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcmail-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcpg-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 

3以下の依存関係を追加)

 <org.bouncycastle.version>1.46</org.bouncycastle.version> 

2のpom.xmlのプロパティでバージョンを追加)

1たJavaセキュリティとプロバイダを添加

  Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

4)残りのコードは単なるJavaの実装

File encryptedFile = new File(encryptedFileName); 
    byte[] encryptedByteArray = FileUtils.readFileToByteArray(inputFile);  
    byte[] decryptedByteArray = ByteArrayHandler.decrypt(encryptedByteArray, passPhrase.toCharArray()); 
    String decryptedString = new String(decryptedByteArray); 

これが役立ちます。

+0

こんにちは、あなたはそれをちょっと詳しく説明できますか? Iamはそれに問題があります。 – surhidamatya

+1

上記のコードを使用してクラスキャスト例外が発生します。PGPPublicKeyEncryptedDataをPGPPBEEncryptedDataにキャストできません。 :-( –

+0

@ ShintaSmithと同じ – TomazStoiljkovic

2

https://github.com/smartrevolution/gnupg-for-javaはgpgmeに基づいており、GnuPG 1.4の上で動作します。 GnuPG 2.x用にアップデートしており、Androidアプリで使用しています。あなたは、こちらにコードを取得することができます。答えを

+0

gnupg-for-javaを使ってメッセージを解読するためのテストアプリを作ったところ、解読は成功しましたが、結果を返す前に 'fclose'でクラッシュしました。 gpgmeの使い方はfcloseではなくgpgme_data_releaseですので、すぐに使える解決策のようには見えません。例:リポジトリに用意されているようにうまくいきました。 – Alexey

+0

gnupg-for-javaのフォークは、確かにいくつかの仕事を使用しますが、それは完全に機能します。いくつかの厄介な問題があります。 –

関連する問題