Delphi DEC Twofish Encryption и серверная расшифровка в PHP
Я должен зашифровать строку в Delphi с помощью алгоритма Twofish/CBC, отправить ее на сервер и там расшифровать. Я протестировал приведенный ниже код, и процесс кодирования / декодирования B64 работает, однако я застрял в шифровании / дешифровании шифра.
Я использую DEC 5.2 для Delphi.
Вот код Delphi, который выполняет шифрование:
class function TEncryption.EncryptStream(const AInStream: TStream; const AOutStream: TStream; const APassword: String): Boolean;
var
ASalt: Binary;
AData: Binary;
APass: Binary;
begin
with ValidCipher(TCipher_Twofish).Create, Context do
try
ASalt := RandomBinary(16);
APass := ValidHash(THash_SHA1).KDFx(Binary(APassword), ASalt, KeySize);
Mode := cmCBCx;
Init(APass);
EncodeStream(AInStream, AOutStream, AInStream.Size);
result := TRUE;
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(APass);
end;
end;
class function TEncryption.EncryptString(const AString, APassword: String): String;
var
instream, outstream: TStringStream;
begin
result := '';
instream := TStringStream.Create(AString);
try
outstream := TStringStream.Create;
try
if EncryptStream(instream, outstream, APassword) then
result := outstream.DataString;
finally
outstream.Free;
end;
finally
instream.Free;
end;
end;
И функция PHP, которая должна расшифровывать отправленные данные:
function decrypt($input, $key) {
$td = mcrypt_module_open('twofish', '', 'cbc', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$decrypted_data = mdecrypt_generic($td, base64_decode_urlsafe($input));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decrypted_data;
}
Я полагаю, что мне нужно немного поиграть с солью и векторами инициализации, однако я понятия не имею, как. Из того, что я понимаю, функция KDFx() делает SHA1 хэшированным паролем из пароля пользователя и соли, но я довольно сильно застрял на этом этапе.
1 ответ
KDFx - это собственный несовместимый метод получения ключей из источника: "функция класса TDECHash.KDFx // собственный KDF DEC, даже сильнее". Вы будете иметь проблемы с использованием этого из DEC и PHP и должны использовать другие библиотеки. Проблема обсуждается, например, в http://www.delphipraxis.net/171047-dec-5-2-mit-vector-deccipher-umbau-von-dot-net-auf-delphi.html