22

在 Microsoft CNG API(密码学 API:下一代)中,有两组似乎做同样事情的函数。

以下函数开始BCrypt并执行密钥导入/导出、加密/解密、签名/验证和 Diffe-Helman 密钥交换

BCryptExportKey
BCryptImportKey
BCryptEncrypt
BCryptDecrypt
BCryptSignHash
BCryptVerifySignature
BCryptSecretAgreement
BCryptDeriveKey

但是存在以 开头的相同功能集NCrypt

NCryptExportKey
NCryptImportKey
NCryptEncrypt
NCryptDecrypt
NCryptSignHash
NCryptVerifySignature
NCryptSecretAgreement
NCryptDeriveKey

这两组函数有什么区别,分别应该在什么时候使用?

4

2 回答 2

32

BCrypt函数族被归类为密码原语,而函数NCrypt族被归类为密钥存储和检索

主要区别在于BCrypt仅在处理临时键时使用NCrypt函数,而在需要持久键时使用函数。

在实践中,这些BCrypt函数通常用于散列和对称加密,而这些NCrypt函数用于公钥/私钥加密和解密、公钥/私钥签名和验证以及共享秘密(例如DH和ECDH)协商。

虽然一些公钥/私钥操作可以通过BCrypt函数完成,但它们只能与临时密钥一起使用,因此用途有限。

持久密钥存储在特定于每个用户(或系统)的密钥容器中。这是一种确保用户无法查看彼此的私钥的安全措施。

通常,您需要将以下函数用于以下操作:

  • BCryptHashData: 用于散列和 HMAC (MD5, SHA1, SHA256, SHA384, SHA512)
    • 相关:BCryptCreateHash,,,BCryptFinishHashBCryptDestroyHash
  • BCryptEncrypt:对称密钥加密(DES、3DES、AES)。
    • 相关:BCryptGenerateSymmetricKeyBCryptDestroyKey
  • BCryptDecrypt:对称密钥解密(DES、3DES、AES)。
    • 相关:BCryptGenerateSymmetricKeyBCryptDestroyKey
  • NCryptEncrypt: 非对称密钥加密 (RSA)
  • NCryptDecrypt: 非对称密钥解密 (RSA)
  • NCryptSignHash:非对称密钥签名(RSA、DSA、ECDSA)
  • NCryptVerifySignature:非对称密钥签名验证(RSA、DSA、ECDSA)
  • NCryptSecretAgreement:非对称密钥共享(DH、ECDH)
    • 有关的:NCryptDeriveKey

MSDN上提供了其中几个案例的示例。

对于一个真实世界的例子,我已经在UFTP源代码中实现了所有这些,特别是文件encrypt_cng.c(有到位的 typedef,定义在encryption.h其他加密库,例如 CryptoAPI 和 OpenSSL)。

于 2016-11-14T19:30:19.920 回答
9

BCrypt*当您的应用程序内存中有密钥时,请使用函数。

NCrypt*将密钥存储在 KSP(密钥存储提供程序)中时使用函数。

NCrypt*函数做了很多额外的工作并且效率较低,因此如果您不将密钥存储在 KSP 中,最好使用BCrypt*函数。

由于大多数长期存储的密钥都是非对称(RSA、ECDSA、...)密钥,NCrypt*因此函数更常用于非对称算法。BCrypt*通常用于非对称和对称算法。

于 2017-05-12T19:57:17.233 回答