2016-11-14 49 views
7

在Microsoft CNG API(加密API:下一代)中,有兩組功能看起來可以做同樣的事情。CNG:何時使用BCrypt *和NCrypt *系列功能

以下功能開始BCrypt和執行密鑰導入/導出,加密/解密,簽名/驗證和迪菲 - 赫爾曼密鑰交換

BCryptExportKey 
BCryptImportKey 
BCryptEncrypt 
BCryptDecrypt 
BCryptSignHash 
BCryptVerifySignature 
BCryptSecretAgreement 
BCryptDeriveKey 

但同一組的功能存在與NCrypt開始:

NCryptExportKey 
NCryptImportKey 
NCryptEncrypt 
NCryptDecrypt 
NCryptSignHash 
NCryptVerifySignature 
NCryptSecretAgreement 
NCryptDeriveKey 

這兩組函數之間有什麼區別,以及每個函數何時應該使用?

回答

10

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定義,以允許此文件中的函數來實現一個共同的應用以允許使用其他加密庫,如CryptoAPI和OpenSSL)。

+0

由於舊的CSP非常有限,所以不直觀,但它以某種方式迫使強大的密鑰存儲機制。然而用NCrypt *密鑰存儲有點奇怪!例如爲了得到一個短暫的關鍵你仍然需要調用NCryptCreatePersistedKey ..該NCrypt以某種方式試圖mems PKCS11,但真的在一個非常奇怪的方式,遠非直觀..因此容易出錯 – Ibrahim

0

使用BCrypt*函數,當你在你的應用程序的內存中有密鑰時。

將密鑰存儲在KSP(密鑰存儲提供程序)中時使用NCrypt*函數。

NCrypt*函數做了很多額外的工作並且效率較低,所以如果您沒有將密鑰存儲在KSP中,最好使用BCrypt*函數。由於大多數長期存儲的密鑰都是不對稱的(RSA,ECDSA,...)密鑰,因此NCrypt*函數更常用於非對稱算法。 BCrypt*通常用於非對稱和對稱算法。