Я использую стороннее программное обеспечение, которое создает ключ в Blowfish в режиме шифрования CBC и IV в 0xFFFFFFFFFFFFFFFF.Как я могу передать IV как это openssl_encrypt?Кодировка исходной строки - windows 1252.
Я использую PHP 7.3 с UTF-8.
Это мои текущие попытки:
$data = utf8_decode('12345678');
// if(strlen($data) % 8)
// $data = str_pad($data, strlen($data) + 8 - strlen($data) % 8, "\0");
$opts = OPENSSL_ZERO_PADDING;
if(defined('OPENSSL_DONT_ZERO_PAD_KEY'))
$opts = $opts | OPENSSL_DONT_ZERO_PAD_KEY;
echo openssl_encrypt($data, 'bf-cbc', utf8_decode('my-secret-key'), $opts, hex2bin('FFFFFFFFFFFFFFFF')) . '<br />';
$opts = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
echo base64_encode(utf8_decode(openssl_encrypt($data, 'bf-cbc', utf8_decode('my-secret-key'), $opts, hex2bin('FFFFFFFFFFFFFFFF')))) . '<br />';
Результат всегда отличается,Другой конец использует «Delphi Encryption Compendium Part I-III».Я не могу изменить способ, которым другое программное обеспечение создает зашифрованные данные.Исходный код версии, которую использует программное обеспечение Delphi, можно найти здесь: https://github.com/winkelsdorf/DelphiEncryptionCompendium/releases/tag/1
Функция Delphi выглядит следующим образом:
function BlowfishEncryptStr(const InStr, Password: string;
var OutStr: string; Format: Integer = -1): Boolean;
var
Cipher: TCipher_Blowfish;
begin
Cipher := TCipher_Blowfish.Create(Password, nil);
try
try
Cipher.Mode := cmCBC;
OutStr := Cipher.CodeString(InStr, paEncode, Format);
Result := True;
except
Result := False;
end;
finally
FreeAndNil(Cipher);
end;
end;
Функция вызывается со следующими параметрами:
BlowfishEncryptStr('12345678', 'my-secret-key');
Я попробовал IV для 0xFFFFFFFFFFFFFFFF, потому что кажется, что в данном случае это стандартное значение Delphi Encryption Compendium.Я также пытался передать 0x0000000000000000.