Я столкнулся с проблемой при выполнении операции шифрования с использованием криптографической подписи 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();
}
}