Cryptography API: Next Generation

下一代密码学API (Cryptography API: Next Generation， CNG) 是微軟从Windows Vista开始在作業系統中包含的密碼学编程接口。替代了当时已经发布了十年的Cryptographic API。

CNG允许同一个函数可用更多的密码学算法，并包含了美国国家安全局中发布的新算法。并灵活地支持插件定制密码学API到CNG的运行时中。但CNG的密钥存储机制仍然不支持存储对称密钥。 CNG既可以工作在用户模式下，也可以工作在内核模式下，支持CryptoAPI的所有算法。其运行代码在Bcrypt.dll文件中。

CNG也支持椭圆曲线密码学非对称加密。CNG API集成了智能卡子系统，包括Base Smart Card Cryptographic Service Provider (Base CSP) 模块，封装了智能卡API。智能卡制造商只需要使其产品兼容与该API，而不需要从头写解决方案。 

CNG增加了双椭圆曲线确定性随机比特生成器，一套定义于中的伪随机数生成器，被认为存在NSA的安全后门。除非开发者记得每次都用其它伪随机数生成器或真随机数生成器产生初始化种子。该算法也很慢。该算法只在明确调用时才会被使用。

CNG的缺省的伪随机数生成算法已经被使用AES作为块加密器的替代了。因为老的算法使用DES与SHA-1，都已经被攻破。 CTR_DRBG定义在NIST SP 800-90中的两种算法之一，由布魯斯·施奈爾捐赠。

示例源代码
产生指定字节长度的伪随机数：
 #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;
}

参考文献

Windows API