gpt4 book ai didi

java - Bouncy CasSTLe CMS 公钥加密

转载 作者:行者123 更新时间:2023-12-02 11:19:33 27 4
gpt4 key购买 nike

我正在按照此处的示例:http://www.baeldung.com/java-bouncy-castle

我有几个问题:

public static byte[] encryptData(byte[] data,
X509Certificate encryptionCertificate)
throws CertificateEncodingException, CMSException, IOException {

byte[] encryptedData = null;
if (null != data && null != encryptionCertificate) {
CMSEnvelopedDataGenerator cmsEnvelopedDataGenerator
= new CMSEnvelopedDataGenerator();

JceKeyTransRecipientInfoGenerator jceKey
= new JceKeyTransRecipientInfoGenerator(encryptionCertificate);
cmsEnvelopedDataGenerator.addRecipientInfoGenerator(transKeyGen);
CMSTypedData msg = new CMSProcessableByteArray(data);
OutputEncryptor encryptor
= new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC)
.setProvider("BC").build();
CMSEnvelopedData cmsEnvelopedData = cmsEnvelopedDataGenerator
.generate(msg,encryptor);
encryptedData = cmsEnvelopedData.getEncoded();
}
return encryptedData;
}

将此应用到我的现实场景中,我只有接收者的 RSA 公钥,而不是整个 X509Certificate。我查了一下,但我不确定如何才能做到这一点。可能吗?

另一件事是我看到 JceCMSEncryptorBuilder 采用 ASN1ObjectIdentifier。我们目前正在使用这样做:

KeyGenerator cryptKeyGenerator = KeyGenerator.getInstance("AES", "BC");
cryptKeyGenerator.init(256);
Key encryptionKey = cryptKeyGenerator.generateKey();
Cipher symmetricCipher = Cipher.getInstance("AES/CTS/NoPadding", "BC");
symmetricCipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new IvParameterSpec(ivBytes));

并且在 CMSAlgorithm 类中我没有看到任何 CTS 选项。我是否遗漏了某些内容,或者是否有办法继续使用 CTS?

最佳答案

I only have an RSA public key for the recipient and not the whole X509Certificate

KeyTransRecipientInfo structure of CMS EnvelopedData可以使用SubjectKeyIdentifier值sometimes present in the X.509/PKIX certificate as an extensionBouncy has an overloaded ctor for this case 。由于您没有证书,因此如果收件人将使用证书,您必须找出用于计算证书中的值的方法,或者尝试不同的猜测,直到找到一个这有效,或者如果您控制收件人,只需选择他们将接受的一些值。

org.bouncycastle.cert.X509ExtensionUtils它的两个子类提供了计算这两个标准方案的方法,但我发现它们并不比直接计算更方便。

We're currently using ... AES/CTS/NoPadding ... and in the CMSAlgorithm class I don't see any CTS option

这不仅仅是 CMSAlgorithm 中的内容。有两个相关因素:

  • CMS/PKCS7 EnvelopedData 中使用的任何特定密码(用 JCA 术语来说,即转换)必须由 OID 和条件参数来标识

  • 用于给定消息的密码必须得到发件人和收件人或所有收件人的支持。

org.bouncycastle.cms.CMSAlgorithm只是密码和其他一些东西(例如 key 协议(protocol))的方便简编,它们都具有标准化 OID 并由 BC 实现,后者实际上由 org.bouncycastle.cms.jcajce.EnvelopedDataHelper 控制或the bc-native equivalent正如您所看到的,它仅支持受支持的 block 密码的 CBC 模式。 (两者都支持 RC4,但作为流密码,它不使用任何模式。而且 RC4 现在非常不受欢迎。)

我不记得在 CTS 模式下见过任何密码的标准化 OID。如果这是正确的,您就必须分配一个,并且由于没有其他人会实现该 OID,因此您的消息将无法与任何人互操作。如果您可以找到您的同行实现的标准 OID(或至少 AlgId),对于 BC,您必须创建自己的符合(接口(interface))OutputEncryptor 的类,而这不是如果您查看上面的来源,那么所有的事情都会变得复杂,因为您有底层密码的提供者或 bc-native 实现。

关于java - Bouncy CasSTLe CMS 公钥加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031789/

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