Ответ 1
Попробуйте посмотреть эту тему. Я только что кратко остановился на этом, но я думаю, что это то, что вам нужно. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/
Я хочу дешифровать файл с помощью ключей PGP.
Я загрузил установщик ключей PGP и установил. Используя это, я создал текстовый файл и зашифровал текстовый файл, используя клавиши PGP.
Затем я получил файл расширения .pgp, который зашифрован. Теперь я хочу расшифровать один и тот же файл, используя Java-код, используя PGP.
В Java, как дешифровать текстовый файл, который уже зашифрован с помощью ключей PGP?
Попробуйте посмотреть эту тему. Я только что кратко остановился на этом, но я думаю, что это то, что вам нужно. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/
Я написал полный код на Java с API BounceCastle и OpenPGP. В этом исходном коде вы найдете способ генерации пары ключей, шифрования и дешифрования файлов. Взгляните на: https://github.com/damico/OpenPgp-BounceCastle-Example
Вы можете написать простую оболочку вокруг 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()
}
BouncyCastle имеет определенную поддержку OpenPGP ( "определенная", потому что упоминается только RFC 2440, а не RFC 4880, который является более поздним). Также вы можете посмотреть пакет OpenPGPBlackbox нашего SecureBlackbox (версия Java), который обеспечивает полную поддержку OpenPGP, включая доступ LDAP к ключам и другим продвинутым функции.
Попробуйте взглянуть на 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();