在Microsoft CNG API(Cryptography API:Next Generation)中,有两组函数似乎可以执行相同的操作.
@H_502_2@以下函数以BCrypt开头,执行密钥导入/导出,加密/解密,签名/验证和Diffe-Helman密钥交换
BCryptExportKey BCryptImportKey BCryptEncrypt BCryptDecrypt BCryptSignHash BCryptVerifySignature BCryptSecretAgreement BCryptDeriveKey@H_502_2@但是存在从NCrypt开始的相同功能集:
NCryptExportKey NCryptImportKey NCryptEncrypt NCryptDecrypt NCryptSignHash NCryptVerifySignature NCryptSecretAgreement NCryptDeriveKey@H_502_2@这两组函数之间的区别是什么,何时应该使用它们?
解决方法
BCrypt函数族被归类为
Cryptographic Primitives,而NCrypt函数族被归类为
Key Storage and Retrieval.
@H_502_2@主要区别在于BCrypt函数仅在处理短暂键时使用,而NCrypt函数在需要持久键时使用.
@H_502_2@实际上,BCrypt函数通常用于散列和对称加密,而NCrypt函数用于公钥/私钥加密和解密,公钥/私钥签名和验证,以及共享秘密(例如DH和ECDH)协商.
@H_502_2@虽然可以使用BCrypt函数完成一些公钥/私钥操作,但它们只能用于临时密钥,因此用途有限.
@H_502_2@持久密钥存储在特定于每个用户(或系统)的密钥容器中.这是一种安全措施,可确保用户无法查看彼此的私钥.
@H_502_2@通常,您需要将以下函数用于以下操作:
@H_502_2@> BCryptHashData:用于散列和HMAC(MD5,SHA1,SHA256,SHA384,SHA512)
@H_502_2@>相关:BCryptCreateHash,BCryptFinishHash,BCryptDestroyHash
@H_502_2@> BCryptEncrypt:对称密钥加密(DES,3DES,AES).
@H_502_2@>相关:BCryptGenerateSymmetricKey,BCryptDestroyKey
@H_502_2@> BCryptDecrypt:对称密钥解密(DES,BCryptDestroyKey
@H_502_2@> NCryptEncrypt:非对称密钥加密(RSA)
> NCryptDecrypt:非对称密钥解密(RSA)
> NCryptSignHash:不对称密钥签名(RSA,DSA,ECDSA)
> NCryptVerifySignature:非对称密钥签名验证(RSA,ECDSA)
> NCryptSecretAgreement:非对称密钥秘密共享(DH,ECDH) @H_502_2@>相关:NCryptDeriveKey @H_502_2@对于其中一些案例,可在MSDN获得示例. @H_502_2@对于一个真实世界的例子,我在UFTP源代码中实现了所有这些,特别是encrypt_cng.c文件(在encryption.h中定义了typedef,以允许此文件中的函数实现一个通用的应用程序)级别API允许使用其他加密库,如CryptoAPI和OpenSSL).
> NCryptDecrypt:非对称密钥解密(RSA)
> NCryptSignHash:不对称密钥签名(RSA,DSA,ECDSA)
> NCryptVerifySignature:非对称密钥签名验证(RSA,ECDSA)
> NCryptSecretAgreement:非对称密钥秘密共享(DH,ECDH) @H_502_2@>相关:NCryptDeriveKey @H_502_2@对于其中一些案例,可在MSDN获得示例. @H_502_2@对于一个真实世界的例子,我在UFTP源代码中实现了所有这些,特别是encrypt_cng.c文件(在encryption.h中定义了typedef,以允许此文件中的函数实现一个通用的应用程序)级别API允许使用其他加密库,如CryptoAPI和OpenSSL).