Для ясности обработка ошибок в код не включена. #define ENCRYPT_BLOCK_SIZE 8 // где-то в header-файле В .cpp файле // Необходимые действия по инициализации криптопровайдера, // генерации сессионного ключа и получению исходных // данных … /* hSessionKey - сгенерированный сессионный ключ BYTE * pbData - указатель на заданные исходные данные DWORD dwDataLen - длина исходных данных */ DWORD dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; DWORD dwBufferLen=0; // Размер буфера для блока данных, //который будет //шифроваться за один шаг BYTE * pbBuffer = 0; // временный рабочий буфер BYTE * pbOutData = 0; // буфер для записи выходных данных if(ENCRYPT_BLOCK_SIZE > 1) dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; else dwBufferLen = dwBlockLen; pbBuffer = new BYTE[dwBufferLen]; //*********** Шифруем данные ************* // определить длину буфера для зашифрованных данных DWORD dwOutLen = dwDataLen; CryptEncrypt(hSessionKey, 0, TRUE, 0, 0, // &dwOutLen, dwBufferLen)); // Выделить буфер подходящего размера pbOutData = new BYTE[dwOutLen]; int nOutPos = 0, nInPos = 0, i = 1; // i - номер текущего блока bool bMore = true; DWORD dwCount = 0; // количество байтов очередной порции данных // счетчик (на сколько блоков разбиваются исходные данные) int nBlocks = (dwDataLen%dwBlockLen == 0) ? dwDataLen/dwBlockLen : (dwDataLen/dwBlockLen+1); BOOL bEnd = (nBlocks == 1); // один блок? шифруем за один раз? // Сколько байт считывать первый раз? if (bEnd) dwCount = dwDataLen; else dwCount = dwBlockLen; do { // скопировать в буфер очередной блок данных memcpy(pbBuffer, pbData+nInPos, dwCount); nInPos += dwCount; CryptEncrypt(hSessionKey, 0, bEnd, 0, pbBuffer, &dwCount, dwBufferLen); memcpy(pbOutData+nOutPos, pbBuffer, dwCount); nOutPos += dwCount; if (++i > nBlocks) bMore = false; // Это был последний блок // входных данных else // сколько байт считывать в следующий раз? dwCount = ((dwDataLen - nInPos) > dwBlockLen) ? dwBlockLen : (dwDataLen - nInPos); if (i == nBlocks) bEnd = TRUE; } while(bMore);