CNG:何时使用BCrypt * vs NCrypt *系列功能

时间:2016-11-14 19:30:20

标签: c++ c cryptography cng

在Microsoft CNG API(Cryptography API:Next Generation)中,有两组函数可以执行相同的操作。

以下功能以BCrypt开头,执行密钥导入/导出,加密/解密,签名/验证和Diffe-Helman密钥交换

BCryptExportKey
BCryptImportKey
BCryptEncrypt
BCryptDecrypt
BCryptSignHash
BCryptVerifySignature
BCryptSecretAgreement
BCryptDeriveKey

但是存在以NCrypt开头的相同函数集:

NCryptExportKey
NCryptImportKey
NCryptEncrypt
NCryptDecrypt
NCryptSignHash
NCryptVerifySignature
NCryptSecretAgreement
NCryptDeriveKey

这两组功能之间的区别是什么,以及何时应该使用这些功能?

2 个答案:

答案 0 :(得分:18)

BCrypt系列功能归类为 Cryptographic Primitives ,而NCrypt系列功能归类为 Key Storage and Retrieval < /强>

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

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

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

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

通常,您希望将以下功能用于以下操作:

  • BCryptHashData:用于散列和HMAC(MD5,SHA1,SHA256,SHA384,SHA512)
    • 相关:BCryptCreateHashBCryptFinishHashBCryptDestroyHash
  • 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文件(在encryption.h中定义了typedef) ,允许此文件中的函数实现一个通用的应用程序级API,以允许使用其他加密库,如CryptoAPI和OpenSSL)。

答案 1 :(得分:3)

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

将密钥存储在KSP(密钥存储提供程序)中时,请使用NCrypt*功能。

NCrypt*函数执行大量额外工作且效率较低,因此如果您不将密钥存储在KSP中,最好使用BCrypt*函数。

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