如何在 Windows 7 上使用 Crypto API Next Generation 创建 AES 永久密钥
How to create a AES persistent key with Crypto API Next Generation on Windows 7
在 Windows 7 Pro x64 上,我尝试使用加密技术 API 下一代创建持久性 AES 密钥。
问题是 NCryptCreatePersistedKey 函数 returns NTE_NOT_SUPPORTED.
我的代码:
#include "Windows.h"
#include "bcrypt.h"
#include "ncrypt.h"
int main() {
NCRYPT_PROV_HANDLE hProvider;
NCRYPT_KEY_HANDLE hKey;
// Open storage provider
HRESULT status = NCryptOpenStorageProvider(&hProvider,
MS_KEY_STORAGE_PROVIDER, 0);
// Get stored cipher key
status = NCryptOpenKey(hProvider, &hKey, L"test-key", 0, 0);
// Create key if it doesn't exist
if (status == NTE_BAD_KEYSET) {
status = NCryptCreatePersistedKey(hProvider, &hKey,
BCRYPT_AES_ALGORITHM, L"test-key", 0, 0);
status = NCryptFinalizeKey(hKey, 0);
}
return 0;
}
适用于 Windows 10 Pro x64。
并且文档说支持的最低客户端是 Windows Vista...
感谢您的帮助。
MS_KEY_STORAGE_PROVIDER
在 Windows 7 上不支持 AES 或 3DES,这是在 8 或 8.1 中添加的功能。我能找到的最好的来源是 some test state for .NET Core。或者,您可以通过 wincrypt.h:
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define NCRYPT_AES_ALGORITHM BCRYPT_AES_ALGORITHM
#define NCRYPT_RC2_ALGORITHM BCRYPT_RC2_ALGORITHM
#define NCRYPT_3DES_ALGORITHM BCRYPT_3DES_ALGORITHM
#define NCRYPT_DES_ALGORITHM BCRYPT_DES_ALGORITHM
#define NCRYPT_DESX_ALGORITHM BCRYPT_DESX_ALGORITHM
#define NCRYPT_3DES_112_ALGORITHM BCRYPT_3DES_112_ALGORITHM
#define NCRYPT_SP800108_CTR_HMAC_ALGORITHM BCRYPT_SP800108_CTR_HMAC_ALGORITHM
#define NCRYPT_SP80056A_CONCAT_ALGORITHM BCRYPT_SP80056A_CONCAT_ALGORITHM
#define NCRYPT_PBKDF2_ALGORITHM BCRYPT_PBKDF2_ALGORITHM
#define NCRYPT_CAPI_KDF_ALGORITHM BCRYPT_CAPI_KDF_ALGORITHM
#endif // (NTDDI_VERSION >= NTDDI_WIN8)
#defines 的 NCRYPT 版本直到 Windows 8 才出现,这表明 NCrypt(持久密钥)API 直到 Windows 8 才期望执行 AES。 =13=]
在 Windows 7 Pro x64 上,我尝试使用加密技术 API 下一代创建持久性 AES 密钥。
问题是 NCryptCreatePersistedKey 函数 returns NTE_NOT_SUPPORTED.
我的代码:
#include "Windows.h"
#include "bcrypt.h"
#include "ncrypt.h"
int main() {
NCRYPT_PROV_HANDLE hProvider;
NCRYPT_KEY_HANDLE hKey;
// Open storage provider
HRESULT status = NCryptOpenStorageProvider(&hProvider,
MS_KEY_STORAGE_PROVIDER, 0);
// Get stored cipher key
status = NCryptOpenKey(hProvider, &hKey, L"test-key", 0, 0);
// Create key if it doesn't exist
if (status == NTE_BAD_KEYSET) {
status = NCryptCreatePersistedKey(hProvider, &hKey,
BCRYPT_AES_ALGORITHM, L"test-key", 0, 0);
status = NCryptFinalizeKey(hKey, 0);
}
return 0;
}
适用于 Windows 10 Pro x64。
并且文档说支持的最低客户端是 Windows Vista...
感谢您的帮助。
MS_KEY_STORAGE_PROVIDER
在 Windows 7 上不支持 AES 或 3DES,这是在 8 或 8.1 中添加的功能。我能找到的最好的来源是 some test state for .NET Core。或者,您可以通过 wincrypt.h:
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define NCRYPT_AES_ALGORITHM BCRYPT_AES_ALGORITHM
#define NCRYPT_RC2_ALGORITHM BCRYPT_RC2_ALGORITHM
#define NCRYPT_3DES_ALGORITHM BCRYPT_3DES_ALGORITHM
#define NCRYPT_DES_ALGORITHM BCRYPT_DES_ALGORITHM
#define NCRYPT_DESX_ALGORITHM BCRYPT_DESX_ALGORITHM
#define NCRYPT_3DES_112_ALGORITHM BCRYPT_3DES_112_ALGORITHM
#define NCRYPT_SP800108_CTR_HMAC_ALGORITHM BCRYPT_SP800108_CTR_HMAC_ALGORITHM
#define NCRYPT_SP80056A_CONCAT_ALGORITHM BCRYPT_SP80056A_CONCAT_ALGORITHM
#define NCRYPT_PBKDF2_ALGORITHM BCRYPT_PBKDF2_ALGORITHM
#define NCRYPT_CAPI_KDF_ALGORITHM BCRYPT_CAPI_KDF_ALGORITHM
#endif // (NTDDI_VERSION >= NTDDI_WIN8)
#defines 的 NCRYPT 版本直到 Windows 8 才出现,这表明 NCrypt(持久密钥)API 直到 Windows 8 才期望执行 AES。 =13=]