//-------------------------------------------------------------------- //-------------------------------------------------------------------- static void HandleError(const char *s); static void CleanUp(void); static HCRYPTPROV hCryptProv = 0; static HCRYPTKEY hOriginalKey = 0; static HCRYPTKEY hDuplicateKey = 0; int main(void) { DWORD dwMode; BYTE pbData[16]; printf("This program creates a session key and duplicates \n"); printf("that key. Next, parameters are added to the original \n"); printf("key. Finally, both keys are destroyed. \n\n"); // Получение дескриптора контекста криптографического провайдера. if(CryptAcquireContext( &hCryptProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { printf("CryptAcquireContext succeeded. \n"); } else { HandleError("Error during CryptAcquireContext!\n"); } // Генерация ключа. if(CryptGenKey( hCryptProv, CALG_G28147, 0, &hOriginalKey)) { printf("Original session key is created. \n"); } else { HandleError("ERROR - CryptGenKey."); } // Дублирование ключа. if(CryptDuplicateKey( hOriginalKey, NULL, 0, &hDuplicateKey)) { printf("The session key has been duplicated. \n"); } else { HandleError("ERROR - CryptDuplicateKey"); } // Установка дополнительных параметров исходного ключа. // В первую очередь, установка режима шифрования. dwMode = CRYPT_MODE_ECB; if(CryptSetKeyParam( hOriginalKey, KP_MODE, (BYTE*)&dwMode, 0)) { printf("Key Parameters set. \n"); } else { HandleError("Error during CryptSetKeyParam."); } // Генерация случайного вектора инициализации. if(CryptGenRandom( hCryptProv, 8, pbData)) { printf("Random sequence generated. \n"); } else { HandleError("Error during CryptGenRandom."); } // Установка вектора инициализации. if(CryptSetKeyParam( hOriginalKey, KP_IV, pbData, 0)) { printf("Parameter set with random sequence as initialization vector. \n"); } else { HandleError("Error during CryptSetKeyParam."); } CleanUp(); printf("\nThe program ran to completion without error. \n"); return 0; } void CleanUp(void) { if(hOriginalKey) CryptDestroyKey(hOriginalKey); if(hDuplicateKey) CryptDestroyKey(hDuplicateKey); if(hCryptProv) CryptReleaseContext(hCryptProv, 0); } // Конец примера
AIX: 6/7.
FreeBSD: 11/12, pfSense 2.x.
Linux: LSB 4.x (RHEL 5/6/7/8, SuSE 11SP4/12/15, Oracle Linux 5/6/7/8, CentOS 6/7/8, Ubuntu 14.04/16.04/18.04/19.10, Linux Mint 18/19, Fedora 28/29/30/31, Debian 8/9/10 и др.).
Solaris: 10/11.
Mac OS X: 10.9/10.10/10.11/10.12/10.13/10.14/10.15.
iOS: 8/9/10/11/12/13.
Sailfish: 2/3.
Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.