Шифрование с подписью с использованием Bouncy Castle: что происходит первым, шифрование или сжатие - PullRequest
0 голосов
/ 08 мая 2020

Я столкнулся с проблемой при выполнении операции шифрования с использованием криптографической подписи c с помощью Bouncy Castle.
Согласно рекомендациям PGP, нам нужно сначала выполнить сжатие, а затем шифрование, но с API надувного замка я просмотрел несколько статей, в которых сначала выполняется шифрование, а затем сжатие.

Также, когда я пытаюсь сначала выполнить сжатие, а затем шифрование, при дешифровании я получаю исключение для того же самого. Но когда сначала выполняется шифрование, а затем сжатие, я могу его расшифровать и проверить.

Кто-нибудь, пожалуйста, помогите мне, какой из них должен произойти первым и соответствующий код расшифровки и проверки в Bouncy Castle. Заранее благодарим за помощь.

Пожалуйста, найдите фрагмент кода ниже:

public static void signEncryptFile(OutputStream out, String fileName, PGPPublicKey publicKey,
        PGPSecretKey secretKey, String password, boolean armor, boolean withIntegrityCheck) throws 
Exception {

    // Initialize Bouncy Castle security provider
    Provider provider = new BouncyCastleProvider();
    Security.addProvider(provider);

    if (armor) {
        out = new ArmoredOutputStream(out);
    }

    // Initialize algorithm and encrypt with Public Key
    BcPGPDataEncryptorBuilder dataEncryptor = new 
    BcPGPDataEncryptorBuilder(PGPEncryptedData.AES_256);
    dataEncryptor.setWithIntegrityPacket(withIntegrityCheck);
    dataEncryptor.setSecureRandom(new SecureRandom());

    PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(dataEncryptor);
    encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey));

    OutputStream encryptedOut = encryptedDataGenerator.open(out, new byte[PGPUtils.BUFFER_SIZE]);

    // Initialize compressed data generator
    PGPCompressedDataGenerator compressedDataGenerator = new 
    PGPCompressedDataGenerator(PGPCompressedData.ZIP);
    OutputStream compressedOut = compressedDataGenerator.open(encryptedOut, new 
    byte[PGPUtils.BUFFER_SIZE]);

    // Initialize signature generator
    PGPPrivateKey privateKey = findPrivateKey(secretKey, password.toCharArray());

    PGPContentSignerBuilder signerBuilder = new 
    BcPGPContentSignerBuilder(secretKey.getPublicKey().getAlgorithm(),
            HashAlgorithmTags.SHA1);

    System.out.println("Public Key Algo " + secretKey.getPublicKey().getAlgorithm());
    System.out.println("Public Key ID " + secretKey.getPublicKey().getKeyID());
    System.out.println("Public Key user id" + secretKey.getUserIDs().next());
    System.out.println("Secret Key ID " + secretKey.getKeyID());

    PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(signerBuilder);
    signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, privateKey);

    boolean firstTime = true;
    Iterator<String> it = secretKey.getPublicKey().getUserIDs();
    while (it.hasNext() && firstTime) {
        PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
        spGen.setSignerUserID(false, (String) it.next());
        signatureGenerator.setHashedSubpackets(spGen.generate());
        // Exit the loop after the first iteration
        firstTime = false;
    }
    signatureGenerator.generateOnePassVersion(false).encode(compressedOut);

    // Initialize literal data generator
    PGPLiteralDataGenerator literalDataGenerator = new PGPLiteralDataGenerator();
    OutputStream literalOut = literalDataGenerator.open(compressedOut, PGPLiteralData.BINARY, 
    fileName, new Date(),
            new byte[PGPUtils.BUFFER_SIZE]);

    // Main loop - read the "in" stream, compress, encrypt and write to the "out"
    // stream
    FileInputStream in = new FileInputStream(fileName);
    byte[] buf = new byte[PGPUtils.BUFFER_SIZE];
    int len;
    while ((len = in.read(buf)) > 0) {
        literalOut.write(buf, 0, len);
        signatureGenerator.update(buf, 0, len);
    }

    in.close();
    literalDataGenerator.close();
    // Generate the signature, compress, encrypt and write to the "out" stream
    signatureGenerator.generate().encode(compressedOut);
    compressedDataGenerator.close();
    encryptedDataGenerator.close();
    encryptedOut.close();
    compressedOut.close();
    literalOut.close();
    if (armor) {
        out.close();
    }
}
...