//-------------------------------------------------------------------- // Пример создания сессионного ключа, основанного на хэше, рассчитанного // из пароля пользователя. Пароль вводится в процессе работы программы. // Замечание: под win32 рекомендуется использовать _s аналоги CRT функций. //-------------------------------------------------------------------- #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) static void HandleError(char *s); static void CleanUp(void); static HCRYPTPROV hCryptProv = 0; static HCRYPTKEY hKey = 0; static HCRYPTHASH hHash = 0; int main(void) { //-------------------------------------------------------------------- // Пароль из которого будет получен сессионный ключ. CHAR szPassword[] = "123456\0"; DWORD dwLength; dwLength = (DWORD)strlen(szPassword); //-------------------------------------------------------------------- // Получение дескриптора контекста криптографического провайдера. if(CryptAcquireContext( &hCryptProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { printf("A context has been acquired. \n"); } else { HandleError("Error during CryptAcquireContext!"); } //-------------------------------------------------------------------- // Создание пустого объекта хэширования. if(CryptCreateHash( hCryptProv, CALG_GR3411_2012_256, 0, 0, &hHash)) { printf("An empty hash object has been created. \n"); } else { HandleError("Error during CryptCreateHash!"); } //-------------------------------------------------------------------- // Хэширование строки пароля. if(CryptHashData( hHash, (BYTE *)szPassword, dwLength, 0)) { printf("The password has been hashed. \n"); } else { HandleError("Error during CryptHashData!"); } //-------------------------------------------------------------------- // Создание сессионного ключа, основанного на хэше, полученного из пароля. if(CryptDeriveKey( hCryptProv, CALG_G28147, hHash, CRYPT_EXPORTABLE, &hKey)) { printf("The key has been derived. \n"); } else { HandleError("Error during CryptDeriveKey!"); } CleanUp(); printf("The program to derive a key completed without error. \n"); return 0; } void CleanUp(void) { if(hHash) CryptDestroyHash(hHash); // Уничтожение сессионного ключа. if(hKey) CryptDestroyKey(hKey); // Освобождение дескриптора провайдера. if(hCryptProv) CryptReleaseContext(hCryptProv, 0); } // Конец примера
AIX: 5/6/7 или выше.
FreeBSD: 7/8/9 или выше.
Linux: LSB 3.1 (RHEL 4, SuSE 10) или выше.
Solaris: 10 или выше.
Mac OSX: 10.7/8 или выше.
iOS: 6/7 или выше.
Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше.
Ядро Windows NT: не поддерживает.