【问题标题】:CryptoAPI CNG and CMS functionalityCryptoAPI CNG 和 CMS 功能
【发布时间】:2018-06-06 09:44:09
【问题描述】:

我有一个关于替代 Crypto API 的 Microsoft CNG 的问题。因为我有一个项目/作业,我需要将 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 ) 但我只能找到属于 CryptoAPI 的处理 PKCS#7/CMS 消息传递的方法:

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

您能否指出 CMS 是否仅可通过上述 CryptoAPI 获得,或者我是否遗漏了任何新的 CNG 方法?

提前致谢

【问题讨论】:

  • Herzlich wilkommen to SO, slb20.
  • Vielen Dank für den warmen Empfang! :)

标签: .net cryptography cryptoapi pkcs#7 cng


【解决方案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 的内置 EnvelopedCms 和 SignedCms 类应该能够分别解密和验证 RSA-OAEP 和 RSA-PSS。但由于他们都使用证书密钥算法 OID 来确定如何创建消息(这个方案很有效,但后来没有成功)他们只能创建 PKCS#1 v1.5 兼容的密文和签名。

【讨论】:

  • 首先,感谢两位的快速回复!你帮了我很多,谢谢! :)
【解决方案2】:

不,下一代加密 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 类以及它周围的所有内容感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多