php openssl_decrypt()参数(之前由perl Crypt :: CBC加密)

问题描述 投票:2回答:1

我的加密/解密环境在Perl中工作正常。从php读取信息是我正在寻找答案的问题。以下是我的测试用例,我希望php正确打印$ decryption。目前我空白。

#(perl 5)  the encryption method
use Crypt::Blowfish;
use Crypt::CBC;
$cipher = Crypt::CBC->new( -key    => "example",
                           -cipher => 'Blowfish',
                           -iv     =>  '12345678',
                           -header      => 'none'
                          );

$pj="Testing encryption";
$pje = $cipher->encrypt("$pj");##
$pjf = unpack("H*", $pje), "\n";

open (FILE2,">data.txt");
print FILE2 "$pjf";
close (FILE2);

#(php 7.3)
<?php 

$data = file_get_contents("data.txt");
$encryption = pack("H*", $data);
$ciphering = "blowfish";
$options = 0; 

// Display the encrypted string 
echo "Encrypted String: " . $encryption . "\n"; 

// Non-NULL Initialization Vector for decryption 
$decryption_iv = '12345678'; 

// Store the decryption key 
$decryption_key = "example"; 

// Use openssl_decrypt() function to decrypt the data 
$decryption=openssl_decrypt ($encryption, $ciphering,  
        $decryption_key, $options, $decryption_iv); 

// Display the decrypted string 
echo "Decrypted String: " . $decryption; 
echo""
?> 

(谢谢你)

php encryption blowfish
1个回答
2
投票

在Perl代码中创建Crypt::CBC对象时,有关键的定义如下,请参见here

  • 由于未指定-keysize参数,因此密钥的最大大小为56字节。
  • 由于未指定-literal_key参数,因此该值将被解释为密码短语,并且实际密钥是从密码短语派生的(通常与盐结合使用。)>
  • 由于未指定-salt参数,因此不使用盐,因此密钥仅从密码短语派生。
  • 对于在发布的Perl代码中的示例,密文为十六进制字符串($pjf)为:

ecc9d0b2449ef433285ade2d02ac19184866f5f9b814bde2 

要使用发布的PHP代码成功解密此密文,必须进行以下更改:

  • 密钥必须来自密码短语。这是在expandKey功能中完成的。密钥是通过创建密码短语的MD5哈希值生成的。如果密钥不具有所需的长度,则会再次对其进行散列并附加到上一个散列中。直到生成具有所需长度的密钥为止。

  • 必须设置OPENSSL_RAW_DATA标志,因为加密的数据将作为原始数据传递到openssl_decrypt,并且未经Base64编码。或者,必须将加密的数据传递Base64编码为openssl_decrypt

  • PHP代码,包括更改:

openssl_decrypt
© www.soinside.com 2019 - 2024. All rights reserved.