php openssl_decrypt () параметры (ранее зашифрованные perl Crypt :: CB C) - PullRequest
2 голосов
/ 26 марта 2020

Моя среда шифрования / дешифрования отлично работает в 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""
?> 

(спасибо)

1 Ответ

2 голосов
/ 26 марта 2020

Когда объект Crypt::CBC создается в коде Perl, в отношении ключа определяется следующее, см. здесь :

  • Поскольку -keysize аргумент не указан, ключ имеет максимальный размер 56 байт.
  • Поскольку аргумент -literal_key не указан, значение интерпретируется как кодовая фраза, а фактический ключ получается из это (обычно в сочетании с солью).
  • Поскольку аргумент -salt не указан, соль не используется, поэтому ключ получается только из ключевой фразы.

Для примера в размещенном коде Perl зашифрованный текст в виде шестнадцатеричной строки ($pjf):

ecc9d0b2449ef433285ade2d02ac19184866f5f9b814bde2 

Чтобы успешно расшифровать этот зашифрованный текст с помощью опубликованного кода PHP, необходимы следующие изменения :

  • Ключ должен быть получен из ключевой фразы. Это делается в функции expandKey. Ключ генерируется путем создания MD5 га sh ключевой фразы. Если ключ не имеет необходимой длины, он снова хэшируется и добавляется к предыдущему ha sh. Это происходит до тех пор, пока не будет создан ключ необходимой длины.

  • Необходимо установить флаг OPENSSL_RAW_DATA, поскольку зашифрованные данные передаются в openssl_decrypt в качестве необработанных данных, а не в кодировке Base64. Кроме того, зашифрованные данные должны быть переданы Base64 в кодировке openssl_decrypt.

PHP код, включая изменения:

$encryptedDataHex = 'ecc9d0b2449ef433285ade2d02ac19184866f5f9b814bde2';
$encryptedData = hex2bin($encryptedDataHex);

$key = expandKey('example'); 
$iv = '12345678'; 
$cipher = 'bf-cbc'; // 'blowfish' also works
$options = OPENSSL_RAW_DATA; 

$decryptedData = openssl_decrypt($encryptedData, $cipher, $key, $options, $iv); 

echo 'Decrypted data: ' . $decryptedData; 

function expandKey($key){
    $key = md5($key, true);
    while(strlen($key) < 56){
        $key .= md5($key, true);
    }
    return substr($key, 0, 56);
}
...