openssl_encrypt IV 为 0xFFFFFFFFFFFFFFFF 加密模式为 bf-cbc
openssl_encrypt with a IV of 0xFFFFFFFFFFFFFFFF with encryption mode bf-cbc
我正在使用第三方软件,它以加密模式 CBC 和 0xFFFFFFFFFFFFFFFF 的 IV 在河豚中创建密钥。我怎样才能将这样的 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, "[=11=]");
$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');
我尝试了 0xFFFFFFFFFFFFFFFF 的 IV,因为看起来是这样,在这种情况下,这是 Delphi 加密纲要的默认值。我也尝试通过 0x0000000000000000。
初始化向量只是二进制数据——不需要使用整数。所以答案很简单:$sIv= "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
。
剩下的就不清楚了:"result always differ" 是什么意思?确保 Delphi 程序始终产生相同的输出(否则它会使用您还不知道的初始化,或者比您的脚本做的更多)。您的 PHP 脚本应该始终在每次执行时产生相同的输出,即使第二个输出根本没有意义(二进制数据的 UTF 解码 - 您甚至忘记了“8”)。
我正在使用第三方软件,它以加密模式 CBC 和 0xFFFFFFFFFFFFFFFF 的 IV 在河豚中创建密钥。我怎样才能将这样的 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, "[=11=]");
$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');
我尝试了 0xFFFFFFFFFFFFFFFF 的 IV,因为看起来是这样,在这种情况下,这是 Delphi 加密纲要的默认值。我也尝试通过 0x0000000000000000。
初始化向量只是二进制数据——不需要使用整数。所以答案很简单:$sIv= "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
。
剩下的就不清楚了:"result always differ" 是什么意思?确保 Delphi 程序始终产生相同的输出(否则它会使用您还不知道的初始化,或者比您的脚本做的更多)。您的 PHP 脚本应该始终在每次执行时产生相同的输出,即使第二个输出根本没有意义(二进制数据的 UTF 解码 - 您甚至忘记了“8”)。