CryptoAPI CNG:CMS功能

时间:2018-06-06 09:44:10

标签: .net cryptography cryptoapi pkcs#7 cng

我有一个关于用于替代Crypto API的Microsoft CNG的问题。由于我有一个项目/任务,我需要使用带有RSA-OAEP加密和RSASSA-PSS签名的CMS / PKCS#7。

但我对CNG是否感到困惑(不是传统的支持 CryptoAPI)包括CMS功能与否。在功能列表中,它明确指出支持CMS等协议(https://msdn.microsoft.com/de-de/library/windows/desktop/bb204775(v=vs.85).aspx )但我只能找到属于CryptoAPI的方法来处理PKCS#7 / CMS消息:

到目前为止,我只找到了Crypto API“低级消息功能” 和“简化的消息功能”( https://msdn.microsoft.com/en-us/library/windows/desktop/aa380252(v=vs.85).aspx

请指出CMS是否只能通过上述CryptoAPI获得,还是我错过了任何新的CNG方法?

提前致谢

2 个答案:

答案 0 :(得分:1)

分层与你所问的相反。 CNG提供加密原语(它理解RSA)。 Win32 CryptMsg * API了解CMS。

如果您直接使用Win32,可以使用带有CryptMsg *的CNG或CAPI密钥。例如,要解密消息,您可以调用CryptMsgControl(msg, 0, CMSG_CONTROL_DECRYPT, &para)。 CMSG_CONTROL_DECRYPT的参数是CMSG_CONTROL_DECRYPT_PARA,它具有HCRYPTPROV(CAPI)或NCRYPT_KEY_HANDLE(CNG)的联合字段。

.NET的内置EnvelopedCmsSignedCms类应该能够分别解密和验证RSA-OAEP和RSA-PSS。但由于它们都使用证书密钥算法OID来确定如何创建消息(一种效果很好的方案,直到它没有),它们只能创建PKCS#1 v1.5兼容的密文和签名。

答案 1 :(得分:0)

不,加密下一代API是一个相对较低级别的API,它不包含更高级别的协议,如CMS(PKCS#7是指定CMS的标准)。

CMS在其旨在支持的一长串协议列表中提及:

  

CNG的一个关键价值主张是加密敏捷性,有时也称为加密不可知论。然而,需要将安全套接字层协议(SSL)或传输层安全性(TLS),CMS(S / MIME),IPsec,Kerberos等协议的实现转换为CNG才能使此功能变得有价值。在CNG级别,有必要为所有算法类型(对称,非对称,散列函数),随机数生成和其他效用函数提供替换和可发现性。协议级别的更改更为重要,因为在许多情况下,协议API需要添加算法选择和以前不存在的其他灵活性选项。

所以这里讨论了CNG库的敏捷性,以便更高级别协议的实施可以使用 CNG API。因此,它讨论了在旧的CryptoAPI之上将CMS的实现转换为使用.NET CNG API的实现。

我确实认为这不是很清楚它的编写方式。 API仍然包含实现CMS所需的一些常量这一事实并没有帮助。

当然,可以找到转换/移植的结果here - 相当愚蠢 - 将PKCS标准中的所有功能集中在一个命名空间中。您可能主要对EnvelopedCMS(用于加密)和SignedCMS类及其周围的所有内容感兴趣。