Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline topcraze  
#1 Оставлено : 27 марта 2009 г. 11:18:05(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Здравствуйте!
Подскажите пожалуйста, в чем может быть проблема?
Генерирую ключевую пару (RSA на ENHANCED_PROV), сохраняю ее в файл (public функцией CryptExportKey, private - CryptExportPKCS8). В дальнейшем пытаюсь создать контейнер на этой паре. Импорт открытого ключ проходит нормально, а вот импорт закрытого не получается (возваращется ошибка ERROR_INVALID_PARAMETER). Вот как делаю:
Код:

CRYPT_PKCS8_IMPORT_PARAMS  impParam;

FILE *f = fopen("c:\\temp\\privkey.key","rb");
     fseek(f,SEEK_SET,SEEK_END);
  DWORD     f_len = ftell(f);
      impParam.PrivateKey.pbData = (BYTE*)malloc(f_len);
      memset(impParam.PrivateKey.pbData,0,f_len);
      impParam.PrivateKey.cbData = f_len;
      fseek(f,0,SEEK_SET);
      f_len = ftell(f);
      fread(impParam.PrivateKey.pbData,impParam.PrivateKey.cbData,1,f);
      fclose(f);
impParam.pResolvehCryptProvFunc =NULL;
impParam.pVoidResolveFunc = NULL;
impParam.pDecryptPrivateKeyFunc = NULL;
impParam.pVoidDecryptFunc = NULL;
DWORD err=0;
if (!CryptImportPKCS8(impParam,CRYPT_EXPORTABLE,&hCryptProv,NULL))
{
err = GetLastError();
return 1;
}


В чем может быть проблема? Нужно ли описывать callback (pResolvehCryptProvFunc)? Если да, то как?
Offline topcraze  
#2 Оставлено : 27 марта 2009 г. 11:24:29(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Вот кстати, еще вопрос.. Можно как-то "заставить" CryptoAPI генерировать RSA-ключи на флэшку?

Заранее спасибо.
Offline Kure  
#3 Оставлено : 27 марта 2009 г. 12:10:00(UTC)
Kure

Статус: Администратор

Группы: Администраторы, Участники
Зарегистрирован: 13.12.2007(UTC)
Сообщений: 111
Откуда: Крипто-Про

Поблагодарили: 33 раз в 10 постах
По первому вопросу не подскажу, по второму.
CryptoAPI к генерации ключей не имеет никакого отношения. Генерит CSP. Микрософтовые CSP генерят только в реестр.
Но сохранить на флэшку уже сгенеренные можно, экспортировав в PFX.
Offline topcraze  
#4 Оставлено : 27 марта 2009 г. 13:50:52(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Цитата:
Но сохранить на флэшку уже сгенеренные можно, экспортировав в PFX.

Эмм... а разве pfx - это не для сертификатов? По крайней мере MSDN говорит:
"The PFXExportCertStore function exports the certificates and, if available, the associated private keys from the referenced certificate store. ".. А как туда только ключи положить?
Offline Kirill Sobolev  
#5 Оставлено : 27 марта 2009 г. 14:07:06(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
В чем может быть проблема? Нужно ли описывать callback (pResolvehCryptProvFunc)? Если да, то как?

Нужно. Эта функция как раз и возвращает контекст провайдера, куда импортируется ключ.
Описывать так как написано в MSDN.
Техническую поддержку оказываем тут
Наша база знаний
Offline topcraze  
#6 Оставлено : 27 марта 2009 г. 16:01:06(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Спасибо за ответ! :)

Цитата:
Описывать так как написано в MSDN.

А можете подсказать, в структуре CRYPT_PRIVATE_KEY_INFO как поля заполнять? Вот например версию какую указывать? Опять же PrivateKey (СRYPT_DER_BLOB ) - это содержимое файла PKCS8?
И с параметром pVoidResolveFunc тоже непонятно.. Brick wall
А из callback возвращаемый hCryptProv надо CryptAcquireContext получать?
Offline Kirill Sobolev  
#7 Оставлено : 27 марта 2009 г. 16:23:18(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
заполнять согласно стандарту ftp://ftp.rsasecurity.com/pub/pkcs/doc/pkcs-8.doc
да, инициализация провайдера осуществляется функцией CryptAcquireContext
Техническую поддержку оказываем тут
Наша база знаний
Offline topcraze  
#8 Оставлено : 27 марта 2009 г. 17:53:18(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Спасибо, Кирилл! Попробую :)
Offline topcraze  
#9 Оставлено : 30 марта 2009 г. 19:04:57(UTC)
topcraze

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.03.2009(UTC)
Сообщений: 7

Вообщем заработало вот так.. Может кому пригодится..
Callback:
Код:

__stdcall  ResolveFunc(CRYPT_PRIVATE_KEY_INFO* pPrivateKeyInfo,HCRYPTPROV* phCryptProv, LPVOID pVoidResolveFunc)
{
     CryptAcquireContext(phCryptProv,NULL,MS_ENHANCED_PROV,1,0);
     return 1;
}

сам вызов:
Код:

CRYPT_PKCS8_IMPORT_PARAMS  impParam;
FILE *f = fopen("privkey.key","rb");
fseek(f,SEEK_SET,SEEK_END);
DWORD     f_len = ftell(f);
impParam.PrivateKey.pbData = (BYTE*)malloc(f_len);
memset(impParam.PrivateKey.pbData,0,f_len);
impParam.PrivateKey.cbData = f_len;

fseek(f,0,SEEK_SET);
f_len = ftell(f);
fread(impParam.PrivateKey.pbData,impParam.PrivateKey.cbData,1,f);
fclose(f);
CRYPT_PRIVATE_KEY_INFO keyInfo;

memset(&keyInfo,0,sizeof(keyInfo));
keyInfo.Version = 1;
keyInfo.Algorithm.pszObjId = "1.2.840.113549.1.1.1";
keyInfo.PrivateKey.cbData  =impParam.PrivateKey.cbData;
keyInfo.PrivateKey.pbData = (BYTE*)malloc(impParam.PrivateKey.cbData);
memcpy(keyInfo.PrivateKey.pbData,impParam.PrivateKey.pbData,impParam.PrivateKey.cbData);

impParam.pResolvehCryptProvFunc = ResolveFunc;
impParam.pVoidResolveFunc = NULL;
impParam.pDecryptPrivateKeyFunc = NULL;
impParam.pVoidDecryptFunc = NULL;
DWORD err=0;
if (!CryptImportPKCS8(impParam,CRYPT_EXPORTABLE,&hCryptProv,NULL))
{
err = GetLastError();
return 1;
}

Еще раз спасибо :)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.