2014-08-27 314 views
3

根据OpenSSLhttps://www.openssl.org/docs/apps/enc.html#OPTIONS)的文档,他们预计keyiv的值为hex-digit;这是否意味着只有数字?或将一个md5散列做? (因为md5似乎不可逆)openssl_encrypt,openssl_decrypt密钥,iv

  • 注意我提到keyiv因为$passwordPHP功能openssl_encrypt实际上的关键。

(几乎)直接从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"; 

回答

3

你的第一个链接是有关命令行工具,而不是PHP函数。您很难在终端中投入二进制数据,因此密钥必须以十六进制编码。

然而在PHP中,openssl_encrypt()openssl_decrypt()期望一个原始二进制字符串。

该文档也具有误导性,因为它提到了“密码”而不是“密钥”。你已经注意到了,但是加密密钥并不是你应该通过键盘输入的东西,而且任何东西也是从来没有加密密钥的答案。 关键不得不通过随机生成openssl_random_pseudo_bytes()(或者至少这是对你的情况下,最便捷的方式):

$key = openssl_random_pseudo_bytes(32); 

(也是如此的IV以及)

如果您需要将十六进制编码结果$key,只是传递给bin2hex(),但你给的例子有点坏了......你正在做双重加密。通过PHP加密文件内容就足够了,你不需要处理命令行。

请注意,我的回答远不是关于加密的全部内容。您还应该添加身份验证,正确的填充,仔细考虑如何管理存储您的密钥等。

如果您想了解它,这里有一个相当短的,但仍然描述性的博客文章,提供正确的答案你应该覆盖的关键点:http://timoh6.github.io/2014/06/16/PHP-data-encryption-cheatsheet.html

如果你需要的是简单地完成工作 - 使用流行的加密库,不要写你自己的。

+0

纠正我,如果我错了,但AES 256 CBC需要256位加密密钥。这意味着你实际上需要生成32个随机字节,而不是16个。 – vmrob 2015-06-08 17:07:51

+1

你没错,那是我的错误 - 更新了答案。谢谢。 – Narf 2015-06-08 17:13:17

相关问题