09.10.2006 11:32:39Вопрос по CRYPT_MODE_ECB/CNT/CFB/CBC Ответов: 0
Alex

Возник вопрос как шифровать файл. (в примерах Encrypt/DecryptFile он по умолчанию шифруется врозможно неправильно)

Я делаю:

CryptAcquireContext( &m_hCryptProv, ContainerName,NULL,75, 0);

CryptGenKey( m_hCryptProv,CALG_G28147,CRYPT_EXPORTABLE, m_hSessionKey));

for()
{.. CryptEncrypt(..)..}

for()
{.. CryptDecrypt(..) ..}

При этом в расшифрованом файле в начале каждого блока (в примере этот блок 4кб) мусор
Это как я понял типовая ситуация т.к. вектор изменяется
каждый раз после Encrypt

CryptGetKeyParam() показывает что режим по умолчанию CRYPT_MODE_OFB (он же CRYPT_MODE_CNT)

В примере делается
CryptGetKeyParam( m_hSessionKey, KP_IV,Vector,&dwIV, 0);
перед Encrypt и
СryptSetKeyParam(m_hSessionKey,ЛP_IV,Vector,0);
перед Decrypt

да это исправляет ситуацию , НО только для ПЕРВОГО блока
а для всех остальных все равно мусор в начале блока

Соотв если делать это перед каждым блоком то все ОК
НО ХОТЕЛОСЬ бы делать только один раз.
(в примере кстати это делается ТОЛЬКО ОДИН раз и соотв со второго блока в начале блока мусор)

Вопрос как сделать установку вектора только один раз для ВСЕГО файла (много опреаций Crypt)
(не хотелось бы для каждого блока хранить еще и доп 8 байт вектора)

Я так понимаю это все зависит от режима шифрования
(CRYPT_MODE_ECB/CNT/CFB/CBC)

Пытаюсь выставить режим при генерации ключа
CryptGenKey( m_hCryptProv,
CALG_G28147, CRYPT_EXPORTABLE, &m_hSessionKey);

DWORD mode=CRYPT_MODE_ECB;
BOOL status=CryptSetKeyParam(
m_hSessionKey,
KP_MODE,
(BYTE*)(&mode),
0);

Но это приводит вообще к полностью неправ расшифровке..

Подскажите в чем делаю ошибку (и как предполагалась нормальная работа примеров CryptFile/DecryptFile, с учетом того что вектор меняется каждый раз файлы дешифруются неправильно в примерах..)?

Thanks.