Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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