Cryptography API: Next Generation
下一代密碼學API (Cryptography API: Next Generation, CNG) 是微軟從Windows Vista開始在作業系統中包含的密碼學編程接口。替代了當時已經發布了十年的Cryptographic API。
CNG允許同一個函數可用更多的密碼學算法,並包含了美國國家安全局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中的偽隨機數生成器,被認為存在NSA的安全後門。除非開發者記得每次都用其它偽隨機數生成器或真隨機數生成器產生初始化種子。該算法也很慢。[5]該算法只在明確調用時才會被使用。
CNG的缺省的偽隨機數生成算法已經被使用AES作為塊加密器的CTR_DRBG替代了。因為老的算法使用DES與SHA-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;
}
參考文獻
- ^ Suite B. [2020-07-15]. (原始內容存檔於2009-02-07).
- ^ Key Storage and Retrieval, Microsoft. [2020-07-15]. (原始內容存檔於2017-09-21).
- ^ The Case for Elliptic Curve Cryptography, NSA. [2020-07-15]. (原始內容存檔於2018-09-18).
- ^ Schneier, Bruce. Dual_EC_DRBG Added to Windows Vista. Schneier on Security. December 17, 2007 [January 13, 2010]. (原始內容存檔於2020-07-10).
- ^ 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).
- ^ 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).