CryptoAPI CNG 和 CMS 功能

CryptoAPI CNG and CMS functionality

我有一个关于替代 Crypto API 的 Microsoft CNG 的问题。因为我有一个 project/assignment,我需要在其中使用 CMS/PKCS#7 和 RSA-OAEP 加密和 RSASSA-PSS 签名。

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

到目前为止我只找到了 Crypto API "Low-level Message Functions" 和 "Simplified Message Functions" ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa380252(v=vs.85).aspx )

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

提前致谢

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

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

One of the key value propositions of CNG is cryptographic agility, sometimes called cryptographic agnosticism. Converting implementation of protocols like Secure Sockets Layer protocol (SSL) or transport layer security (TLS), CMS (S/MIME), IPsec, Kerberos, and so on, to CNG, however, was required to make this ability valuable. At the CNG level, it was necessary to provide substitution and discoverability for all the algorithm types (symmetric, asymmetric, hash functions), random number generation, and other utility functions. The protocol-level changes are more significant because in many cases the protocol APIs needed to add algorithm selection and other flexibility options that did not previously exist.

所以这里讲的是CNG库的敏捷性,使得更高层协议的实现可以使用CNGAPI。因此,例如,它谈到了将旧 CryptoAPI 之上的 CMS 实现转换为使用 .NET CNG API.

的实现

我确实认为它的编写方式不是很清楚。 API 仍然包含实施 CMS 所需的一些常量这一事实无济于事。


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

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

如果您直接使用 Win32,则可以将 CNG 或 CAPI 密钥与 CryptMsg* 一起使用。例如,要解密一条消息,您可以调用 CryptMsgControl(msg, 0, CMSG_CONTROL_DECRYPT, &para). The parameter for a CMSG_CONTROL_DECRYPT is a CMSG_CONTROL_DECRYPT_PARA,它有一个用于 HCRYPTPROV (CAPI) 或 NCRYPT_KEY_HANDLE (CNG) 的联合字段。

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