gpt4 book ai didi

c# - 具有 AES 和 rsaEncryption(PKCS#1 v1.5 填充而不是 v2(OAEP)填充)的 EnvelopedCMS 可能吗?

转载 作者:太空狗 更新时间:2023-10-29 21:43:43 26 4
gpt4 key购买 nike

我一直在将 .NET 用于加密目的。到目前为止,我将 3DES (Oid 1.2.840.113549.3.7) 与 rsaEncryption (Oid 1.2.840.113549.1.1.1, RSAES-PKCS1-v1_5) 结合使用。虽然第一个现在必须替换为 AES (Oid 2.16.840.1.101.3.4.1.42),但我仍然必须使用 rsaEncryption/RSAES- PKCS1-v1_5,不是 RSAES-OAEP

如果我只是将一个额外的参数传递给我正在调用的 EnvelopedCMS 构造函数,我可以从 3DES 切换到 AES:

    ContentInfo plainContent = new ContentInfo(new Oid("1.2.840.113549.1.7.1"), data);

EnvelopedCms encryptedMessage = new EnvelopedCms(plainContent); // using 3DES
// EnvelopedCms encryptedMessage = new EnvelopedCms(plainContent, new AlgorithmIdentifier(new Oid("2.16.840.1.101.3.4.1.42"))); // for AES (id-aes256-CBC)

CmsRecipient recipient = new CmsRecipient(cert);
encryptedMessage.Encrypt(recipient);

byte[] encryptedBytes = encryptedMessage.Encode();

到目前为止一切正常。不幸的是,有些收件人无法解密我的消息,尽管他们能够解密 AES。查看ASN.1结构告诉我不仅3DES改为AES,而且rsaEncryption(1.2.840.113549.1.1.1)也被RSAES-OAEP(1.2.840.113549.1.1.7)取代).我可以以某种方式强制仍然将 RSAES-PKCS1-v1_5 与 EnvelopedCMS 一起使用吗?或者您在切换 3DES->AES 时看到另一个问题吗?

编辑:如果我无法轻易将填充更改为 v1.5,我还有哪些其他选择?手动调用 CryptoServiceProviders 并自行构建 PKCS#7 信封?有没有更优雅的方式?

最佳答案

.NET Framework EnvelopedCms 建立在 Windows CAPI CryptMsg* 函数之上。 CryptMsgOpenToEncode 支持两种编码收件人的方式,其中一种是有条件编译的(尽管我无法确定它何时不可用;我怀疑这是 Win9x 与 NT4/WinXP 的兼容问题)。

我一时兴起,想看看有什么可以翻转它以使用其他代码路径,以及这是否会改变这里的结果。事实证明,是的,将其设置为内部“useCms”会导致收件人加密算法为 1.2.840.113549.1.1.1。

方案1)使用SubjectKeyIdentifier标识

如果您正在与另一个系统进行互操作,就像这里的情况一样,请确保证书在使用此标识形式之前具有明确的 SubjectKeyIdentifier 扩展名。如果没有显式值,.NET/Windows 将构成一个隐式值,并且在这种情况下并非所有 CMS 实现都匹配接收者证书(例如 OpenSSL)。

您可以通过将 CmsRecipient 更改为

来完成此操作
CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.SubjectKeyIdentifier, cert);

选项 2) 添加一个 UnprotectedAttribute

EnvelopedCms 允许将其他元数据添加到未加密的消息中。指定这些值中的任何一个都会使加密器/编码器使用备用代码路径。

在调用 Encrypt 之前添加

// Pkcs9DocumentName requires a non-empty string.
// You can use any AsnEncodedData value, though.
encryptedMessage.UnprotectedAttributes.Add(new Pkcs9DocumentName("a"));

每个人都在本地测试中工作。

关于c# - 具有 AES 和 rsaEncryption(PKCS#1 v1.5 填充而不是 v2(OAEP)填充)的 EnvelopedCMS 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588744/

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