BCrypt
函数族被归类为密码原语,而函数NCrypt
族被归类为密钥存储和检索。
主要区别在于BCrypt
仅在处理临时键时使用NCrypt
函数,而在需要持久键时使用函数。
在实践中,这些BCrypt
函数通常用于散列和对称加密,而这些NCrypt
函数用于公钥/私钥加密和解密、公钥/私钥签名和验证以及共享秘密(例如DH和ECDH)协商。
虽然一些公钥/私钥操作可以通过BCrypt
函数完成,但它们只能与临时密钥一起使用,因此用途有限。
持久密钥存储在特定于每个用户(或系统)的密钥容器中。这是一种确保用户无法查看彼此的私钥的安全措施。
通常,您需要将以下函数用于以下操作:
BCryptHashData
: 用于散列和 HMAC (MD5, SHA1, SHA256, SHA384, SHA512)
- 相关:
BCryptCreateHash
,,,BCryptFinishHash
BCryptDestroyHash
BCryptEncrypt
:对称密钥加密(DES、3DES、AES)。
- 相关:
BCryptGenerateSymmetricKey
,BCryptDestroyKey
BCryptDecrypt
:对称密钥解密(DES、3DES、AES)。
- 相关:
BCryptGenerateSymmetricKey
,BCryptDestroyKey
NCryptEncrypt
: 非对称密钥加密 (RSA)
NCryptDecrypt
: 非对称密钥解密 (RSA)
NCryptSignHash
:非对称密钥签名(RSA、DSA、ECDSA)
NCryptVerifySignature
:非对称密钥签名验证(RSA、DSA、ECDSA)
NCryptSecretAgreement
:非对称密钥共享(DH、ECDH)
MSDN上提供了其中几个案例的示例。
对于一个真实世界的例子,我已经在UFTP源代码中实现了所有这些,特别是文件encrypt_cng.c
(有到位的 typedef,定义在encryption.h
其他加密库,例如 CryptoAPI 和 OpenSSL)。