| ||||
| ||||
Надо передать сессионный ключ (ключ для симетричного шифрования по ГОСТ 28147) в другой процесс. Очевидно, что нельзя просто передать дескриптор ключа (с типом HCRYPTKEY), так как по сути это просто указатель, и в другом прцессе он будет указывать в никуда. Обычный способ экспорта/импорта сессионного ключа(с выработкой ключа обмена и т.д), неоднократно описанный на этом форуме, не подходит, так как работает слишком медленно. Существуют ли другие способы ? | ||||
Ответы: | ||||
| ||||
Ключ обмена для экспорта-импорта нужен обязательно. Однако, в Вашем случае его можно сделать проще: 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 | ||||