PHP openssl库中DES3方法的问题

PHP openssl库中DES3方法的问题,php,openssl,php-openssl,tripledes,Php,Openssl,Php Openssl,Tripledes,我有一个web服务,在那里我以“三元组、ECB模式、密钥大小192和填充零”的格式发送加密数据。提供程序向我显示原始值和预期结果的示例: 原始字符串=IA000001 加密字符串(发送到web服务)=aVR5J/0Lph0= 在PHP中,openssl\u encrypt()函数可以很好地处理此字符串,但会引发一个数据不是块长度的倍数的SSL错误 我编写了一个脚本来显示所有问题(带有注释): 我不是加密大师,但最近从mcrypt切换到openssl时,我不得不解决类似的问题。我认为您的数据长度必

我有一个web服务,在那里我以“三元组、ECB模式、密钥大小192和填充零”的格式发送加密数据。提供程序向我显示原始值和预期结果的示例:

原始字符串=
IA000001
加密字符串(发送到web服务)=
aVR5J/0Lph0=

在PHP中,
openssl\u encrypt()
函数可以很好地处理此字符串,但会引发一个
数据不是块长度的倍数的
SSL错误

我编写了一个脚本来显示所有问题(带有注释):


我不是加密大师,但最近从mcrypt切换到openssl时,我不得不解决类似的问题。我认为您的数据长度必须能被8整除(即8个字符的数据块)。该字符串的长度为9个字符,而不是8或16个字符,因此会出现此错误

您可以通过使用空字符填充以达到所需的长度(即8的倍数)来克服此问题

我将加密代码包装到一个函数中,以便更好地封装逻辑:

$key = '1234567890123456ABCDEFGH';
$expected_result = 'aVR5J/0Lph0=';

function test_results($expected_value, $return_value) {
    echo openssl_error_string() . "\n";
    $compare = var_export($return_value == $expected_value, 1);
    echo "'$return_value' == '$expected_value' => {$compare}\n" ;
}

function encrypt($text, $key) {
    $block_size = 8;
    if (strlen($text) % $block_size) {
        $text = str_pad($text, strlen($text) + $block_size - strlen($text) % $block_size, "\0");
    }
    return base64_encode(@openssl_encrypt($text, 'DES3', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING));
}

foreach (['IA000001', 'IA000001T'] as $data) {
    $resultado_function = encrypt($data, $key);
    test_results($expected_result, $resultado_function);
}
输出:

'aVR5J/0Lph0=' == 'aVR5J/0Lph0=' => true

'aVR5J/0Lph21RT9SWL7RSg==' == 'aVR5J/0Lph0=' => false