Для ясности обработка ошибок в код не включена.
#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);

Поделитесь материалом с коллегами и друзьями