【发布时间】:2016-08-30 20:40:29
【问题描述】:
我正在为将发送电子邮件的服务器编写模块。在客户端应用程序中,用户可以添加许多收件人,每个收件人都有自己的公钥。我想使用多个密钥加密附件。例如,如果我添加 3 个收件人,则附件应使用 3 个不同的公钥加密。我正在使用充气城堡来做到这一点,但它仅适用于加密过程中的第一个公钥。我的意思是只有第一个人可以使用自己的私钥解密,其余的则不起作用。 我为每个键添加方法的代码如下所示:
PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(dataEncryptor);
for (PGPPublicKey publicKey : publicKeys) {
encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey));
}
整个方法看起来像:
public File encryptFile(String fileName,
boolean armor,
boolean withIntegrityCheck) throws IOException,
NoSuchProviderException,
PGPException {
Security.addProvider(new BouncyCastleProvider());
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
PGPCompressedDataGenerator comData
= new PGPCompressedDataGenerator(PGPCompressedData.UNCOMPRESSED);
PGPUtil.writeFileToLiteralData(comData.open(bOut),
PGPLiteralData.BINARY,
new File(fileName));
comData.close();
BcPGPDataEncryptorBuilder dataEncryptor
= new BcPGPDataEncryptorBuilder(PGPEncryptedData.AES_256);
dataEncryptor.setWithIntegrityPacket(withIntegrityCheck);
dataEncryptor.setSecureRandom(new SecureRandom());
PGPEncryptedDataGenerator encryptedDataGenerator
= new PGPEncryptedDataGenerator(dataEncryptor);
for (PGPPublicKey publicKey : publicKeys) {
encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey));
}
byte[] bytes = bOut.toByteArray();
FileOutputStream localByteArrayOutputStream = new FileOutputStream(fileName);
Object localObject = localByteArrayOutputStream;
if (armor) {
localObject = new ArmoredOutputStream((OutputStream) localObject);
}
OutputStream localOutputStream = encryptedDataGenerator.open((OutputStream) localObject,
bytes.length);
localOutputStream.write(bytes);
localOutputStream.close();
return new File(fileName);
}
有人可以帮助我并告诉我我做错了什么吗?
感谢您的每一个帮助。
[编辑] 此代码有效,我在加载多个键的方法时遇到问题。
【问题讨论】:
-
查看stackoverflow.com/questions/38846/…了解更标准的方法
-
我知道我需要生成对称密钥,用它来加密文件,然后使用每个公钥加密这个密钥,但我不知道如何使用 bouncycastle 来做到这一点。我需要使用任何使用 OpenPGP 标准的程序进行解密。
标签: java encryption rsa bouncycastle public-key-encryption