0

在 Windows 7 Pro x64 上,我尝试使用 Cryptography API Next Generation 创建一个持久的 AES 密钥。

问题是 NCryptCreatePersistedKey 函数返回 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 ......

谢谢你的帮助。

4

1 回答 1

0

MS_KEY_STORAGE_PROVIDER在 Windows 7 上不支持 AES 或 3DES,这是 8 或 8.1 中添加的功能。我能找到的最好的来源是.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。

于 2018-01-22T15:48:27.307 回答