c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数

标签 c++ c cryptography cng

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

以下函数以 BCrypt 开头,执行 key 导入/导出、加密/解密、签名/验证和 Diffie-Hellman key 交换

BCryptExportKey
BCryptImportKey
BCryptEncrypt
BCryptDecrypt
BCryptSignHash
BCryptVerifySignature
BCryptSecretAgreement
BCryptDeriveKey

但存在相同的一组函数,以 NCrypt 开头:

NCryptExportKey
NCryptImportKey
NCryptEncrypt
NCryptDecrypt
NCryptSignHash
NCryptVerifySignature
NCryptSecretAgreement
NCryptDeriveKey

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

最佳答案

BCrypt 系列函数被归类为 Cryptographic Primitives ,而 NCrypt 系列函数被归类为 Key Storage and Retrieval

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

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

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

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

一般来说,您需要使用以下函数进行以下操作:

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

示例可在 MSDN 获得对于其中几种情况。

对于一个真实世界的例子,我已经在 UFTP 中实现了所有这些。源代码,特别是 encrypt_cng.c 文件(在 encryption.h 中定义了 typedef,以允许该文件中的函数实现通用应用程序级 API允许使用其他加密库,例如 CryptoAPI 和 OpenSSL)。

关于c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596395/

相关文章:

c - STM32L0读出保护示例代码?

java - Zip4J -> java.security.ProviderException : Could not construct MacSpi instance

postgresql - 如何对 md5 哈希值进行异或并将它们转换为 postgresql 中的 HEX

c++ - 为什么我的返回 lambda 的函数似乎被转换为转换 int 的函数?

c++ - 为什么我会收到 Missing sentinel 警告?

c++ - 假设没有编译器优化,这个对象会被创建多少次?

c - 如何使用C从PID中获取进程名称

c - 如何正确打印 JPEG 文件的字节? - CS50 PSET3 恢复

c++ - 按值搜索 map

java - 生成安全随机位