为了账号安全,请及时绑定邮箱和手机立即绑定

openssl_encrypt,IV 为 0xFFFFFFFFFFFFFFFF

openssl_encrypt,IV 为 0xFFFFFFFFFFFFFFFF

PHP
忽然笑 2021-08-27 16:39:29
我正在使用第三方软件,该软件以加密模式 CBC 和 0xFFFFFFFFFFFFFFFF 的 IV 在河豚中创建密钥。如何将这样的 IV 传递给 openssl_encrypt?源字符串的编码是windows 1252。我使用带有 UTF-8 的 PHP 7.3。这是我目前的尝试:$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/1Delphi 函数如下所示: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 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2021-08-27
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信