В Windows 7 Pro x64 я пытаюсь создать постоянный ключ AES с помощью Cryptography API Next Generation.
Проблема в том, что функция 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 …
Спасибо за вашу помощь.
MS_KEY_STORAGE_PROVIDER
не поддерживает AES или 3DES в Windows 7, эта функция была добавлена в 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)
NCRYPT-версии #defines не существовали до Windows 8, предполагая, что API-интерфейсы NCrypt (постоянный ключ) не ожидали выполнения AES до Windows 8.
Других решений пока нет …