我在php中有使用php AES-256-CBC进行加密的代码
并且我想使用UNIX命令行来帮助获得cypt
这是我在php行中的代码
$dataToEncrypt = hex2bin("6C38AD4E822835753F0E64928CB62744D73F878E763B227CFE8F445028527ACFE5DD0CD0352B396EDC8402414FC68DD5");
$aesKey = hex2bin("152bd89657e03fdc7375a00e1fb1a38bab097c103b803846");
$iv = hex2bin("B109DAE1B71B638E");
$result2 = openssl_encrypt($dataToEncrypt, 'AES-256-CBC', $aesKey, 3,$iv);
echo bin2hex($result2);
输出由php修饰
b2cf19a92ef12bc4ae2d78d73ab587e2178f23913aa132dbd7972d42387687a2c9eab89250dd7eba5709aaef1e8d417d
我想像这样使用
openssl aes-256-cbc -d -K 152bd89657e03fdc7375a00e1fb1a38bab097c103b803846 -iv B109DAE1B71B638E -in encrypted.txt -out decrypted.txt
问题,我无法获得相同的decypt结果
答案 0 :(得分:0)
假定加密数据以二进制格式(而不是十六进制字符串)存储在文件encrypted.txt
中,例如[1]:
file_put_contents('<path to encrypted.txt>', $result2);
或使用十六进制编辑器,用于解密的OpenSSL语句为[2]:
openssl aes-256-cbc -d -K 152bd89657e03fdc7375a00e1fb1a38bab097c103b8038460000000000000000 -iv B109DAE1B71B638E0000000000000000 -nopad -in encrypted.txt -out decrypted.txt
数据通过OpenSSL声明以decrypted.txt
的二进制格式存储,并且可以读取和显示,例如与[3]:
$decrypted = bin2hex(file_get_contents('<path to decrypted.txt>');
或使用十六进制编辑器。
在openssl_encrypt
调用中,值3
用作第4个参数($options
),它对应于标志组合OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
。这意味着加密的数据以二进制格式返回,并且不使用填充。这是可能的,因为明文的长度为48 = 3 * 16字节,因此对应于块大小的整数倍(16字节)。由于缺少填充,必须在OpenSSL语句中使用-nopad
选项。 注意:最好使用3
代替值OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
。
密钥的长度为24个字节,因此对于使用32字节密钥的AES-256而言,密钥太短了8个字节。 IV的长度为8个字节,因此对于AES来说也太短了8个字节,AES使用16字节的IV(对应于AES块大小)。 openssl_encrypt
和OpenSSL使用0
值将密钥和IV填充到所需的长度,以便可以在OpenSSL语句中使用来自PHP代码或填充值的值。 注意:使用太短的密钥和IV通常会降低安全性,应避免使用。