openssl-encrypt,PHP 与命令行 - 如何使 IV 相同

Tip*_*puR 1 php command-line openssl

我正在尝试使用 PHP 和 openssl 命令行加密数据,预期加密数据相同,但我得到不同的数据。

在 linux 上,这是我的 openssl -version

OpenSSL> version
OpenSSL 1.0.2k-fips  26 Jan 2017
Run Code Online (Sandbox Code Playgroud)

我试图传递 48 字节的数据,希望可以避免填充。但没有运气。我观察到 IV 是不同的,所以也尝试在 PHP 代码中使用 IV = 905E17D5F5E4939D0000000000000000。但是我收到警告 openssl_encrypt(): IV 传递的是 32 字节长,比所选密码预期的 16 字节长,截断

在命令行上尝试使用/不使用 -nosalt 选项。

<?php
// encrypt/decrypt string 
    $output = false;
    $encrypt_method = "AES-256-CBC";
    $key = '905e17d5f5e4939d48bd04ff47f9de906375b87b67068b2ce5d1bbbbc8dca291';
    $iv = '905e17d5f5e4939d';
    $string = "123456789ABCDEFG123456789ABCDEFG123456789ABCDEFG";

    $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);  


echo $output;
?> 

nEUDtXM7OQt32YEx778BgqZfocXrNNA9AihkioWZo9ri9p11DtxUpTFO30AHUk41F9PUBLu6YlYu/mdLcOZ3Cg==
Run Code Online (Sandbox Code Playgroud)

linux命令行中的openssl:

echo "123456789ABCDEFG123456789ABCDEFG123456789ABCDEFG" |openssl enc -base64 -e -aes-256-cbc  -K 905e17d5f5e4939d48bd04ff47f9de906375b87b67068b2ce5d1bbbbc8dca291 -iv 905e17d5f5e4939d -nosalt -p

key=905E17D5F5E4939D48BD04FF47F9DE906375B87B67068B2CE5D1BBBBC8DCA291
iv =905E17D5F5E4939D0000000000000000
c4JHI/8SIQkx7GXM2SclOXhbmR9vYBFLHt/jY0x7pJou9J2INJBQMISRYH4CPjvy
QDeyOWpcEEN/N6FnSdF0EA==
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?如何确保 PHP 和 openssl 命令行都使用相同的 IV/Key?如果有的话,如何确保两者的填充相同?我希望双方看到相同的结果。

小智 5

这对我有用

  <?php
// encrypt/decrypt string 
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hex2bin('905E17D5F5E4939D48BD04FF47F9DE906375B87B67068B2CE5D1BBBBC8DCA291');
$iv = hex2bin('905E17D5F5E4939D0000000000000000');
$string = "123456789ABCDEFG123456789ABCDEFG123456789ABCDEFG";

$output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);  


echo $output;
?>
Run Code Online (Sandbox Code Playgroud)

并在 CLI 中

echo -n "123456789ABCDEFG123456789ABCDEFG123456789ABCDEFG" |openssl aes-256-cbc -a -K 905e17d5f5e4939d48bd04ff47f9de906375b87b67068b2ce5d1bbbbc8dca291 -iv 905E17D5F5E4939D0000000000000000 -nosalt 
Run Code Online (Sandbox Code Playgroud)

不同之处在于

  1. 我删除了 CLI 中的换行符echo -n "foo"而不是echo "foo" (否则你在 PHP 代码中加密不同的字符串十)。
  2. CLI 使用十六进制字符串,因此在 PHP 中也需要将密钥字符串转换为十六进制hex2bin()