| ||||
| ||||
Есть необходимость импорта в контейнер заданного мной же (32 байта) секретного ключа. Прочитал ветку "Загрузка plaintext ключа в контекст 29.10.2004 20:53:57" Попытался сделать описанное: CryptAcquireContext(&hProvCP, ...); CryptGenKey(hProvCP, CALG_G28147, CRYPT_PREGEN, &hKeyCP)); // data - 32 байта ключа CryptSetKeyParam(hKeyCP, KP_X, data, NULL); При вызове этой функции получаю ошибку 0x8009000a "указан неправильный тип". Возможно я не понял объяснений. Возможно ли привести здесь код по импорту заданного пользователем ключа? | ||||
Ответы: | ||||
| ||||
Ошибся немного. Код такой: CryptAcquireContext(&hProvCP, ...); CryptGenKey(hProvCP, CALG_GR3410EL, CRYPT_PREGEN, &hKeyCP)); // data - 32 байта ключа CryptSetKeyParam(hKeyCP, KP_X, data, NULL); | ||||
| ||||
Значение ключа должно передаваться в ф-ю CryptSetKeyParam так: (LPBYTE)&x_blob, где CRYPT_DATA_BLOB x_blob; x_blob.cbData=32; x_blob.pbData=(LPBYTE)data; | ||||
| ||||
HCRYPTPROV hProvCP; HCRYPTKEY hKeyCP; BYTE *data = NULL; DWORD dwErr; if (!CryptAcquireContext(&hProvCP, "TestCP container", CP_GR3410_2001_PROV, 0x4B, 0)) { if (!CryptAcquireContext(&hProvCP, "TestCP container", CP_GR3410_2001_PROV, 0x4B, CRYPT_NEWKEYSET)) { } } if (!CryptGenKey(hProvCP, CALG_GR3410EL, CRYPT_PREGEN, &hKeyCP)) { } data = new BYTE[32]; CryptGenRandom(hProvCP, 32, data); CRYPT_DATA_BLOB x_blob; x_blob.cbData=32; x_blob.pbData=(LPBYTE)data; if (!CryptSetKeyParam(hKeyCP, KP_X, (LPBYTE)&x_blob, NULL)) { // Здесь вылезает все та же ошибка //0x8009000a (NTE_BAD_TYPE) } delete [] data; Можно попросить пример работающего кода импорта секретного ключа, заданного пользователем? | ||||
| ||||
HCRYPTPROV hProvCP; HCRYPTKEY hKeyCP; BYTE *data = NULL; DWORD dwErr; if (!CryptAcquireContext(&hProvCP, "TestCP container", CP_GR3410_2001_PROV, 0x4B, 0)) { if (!CryptAcquireContext(&hProvCP, "TestCP container", CP_GR3410_2001_PROV, 0x4B, CRYPT_NEWKEYSET)) { } } if (!CryptGenKey(hProvCP, CALG_DH_EL_EPHEM, CRYPT_PREGEN, &hKeyCP)) { } data = new BYTE[32]; CryptGenRandom(hProvCP, 32, data); CRYPT_DATA_BLOB x_blob; x_blob.cbData=32; x_blob.pbData=(LPBYTE)data; if (!CryptSetKeyParam(hKeyCP, KP_X, (LPBYTE)&x_blob, NULL)) { // } delete [] data; ALG_ID alg; alg=AT_KEYEXCHANGE; //или AT_SIGNATURE if (!CryptSetKeyParam(hKeyCP, KP_ALGID, (LPBYTE)&alg, 0)) { } | ||||