| ||||
| ||||
Использую функции cryptoapi в delphi (описания взяты из wcrypt2). Проблема в следующем: при шифрации на одних наборах данных, с одними и теми же параметрами, результат шифрованного текста различен. Подскажите с чем это может быть связано | ||||
Ответы: | ||||
| ||||
Можно чуть подробнее - как Вы обеспечиваете одинаковость сессионного симметричного ключа и синхровектора ключа на разных ОС. | ||||
| ||||
Если бы был представлен код которым вы шифруете было бы яснее. А так можно сказать что возможно вы спутали передаваемый параметр в функцию шифрования. Например у меня была такая же фигня когда вместо блока(массива) начального вектора я передавал его адрес. И результат шифрования менялся после каждой новой перекомпиляции. Причем шифровалось и расшифровавалось все нормально, только с каждой новой сборкой новый результат :) | ||||
| ||||
Привожу пример функции для шифрации: Также заметил следующие отличия, если получить информацию о доступных криптопровайдерах и их параметрах для различных ОС, то можно сделать вывод, что в WINXP увеличена длина ключа до 128 бит (вместо 40) для алгоритма RSA_FULL. Алгоритм DES длину ключа не изменил, поэтому при его использовании шифруется во всех ОС нормально. Пожалуйста подскажите можно как-то принудительно задать длину ключа для RSA. InitAll; //начальная инициализация OpenFiles; //открыть файлы для сточника и назначения if not CryptAcquireContext(@hProv,nil,nil,PROV_RSA_FULL,0) then if not CryptAcquireContext(@HProv,nil,nil,PROV_RSA_FULL,crypt_newkeyset) then begin Windows.MessageBox(0, ’Error during CryptAcquireContext’, ’Error...’,MB_OK); CleanAll; //освободить ресурсы Exit; end; if not CryptCreateHash(hProv,CALG_MD5,0,0,@hHash) then begin Windows.MessageBox(0, ’Error during CryptCreateHash’, ’Error...’,MB_OK); CleanAll; Exit; end; if not CryptHashData(hHash,PBYTE(FPassword),Length(FPassword),0) then begin Windows.MessageBox(0, ’Error during CryptHashData’, ’Error...’,MB_OK); CleanAll; Exit; end; if not CryptDeriveKey(hProv,ENCRYPT_ALGORITHM,hHash,0,@hKey) then begin Windows.MessageBox(0, ’Error during CryptDeriveKey’, ’Error...’,MB_OK); CleanAll; Exit; end; CryptDestroyHash(hHash); hHash := 0; end; dwBlockLen := 1000 - 1000 mod ENCRYPT_BLOCK_SIZE; if ENCRYPT_BLOCK_SIZE > 1 then dwBufferLen := dwBlockLen + ENCRYPT_BLOCK_SIZE else dwBufferLen := dwBlockLen; try GetMem(pbBuffer,dwBufferLen); except on EOutOfMemory do CleanAll; end; repeat BlockRead(hSource,pbBuffer^,dwBlockLen,dwCount); Endof := Eof(hSource); if not CryptEncrypt(hKey,0,Endof,0,pbBuffer,@dwCount,dwBufferLen) then begin Windows.MessageBox(0, ’Error during CryptEncrypt’, ’Error...’,MB_OK); CleanAll; Exit; end; BlockWrite(hDestination,pbBuffer^,dwCount); until Eof(hSource); CleanAll; | ||||
| ||||
Третий параметр в CryptAcquireContext указывает имя CSP. Если этот параметр nil, то будет использоваться CSP по умолчанию для данной операционки. Попробуй прописать провайдера жестко. К примеру MS_DEF_PROV. | ||||