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