Написание зашифрованного текста openPGP (по одной строке за раз) с использованием надувного замка - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь выполнить шифрование 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();
  }```
...