带加密模式bf-cbc的IV为0xFFFFFFFFFFFFFFFF的openssl_encrypt

时间:2019-06-18 07:36:25

标签: php delphi php-openssl

我正在使用第三方软件,该软件以加密模式CBC和IV为0xFFFFFFFFFFFFFFFFFF在河豚中创建密钥。如何将这样的IV传递给openssl_encrypt?源字符串的编码是Windows1252。

我使用的是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加密纲要第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');

我尝试使用0xFFFFFFFFFFFFFFFF的IV,因为看起来如此,在这种情况下,这是Delphi加密摘要的默认设置。我也尝试过传递0x0000000000000000。

1 个答案:

答案 0 :(得分:3)

初始化向量只是二进制数据-无需使用整数。因此答案很简单:$sIv= "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";

其余的还不清楚:“结果总是不同”是什么意思?确保Delphi程序始终产生相同的输出(否则,它将使用您尚未意识到的初始化或执行比脚本更多的初始化)。即使第二个输出完全没有意义,您的PHP脚本每次执行仍应产生相同的输出(对二进制数据进行UTF解码-您甚至忘记了“ 8”)。