web-dev-qa-db-ja.com

Javaを使用したPGP暗号化および復号化

PGPキーを使用してファイルを復号化します。

PGPキーインストーラーをダウンロードしてインストールしました。それを使用して、テキストファイルを作成し、PGPキーを使用してテキストファイルを暗号化しました。

次に、暗号化された.pgp拡張子ファイルを取得しました。ここで、PGPを使用してJavaコードを使用して同じファイルを復号化します。

Javaでは、PGPキーを使用して既に暗号化されているテキストファイルを復号化するにはどうすればよいですか?

31
user1216228

このトピックを参照してください。簡単に見てみましたが、必要なものだと思います。 http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-Java/

6
MikhailSP

基本的にJavaからGPGコマンドを実行するGNU PGPの周りに単純なラッパーを書くことができます。

GNU PGPを使用することの利点は、特定のライブラリに縛られないことです。サードパーティライブラリでオンラインで利用できるドキュメントとサポートの量は、ほとんどの場合、他の暗号化スキームほど豊富ではありませんコマンドラインからPGPを起動するPGPキーは、複数のファイルにエクスポートされるのではなく、ユーザー固有のキーリングなど、1つの共通の場所に留まります。

復号化のためのGPGコマンドは

echo "password" | gpg --passphrase-fd 0 --output plaintext.txt --decrypt encrypted.gpg

Passphrase-fdを0に指定すると、標準入力ストリームを介してパスワードを提供できます。

Javaコードは次のようになります-

public static void decryptFile(String privKeyPass) {
    String[] cmd = new String[];
    int i = 7;
    cmd[i++] = "gpg";
    cmd[i++] = "--passphrase-fd";
    cmd[i++] = "0";
    cmd[i++] = "--output";
    cmd[i++] = "plaintext.txt";
    cmd[i++] = "--decrypt";
    cmd[i++] = "encrypted.gpg";
    Process process = Runtime.getRuntime().exec(cmd);

    BufferedWriterout = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
    out.write(privKeyPass);
    try {
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
   // Read process.getInputStream()
   // Read process.getErrorStream()
}
6
sunnyside

Java BounceCastle APIとOpenPGPを使用して完全なコードを作成しました。このソースコードでは、キーペアの生成、ファイルの暗号化と復号化の方法を確認できます。 https://github.com/damico/OpenPgp-BounceCastle-Example

6
Damico

BouncyCastle はOpenPGPをサポートしています(「特定の」RFC 2440のみに言及しており、最近のRFC 4880には言及していないため)。また、SecureBlackbox(Javaエディション)の OpenPGPBlackbox パッケージをご覧ください。これは、キーへのLDAPアクセスやその他の高度な機能を含むOpenPGPの完全なサポートを提供します。

JCA CryptoSpec をご覧ください。 PGPについてはわかりませんが、目的のプロバイダーを見つけることができると思います。

私が覚えている限り、コードは次のようなものでなければなりません:

// get cipher object for password-based encryption
Cipher cipher1 = Cipher.getInstance("PBEWithMD5AndDES");//You have to pass here algorithm name which PGP uses. May be you have to find and init provider for it.

// initialize cipher for decryption, using one of the 
// init() methods that takes an AlgorithmParameters 
// object, and pass it the algParams object from above
cipher1.init(Cipher.DECRYPT_MODE, myKey, algParams);


FileInputStream fis;
FileOutputStream fos;
CipherInputStream cis;

fis = new FileInputStream("/tmp/a.txt");
cis = new CipherInputStream(fis, cipher1);
fos = new FileOutputStream("/tmp/b.txt");
byte[] b = new byte[8];
int i = cis.read(b);
while (i != -1) {
    fos.write(b, 0, i);
    i = cis.read(b);
}
fos.close();
1
MikhailSP