Шифрование и дешифрование PGP с помощью Java

Я хочу расшифровать файл с помощью ключей PGP.

Я скачал установщик ключей PGP и установил. Используя это, я создал текстовый файл и зашифровал текстовый файл с помощью ключей PGP.

Затем я получил файл с расширением .pgp, который зашифрован. Теперь я хочу расшифровать тот же файл, используя код Java, используя PGP.

В Java, как расшифровать текстовый файл, который уже зашифрован с помощью ключей PGP?


person user1216228    schedule 07.03.2012    source источник


Ответы (5)


Вы можете написать простую оболочку вокруг GNU PGP, которая в основном выполняет команду GPG из Java.

Преимущество использования GNU PGP в том, что вы не будете привязаны к конкретной библиотеке. Объем документации и поддержки, доступных в Интернете для сторонних библиотек, не так богат, как у других схем шифрования, поскольку большинство из них вызывает PGP из командной строки. Ключи PGP также останутся в одном общем месте, то есть в наборе ключей для конкретного пользователя, а не будут экспортированы в несколько файлов.

Команда GPG для расшифровки

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

Указав парольную фразу-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()
}
person sunnyside    schedule 22.05.2015

Я написал полный код на Java с BounceCastle API и OpenPGP. В этом исходном коде вы найдете, как сгенерировать пару ключей, зашифровать и расшифровать файлы. Взгляните на: https://github.com/damico/OpenPgp-BounceCastle-Example

person Damico    schedule 04.05.2014
comment
этот проект работал у меня после экспорта файла ключа без маски ascii и установки библиотеки JCE. - person 4F2E4A2E; 23.06.2014

Попробуй посмотри эту тему. Я только что взглянул на него, но я думаю, что это то, что вам нужно. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/

person MikhailSP    schedule 07.03.2012
comment
Как и в большинстве других ответов здесь, ссылка на запись в блоге использует пакеты Java Bouncy Castle. Сама кодовая база Bouncy Castle включает множество примеры PGP. Если вы хотите, чтобы эти примеры были выделены в отдельный проект с зависимостями Bouncy Caste, извлеченными Maven, см. примеры openpgp-bc. - person George Hawkins; 21.06.2016

BouncyCastle имеет определенную поддержку OpenPGP ("определенно", потому что они упоминают только RFC 2440, а не RFC 4880, который является более новым ). Также вы можете ознакомиться с пакетом OpenPGPBlackbox нашего SecureBlackbox (версия Java), который обеспечивает полную поддержку OpenPGP, включая доступ LDAP к ключам и другим расширенным функциям.

person Eugene Mayevski 'Callback    schedule 07.03.2012
comment
BouncyCastle теперь также поддерживает RFC4880. - person Saumyaraj; 19.07.2016

Попробуйте взглянуть на 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();
person MikhailSP    schedule 07.03.2012