我的加密/解密环境在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""
?>
(谢谢你)
在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