Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Если коротко, то так и было задумано в CSP 3.0. Чуть более подробнее. 1. При CryptAcquireContext( CRYPT_NEWKEYSET ) контейнер не записывается на носитель, да же пустой, и, если не предпринимать никаких действий, то и его следов не останется, а после закрытия его можно попробовать создать заново. Такая функиональность необходима для тех носителей, которые требуют пароль для любой записи. 2. Самый простой способ создать пустой контейнер (именно сохранить пустой на носителе) в КриптоПро CSP, выполнить: Код:::CryptGetProvParam( hProv, PP_HCRYPTPROV, (BYTE*)&dwData, &dwDataLen, 0 )
после CryptAcquireContext, но перед этим потребуется задать пароль на вновь создаваемый контейнер. Если это не сделать, то сохранение контейнера, потребует его ввести в окне. В режиме без окон (CRYPT_SILENT), его можно задать, например, пустой так: Код:CRYPT_PIN_PARAM param;
param.type = CRYPT_PIN_PASSWD;
param.dest.passwd = "";
CryptSetProvParam( hProv, PP_SET_PIN, (BYTE*)¶m, 0 )
3. Если внести это в Вашу программу получится, примерно так Код:
...
for(ULONG i = 0,f = CRYPT_SILENT;;++i)
{
HCRYPTPROV hProv;
if(::CryptAcquireContext(&hProv,container,provider,type,f))
{
printf("\ndone i=%u f=%8.8x\n",i,f);
if( ( f & CRYPT_NEWKEYSET ) && ( type == 75 || type == 71 ) )
{
DWORD dwData;
DWORD dwDataLen = sizeof( dwData );
CRYPT_PIN_PARAM param;
param.type = CRYPT_PIN_PASSWD;
param.dest.passwd = "";
if( !::CryptSetProvParam( hProv, PP_SET_PIN, (BYTE*)¶m, 0 ) )
{
printf( "\nset passwd fail\n");
return 0;
}
if( !::CryptGetProvParam( hProv, PP_HCRYPTPROV, (BYTE*)&dwData, &dwDataLen, 0 ) )
{
printf( "\nsave fail\n");
return 0;
}
}
....
4. В последних версиях CSP 3.6 открыть созданный контейнер, но без следов на носителе можно, но, если его не записывать (генерировать ключи или не сохранять как в примере Выше), то сохранен на диске он все равно не будет. |