PHP-openssl_encrypt,openssl_decrypt密钥,iv

根据OpenSSL(https://www.openssl.org/docs/apps/enc.html#OPTIONS)的文档,他们期望key和iv为十六进制值;这仅表示数字吗?还是会使用md5哈希? (因为md5似乎不可逆)

>请注意,我提到了key和iv,因为PHP函数openssl_encrypt中的$password实际上是密钥.

(几乎)直接来自PHP注释(http://php.net/manual/en/function.openssl-encrypt.php)

function strtohex($x) 
{
    $s='';
    foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
    return($s);
} 

$source = 'It works !';

$iv = substr( md5( "123sdfsdf4567812345678" ), 0, 16 );
$pass = '1234567812345678';
$method = 'aes-256-cbc';

echo "\niv in hex to use: ".$iv;
echo "\nkey in hex to use: ".strtohex($pass);
echo "\n";

file_put_contents ('./file.encrypted',openssl_encrypt ($source, $method, $pass, true, $iv));

$exec = "openssl enc -".$method." -d -in file.encrypted -nosalt -nopad -K ".strtohex($pass)." -iv ".$iv;

echo 'executing: '.$exec."\n\n";
echo exec ($exec);
echo "\n";

解决方法:

您的第一个链接是关于命令行工具,而不是PHP函数.您将很难在终端中投入二进制数据,因此为什么必须对密钥进行十六进制编码.

但是,在PHP中,openssl_encrypt()和openssl_decrypt()需要一个原始二进制字符串.

该文档还具有误导性,因为它提到的是“密码”而不是“密钥”.您已经注意到了,但是加密密钥不是您应该仅通过键盘输入的内容,并且md5()-也不是加密密钥的答案.
密钥必须通过openssl_random_pseudo_bytes()随机生成(或者至少对于您的情况而言这是最方便的方式):

$key = openssl_random_pseudo_bytes(32);

(静脉注射也是如此)

如果需要对生成的$key进行十六进制编码,只需将其传递给bin2hex(),但是您给出的示例有点破损……您正在执行双重加密.通过PHP加密文件内容就足够了,您无需处理命令行.

请注意,我的回答远非做加密的全部故事.您还应该添加身份验证,适当的填充,仔细考虑如何进行管理和维护.存储您的密钥等

如果您想了解它,这是一篇简短但仍具有描述性的博客文章,它为您应涵盖的关键点提供了正确答案:http://timoh6.github.io/2014/06/16/PHP-data-encryption-cheatsheet.html

如果您只需要简单地完成工作,请使用流行的加密库,不要自己编写.

上一篇:Node.js GET/POST请求


下一篇:JavaScript-Node.js中的PHP aes-256-cbc mcrypt_decrypt()等效项