23.04.2004 8:20:33отличия результатов шифрации в win98 (win200) от winxp Ответов: 4
sergey
Использую функции cryptoapi в delphi (описания взяты из wcrypt2). Проблема в следующем: при шифрации на одних наборах данных, с одними и теми же параметрами, результат шифрованного текста различен. Подскажите с чем это может быть связано
 
Ответы:
26.04.2004 10:27:10Василий
Можно чуть подробнее - как Вы обеспечиваете одинаковость сессионного симметричного ключа и синхровектора ключа на разных ОС.
26.04.2004 11:05:16chip
Если бы был представлен код которым вы шифруете было бы яснее. А так можно сказать что возможно вы спутали передаваемый параметр в функцию шифрования. Например у меня была такая же фигня когда вместо блока(массива) начального вектора я передавал его адрес. И результат шифрования менялся после каждой новой перекомпиляции. Причем шифровалось и расшифровавалось все нормально, только с каждой новой сборкой новый результат :)
27.04.2004 7:37:42sergey
Привожу пример функции для шифрации:

Также заметил следующие отличия, если получить информацию о доступных криптопровайдерах и их параметрах для различных ОС, то можно сделать вывод, что в 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;
13.05.2004 20:22:24mad
Третий параметр в CryptAcquireContext указывает имя CSP. Если этот параметр nil, то будет использоваться CSP по умолчанию для данной операционки. Попробуй прописать провайдера жестко. К примеру MS_DEF_PROV.