EnvelopedCMS是否可以使用AES和rsaEncryption(PKCS#1v1.5填充而不是v2(OAEP)填充)?我一直在使用.NET进行加密。到目前为止,我正在使用3DES(Oid1.2.840.113549.3.7)和rsaEncryption(Oid1.2.840.113549.1.1.1,RSAES-PKCS1-v1_5)。虽然第一个现在已经被AES(Oid2.16.840.1.101.3.4.1.42)取代,但我仍然必须使用rsaEncryption/RSAES-PKCS1-v1_5,而不是RSAES-OAEP。如果我只是将另一个参数传递给我正在调用的EnvelopedCMS构造函数,我可以从3DES切换到AES:ContentInfoplainContent=newContentInfo(newOid("1.2.840.113549.1.7.1"),data);EnvelopedCmsencryptedMessage=newEnvelopedCms(plainContent);//使用3DES//EnvelopedCmsencryptedMessage=newEnvelopedCms(plainContent,newAlgorithmIdentifier(newOid("2.16.840.1.101.3.4.1.42"))));//对于AES(id-aes256-CBC)CmsRecipientrecipient=newCmsRecipient(cert);encryptedMessage.Encrypt(收件人);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信封?有没有更优雅的方式?.NETFrameworkEnvelopedCms建立在WindowsCAPICryptMsg*函数之上。CryptMsgOpenToEncode支持两种编码收件人的方式,其中一种是有条件编译的(虽然我无法确定它何时不可用;我怀疑这是Win9x与NT4/WinXP的兼容问题)。一时兴起,我看到了我可以翻转它以使用其他代码路径的内容,如果这会改变您的结果的话。事实证明,是的,在内部使用“useCms”会导致收件人加密算法为1.2.840.113549.1.1.1。选项1)使用SubjectKeyIdentifier身份如果您正在与其他系统进行互操作(如此处所述),请确保证书在使用此身份形式之前具有明确的SubjectKeyIdentifier扩展。如果没有明确的.NET/Windows将构成一个隐式值,并且在这种情况下并非所有CMS实现都匹配接收者证书(例如OpenSSL)。您可以通过将CmsRecipient更改为CmsRecipientrecipient=newCmsRecipient(SubjectIdentifierType.SubjectKeyIdentifier,cert);选项2)添加UnprotectedAttributeEnvelopedCms允许将额外的元数据添加到未加密的消息中。指定这些值中的任何一个都会导致加密器/编码器使用备用代码路径。添加//Pkcs9DocumentName需要一个非空字符串。//不过,您可以使用任何AsnEncodedData值。encryptedMessage.UnprotectedAttributes.Add(newPkcs9DocumentName("a"));在调用加密之前。每个人都在本地测试。以上是C#学习教程:IsEnvelopedCMSpossiblewithAESandrsaEncryption(PKCS#1v1.5paddinginsteadofv2(OAEP)padding)?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
