Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2016(UTC) Сообщений: 9 Откуда: Санк-Петербург Сказал(а) «Спасибо»: 1 раз
|
Есть код (кривой, с unused variables и т.п.) для шифрования блока данных в драйвере шифрования диска. Код:
/*!
Функция зашифровывает блок данных.
@param h_prov - дескриптор CSP
@param key - дескриптор ключа шифрования
@param iv - указатель на вектор инициализации
@param data - указатель на данные
@param len_data - размер данных
@return TRUE в случае успеха, FALSE в случае неудачи
*/
BOOL csp_encrypt (
HCRYPTPROV h_prov,
HCRYPTKEY key,
PBYTE iv,
PBYTE data,
DWORD len_data,
u64 ind // смещение данных на диске
)
{
BOOL ret=FALSE;
DWORD len_data_=len_data;
DWORD num_sec=0;
PBYTE cur_data=data;
DWORD cur_sec=0;
DWORD size_sec=512;
DWORD enc_len=size_sec;
HCRYPTKEY hDupKey;
u64 index = ind;
if (hCSP == NULL) return FALSE;
if (len_data >= 512)
{
num_sec=len_data/size_sec;
}
else
{
num_sec=1;
enc_len=len_data;
}
for (cur_sec=0; cur_sec < num_sec; cur_sec++, cur_data+=size_sec)
{
ret = hCSP->DuplicateKey(hCSP,h_prov, key,NULL,0,&hDupKey);
ret = hCSP->SetKeyParam(hCSP,h_prov, hDupKey, KP_IV, &index, 0); // синхропосылка, 64-битный элемент данных
ret = hCSP->Encrypt (
hCSP,
h_prov,
hDupKey, //key,
0,
TRUE, // Final
0,
cur_data,
&enc_len,
enc_len );
if (ret)
{
DbgMsg ("CPEncrypt error. 0x%8.8X\n",ret);
//return ret;
}
ret = hCSP->DestroyKey(hCSP,h_prov, hDupKey);
index += 512;
}
return ret;
}
Буфер шифруется кусками по 512 байт (это конечно затраты на лишние вызовы API). В качестве синхропосылки используется смещение блока данных в байтах. Т.е. 0, 0x200, 0x400... А как было бы "правильно" менять это значение, как оно меняется в процессе шифрования 512 байт? Например для первых 8-ми байт 0, для следующих 1, 2...? Или 0, 8, 16... Или какие-то манипуляции с этим числом проводятся?
|