30.10.2003 17:22:11Передача сессионного ключа в другой процесс? Ответов: 1
Юрий
Надо передать сессионный ключ (ключ
для симетричного шифрования по ГОСТ 28147) в другой процесс. Очевидно, что нельзя просто передать дескриптор ключа (с типом HCRYPTKEY), так как по сути это
просто указатель, и в другом прцессе он будет указывать в никуда. Обычный способ экспорта/импорта сессионного ключа(с выработкой ключа обмена и т.д), неоднократно описанный на этом форуме, не подходит, так как работает слишком медленно. Существуют ли другие способы ?
 
Ответы:
04.11.2003 10:12:36Василий
Ключ обмена для экспорта-импорта нужен обязательно. Однако, в Вашем случае его можно сделать проще:
1. Создать функцией CryptDeriveKey сессионный симметричный ключ (CALG_G28147) с помощью хеша некоторого буфера (например, вводимого пароля).
2. Превратить его в ключ обмена, изменив алгоритм на CALG_PRO_EXPORT.
После чего на нём можно экспортировать рабочий сессионный ключ.
Вот текст примера:
const char *szPsw="9872587258238596";
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY signKey;
const DWORD algid_export = CALG_PRO_EXPORT;


HCRYPTKEY h;
const ALG_ID hashAlg = CALG_GR3411;
const ALG_ID encAlg = CALG_G28147;
const LPCTSTR pszProvider = CP_DEF_PROV;
const DWORD dwProvType = PROV_GOST_DH;
DWORD dwDataLen;

size_t length = strlen(szPsw);

if(!CryptAcquireContext( &hProv,
NULL,
pszProvider,
dwProvType,
CRYPT_VERIFYCONTEXT ))
HandleError("CryptAcquireContext");

if(!CryptCreateHash(hProv, hashAlg, 0, 0,&hHash))
HandleError("CryptCreateHash");
if (!CryptHashData(hHash, (BYTE*)szPsw, length, 0))
HandleError("CryptHashData");
if(!CryptDeriveKey(hProv, encAlg, hHash, CRYPT_EXPORTABLE, &h))
HandleError("CryptDeriveKey");

if(!CryptSetKeyParam(h, KP_ALGID, (BYTE*)&algid_export, 0 ))
HandleError("CryptSetKeyParam");

....

void HandleError(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // End of HandleError