2014-08-27 311 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

相關問題