Cryptography API: Next Generation

下一代密碼學API (Cryptography API: Next Generation, CNG) 是微軟Windows Vista開始在作業系統中包含的密碼學編程介面。替代了當時已經發佈了十年的Cryptographic API

CNG允許同一個函數可用更多的密碼學演算法,並包含了美國國家安全域NSA Suite B Cryptography英語NSA Suite B Cryptography中發佈的新演算法。[1]並靈活地支援外掛程式客製化密碼學API到CNG的執行時中。但CNG的金鑰儲存機制仍然不支援儲存對稱金鑰。[2] CNG既可以工作在用戶模式下,也可以工作在內核模式下,支援CryptoAPI的所有演算法。其執行代碼在Bcrypt.dll檔案中。

CNG也支援橢圓曲線密碼學非對稱加密。[3]CNG API整合了智能卡子系統,包括Base Smart Card Cryptographic Service Provider (Base CSP) 模組,封裝了智能卡API。智能卡製造商只需要使其產品相容與該API,而不需要從頭寫解決方案。

CNG增加了雙橢圓曲線確定性隨機位元生成器[4],一套定義於NIST SP 800-90A英語NIST SP 800-90A中的偽亂數生成器,被認為存在NSA的安全後門。除非開發者記得每次都用其它偽亂數生成器或真亂數生成器產生初始化種子。該演算法也很慢。[5]該演算法只在明確呼叫時才會被使用。

CNG的預設的偽亂數生成演算法已經被使用AES作為塊加密器的CTR_DRBG英語CTR_DRBG替代了。因為老的演算法使用DESSHA-1,都已經被攻破。[6] CTR_DRBG定義在NIST SP 800-90中的兩種演算法之一,由布魯斯·施奈爾捐贈。[5]

範例原始碼

產生指定位元組長度的偽亂數:

 #include <Windows.h>
#include <bcrypt.h>
#include <iostream>
#include <stdio.h>
#pragma comment(lib, "bcrypt.lib")
using namespace std;
unsigned long getSeed(ULONG buffer_size) {
	NTSTATUS status = 0;
	ULONG flags = 0;
	UCHAR c_seed[128] = { 0 };
	BCRYPT_ALG_HANDLE handle;
	status = BCryptOpenAlgorithmProvider(
		&handle, BCRYPT_RNG_ALGORITHM, NULL, 0
	);
	if (!BCRYPT_SUCCESS(status)) {
		cout << "BCryptOpenAlgorithmProvider";
		printf("%X", status);
	}
	status = BCryptGenRandom(
		handle, c_seed, buffer_size, 0
	);
	if (!BCRYPT_SUCCESS(status)) {
		cout << "Error in BCryptGenRandom";
		printf("%X", status);
	}
	status = BCryptCloseAlgorithmProvider(
		handle, 0
	);
	if (!BCRYPT_SUCCESS(status)) {
		cout << "BCryptCloseAlgorithmProvider";
		printf("%X", status);
	}
	unsigned long seedNo = (unsigned long)c_seed;
	return seedNo;
}

參考文獻

  1. ^ Suite B. [2020-07-15]. (原始內容存檔於2009-02-07). 
  2. ^ Key Storage and Retrieval, Microsoft. [2020-07-15]. (原始內容存檔於2017-09-21). 
  3. ^ The Case for Elliptic Curve Cryptography, NSA. [2020-07-15]. (原始內容存檔於2018-09-18). 
  4. ^ Schneier, Bruce. Dual_EC_DRBG Added to Windows Vista. Schneier on Security. December 17, 2007 [January 13, 2010]. (原始內容存檔於2020-07-10). 
  5. ^ 5.0 5.1 Schneier, Bruce. The Strange Story of Dual_EC_DRBG. Schneier on Security. November 15, 2007 [January 12, 2010]. (原始內容存檔於2020-07-10). 
  6. ^ FIPS PUB 186-2 (PDF). Federal Information Processing Standards. National Institute of Standards and Technology. January 27, 2000 [January 13, 2010]. (原始內容存檔 (PDF)於2011-08-12).