11.08.2004 16:42:10Ошибки функция CryptSetKetParam Ответов: 2
Erigor
Добрый день !
Ошибка заключается в следующем. Вызываю функцию CryptSetKeyParam с параметром dwParam = KP_SALT, предварительно вызвав функцию CryptGenRandom. В первую функцию передаю буфер с случайными данными и его длину. Флаги нулевые. Возвращается код ошибки NTE_BAD_TYPE, что, насколько я понимаю значит, что такого значения KP_SALT она не знает. С чем это может быть связано ?
Код программы :
HCRYPTPROV DescrptProv=0;
HCRYPTHASH DiscrHash = 0;
HCRYPTKEY hKey = 0;
const char *CPar = "12345";
const char *VTInit = "54321";
DWORD RandLen=20;
char *RandBuf;

...
Инициализация крипропровайдера
...

BOOL res;
//Создаем объект хэширования CALG_GR3411
res = CryptCreateHash(DescrptProv,
CALG_GR3411,0,0,&DiscrHash);
if (!res) {
strcpy(ErrMsg, "Ошибка -объекта !");
return -1;
}

//Помещаем в него данные - личный постояный пароль
if (!CryptHashData(DiscrHash,
(BYTE*)CPar,strlen(CPar),0)) {
//Обработка ошибки
}

//Создание ключа по хэш-объекту CALG_G28147
if (!CryptDeriveKey(DescrptProv, CALG_G28147, DiscrHash,
CRYPT_EXPORTABLE, &hKey)) {
//Обработка ошибки
}

//Удаляем хэш-объект
res = CryptDestroyHash(DiscrHash);
if (!res) {
//Обработка ошибки
}

//Запоминаем вектор инициализации
res = CryptSetKeyParam(hKey,KP_IV, (BYTE*)VTInit, 0);
if (!res) {
//Обработка ошибки
}

//Генерируем "мусор"
RandBuf = new char[RandLen+1];
RandBuf[RandLen] = ’\0’;
res = CryptGenRandom(DescrptProv,RandLen,(BYTE*)RandBuf);
if (!res) {
//Обработка ошибки
}

//Изменяем пареметры ключа
res = CryptSetKeyParam(hKey, KP_SALT, (BYTE*)RandBuf, 0);
if (!res) {
switch (GetLastError()) {
case NTE_BAD_FLAGS:
cout << "\nNTE_BAD_FLAGS";break;
case NTE_BAD_TYPE:
cout << "\nNTE_BAD_TYPE";break;
case NTE_PERM:
cout << "\nNTE_PERM";break;
}
}
Ошибка вылетает при вызове последней функции.
 
Ответы:
11.08.2004 17:01:53Александр
При использование CryptoPro CSP солт значение значение ключа вы не получите, т.к. его там нет. Солт - это открытые данные добавляемые к ключу. Их можно получить только для экспортных криптопровайдеров.
11.08.2004 17:01:58Александр
При использование CryptoPro CSP солт значение значение ключа вы не получите, т.к. его там нет. Солт - это открытые данные добавляемые к ключу. Их можно получить только для экспортных криптопровайдеров.