gpt4 book ai didi

java - 使用多个 RSA 公钥加密

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:15:04 24 4
gpt4 key购买 nike

我正在为将发送电子邮件的服务器编写模块。在客户端应用程序中,用户可以添加许多收件人,每个收件人都有自己的公钥。我想使用多个 key 加密附件。例如,如果我添加 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);
}

有人可以帮助我并告诉我我做错了什么吗?

感谢您的每一次帮助。

[编辑]此代码有效,我在加载多个键的方法时遇到问题。

最佳答案

好吧,一年后我遇到了同样的问题。我希望你已经解决了你的问题。我在这里写下我的解决方案,以防其他人遇到类似问题。

您的加密代码没有问题。问题可能出在解密中。对于加密的数据对象,应该使用与对象一起存储的 key ID 找到正确的 key 。我的解密过程如下所示:

private byte[] decryptWithKey(byte[] bytes, PGPSecretKey secKey, String pass)
throws PGPException, IOException {
PBESecretKeyDecryptor keyDec = new JcePBESecretKeyDecryptorBuilder(
new JcaPGPDigestCalculatorProviderBuilder().setProvider("BC").build())
.setProvider("BC").build(pass.toCharArray());
ByteArrayOutputStream bout = new ByteArrayOutputStream();

PGPPrivateKey privateKey = secKey.extractPrivateKey(keyDec);
PublicKeyDataDecryptorFactory dec1 =
new JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").build(privateKey);
JcaPGPObjectFactory objFact = new JcaPGPObjectFactory(bytes);
PGPEncryptedDataList encList = (PGPEncryptedDataList) objFact.nextObject();

PGPPublicKeyEncryptedData encD = null;
for(Iterator<PGPPublicKeyEncryptedData> it = encList.iterator(); it.hasNext(); ) {
PGPPublicKeyEncryptedData end = it.next();
if (secKey.getKeyID() == end.getKeyID()) {
encD = end;
break;
}
}
assert encD != null: "Cannot find encrypted data with key: "
+ Long.toHexString(secKey.getKeyID());
InputStream in = encD.getDataStream(dec1);
byte[] buf = new byte[BufferSize];
for (int len; (len = in.read(buf)) >= 0; ) {
bout.write(buf, 0, len);
}
bout.close();
return bout.toByteArray();
}

key 是为加密对象找到匹配 key 的for循环。

关于java - 使用多个 RSA 公钥加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com