Я пытаюсь выполнить шифрование PGP в потоке (из строк), записанном в файл с использованием надувного замка. Я перешел по приведенным ниже ссылкам, чтобы придумать код, используя версию 64-битного замка для шифрования всего файла.
Но я не могу выяснить, есть ли способ зашифровать одну строку за раз и записать в файл.
Как зашифровать строку / поток с помощью bouncycastle pgpбез запуска с файлом
https://github.com/bcgit/bc-java/blob/master/pg/src/main/java/org/bouncycastle/openpgp/examples/KeyBasedLargeFileProcessor.java
Если я вызову методы шифрования, как это: сгенерированный файл выглядит нормально, так как я могу расшифровать его с помощью инструмента GPG Keychain
byte[] output = encrypt(IOUtils.toByteArray(is), publicKey, "FileName", true, false);
FileUtils.writeByteArrayToFile(new File(enryptedFile), output);
Когда я пытаюсь сделать что-то вроде этого: инструмент GPG Keychain сообщает неверные данные, не может расшифровать
GPPublicKey publicKey = getKeyFromFile(Paths.get(ClassLoader.getSystemResource("pubkey.asc").toURI()));
InputStream is = Files.newInputStream(Paths.get(OriginalFile));
BufferedReader ClearTextBufferedReader = new BufferedReader(new InputStreamReader(is));
FileOutputStream outputStream = new FileOutputStream("Encrypted_Line_By_Line_Test.csv.gpg",
true);
ClearTextBufferedReader.lines().forEach(line -> {
try {
//line = new StringBuffer(line).append(System.lineSeparator()).toString(); tried adding a new line, didnt work either
byte[] outputBytesArray = encrypt(line.getBytes(), publicKey, "Test_File_Name_In_PGP", true, false);
outputStream.write(outputBytesArray);
System.out.println(new String(outputBytesArray));
} catch(IOException | NoSuchProviderException | PGPException e) {
e.printStackTrace();
}
});
Или это
String line = "Hello World" + System.lineSeparator();
byte[] outputBytesArray = encrypt(line.getBytes(StandardCharsets.UTF_8), publicKey, "Test_File_Name_In_PGP", true, false);
outputStream.write(outputBytesArray);
outputStream.close();
Методы шифрования:
public static byte[] encrypt(byte[] clearData, PGPPublicKey encKey, String fileName, boolean withIntegrityCheck,
boolean armor) throws IOException, PGPException, NoSuchProviderException {
if (fileName == null) {
fileName = PGPLiteralData.CONSOLE;
}
byte[] compressedData = compress(clearData, fileName, CompressionAlgorithmTags.ZIP);
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
OutputStream out = bOut;
if (armor)
{
out = new ArmoredOutputStream(out);
}
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5)
.setWithIntegrityPacket(true)
.setSecureRandom(new SecureRandom())
.setProvider("BC"));
encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey)
.setProvider("BC"));
OutputStream encOut = encGen.open(out, compressedData.length);
encOut.write(compressedData);
encOut.close();
if (armor)
{
out.close();
}
return bOut.toByteArray();
}
private static byte[] compress(byte[] clearData, String fileName, int algorithm) throws IOException
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(algorithm);
OutputStream cos = comData.open(bOut); // open it with the final destination
PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();
OutputStream pOut = lData.open(cos, PGPLiteralData.BINARY, fileName, clearData.length, new Date());
pOut.write(clearData);
pOut.close();
comData.close();
return bOut.toByteArray();
}```