在 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)- 相关:
BCryptCreateHash
、BCryptFinishHash
、BCryptDestroyHash
- 相关:
BCryptEncrypt
:对称 key 加密(DES、3DES、AES)。- 相关:
BCryptGenerateSymmetricKey
、BCryptDestroyKey
- 相关:
BCryptDecrypt
:对称 key 解密(DES、3DES、AES)。- 相关:
BCryptGenerateSymmetricKey
、BCryptDestroyKey
- 相关:
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/