openssl_encrypt с IV 0xFFFFFFFFFFFFFFFF с режимом шифрования bf-cbc - PullRequest
2 голосов
/ 18 июня 2019

Я использую стороннее программное обеспечение, которое создает ключ в 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.

1 Ответ

3 голосов
/ 19 июня 2019

Вектор инициализации - это просто двоичные данные - не нужно использовать целые числа. Поэтому ответ прост: $sIv= "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";.

Остальное довольно неясно: что означает «результат всегда отличается»? Убедитесь, что программа Delphi всегда выдает один и тот же вывод (в противном случае она использует инициализации, о которых вы еще не знаете, или делает больше, чем ваш скрипт). Ваш PHP-скрипт всегда должен выдавать один и тот же вывод за выполнение, хотя второй вывод вообще не имеет смысла (UTF-декодирование двоичных данных - вы даже забыли «8»).

...