//-------------------------------------------------------------------- // В данном примере осуществляется создание случайного сессионного // ключа шифрования и изменение одного из его параметров (вектора // инициализации). //--------------------------------------------------------------------- static void HandleError(const char *s); static void CleanUp(void); static HCRYPTPROV hProv = 0; static HCRYPTKEY hKey = 0; int main(void) { DWORD dwMode; BYTE pbData[16]; BYTE pbRandomData[8]; DWORD dwCount; DWORD i; //-------------------------------------------------------------------- // Получение дескриптора контекста криптографического параметра. if(!CryptAcquireContext( &hProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { HandleError("Error during CryptAcquireContext."); } //-------------------------------------------------------------- // Генерация восьми байтов случайных данных в pbRandomData. if(CryptGenRandom( hProv, 8, pbRandomData)) { printf("Eight bytes of random data have been generated.\n"); } else { HandleError("Random bytes were not correctly generated."); } // Создание случайного сессионного ключа блочного шифрования. if(!CryptGenKey( hProv, CALG_G28147, CRYPT_EXPORTABLE, &hKey)) { HandleError("Error during CryptGenKey."); } //-------------------------------------------------------------------- // Чтение режима шифрования. dwCount = sizeof(DWORD); if(CryptGetKeyParam( hKey, KP_MODE, (BYTE*)&dwMode, &dwCount, 0)) { //--------------------------------------------------------------- // Печать режима шифрования. printf("Default cipher mode: %d\n", dwMode); } else { HandleError("Error during CryptGetKeyParam."); } //--------------------------------------------------------------- // Чтение вектора инициализации. //------------------------------------------------------------- // Получение длины вектора инициализации. if(!CryptGetKeyParam( hKey, KP_IV, NULL, &dwCount, 0)) { HandleError("Error getting the IV length"); } //-------------------------------------------------------------- // Получение IV - вектора инициализации. if(CryptGetKeyParam( hKey, KP_IV, pbData, &dwCount, 0)) { //--------------------------------------------------------- // Печать вектора инициализации. printf("Default IV:"); for(i=0;i<dwCount;i++) printf("%2.2x ",pbData[i]); printf("\n"); } else { HandleError("Error getting the IV."); } //------------------------------------------------------------- // Переустановка вектора инициализации. if(CryptSetKeyParam( hKey, KP_IV, pbRandomData, 0)) { printf("New intialization vector is set.\n"); } else { HandleError("The new IV was not set."); } //--------------------------------------------------------------- // Чтение нового вектора инициализации. //------------------------------------------------------------- // Получение длины нового вектора инициализации. if(!CryptGetKeyParam( hKey, KP_IV, NULL, &dwCount, 0)) { HandleError("Error getting the IV length"); } //-------------------------------------------------------------- // Получение IV - вектора инициализации. if(CryptGetKeyParam( hKey, KP_IV, pbData, &dwCount, 0)) { //--------------------------------------------------------- // Печать вектора инициализации. printf("RE-set IV:"); for(i=0;i<dwCount;i++) printf("%2.2x ",pbData[i]); printf("\n"); } else { HandleError("Error getting the IV."); } CleanUp(); printf("\nProgram completing without error.\n\n"); return 0; } void CleanUp(void) { if(hKey) CryptDestroyKey(hKey); if(hProv) CryptReleaseContext(hProv, 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.