2013-06-20 72 views
2

通常,我使用openssl_encrypt在PHP中使用AES加密簡單的字符串,並且它工作得很好。使用PHP OpenSSL加密文件

現在我需要使用AES-256-CTR模式加密文件,但唯一的方法就是將文件的全部內容file_get_contents然後發送到openssl_encrypt函數來加密實際的文件數據。問題是這種方法由於內存的嚴重浪費而非常「貧乏」。

1)有沒有辦法使用PHP OpenSSL分塊數據?

例如:

<?php 
// ... 
$f = fopen('large.iso','r'); 
    while(feof($f)){ 
    $chunk = fread($f,16); 
     $cipher = openssl_encrypt(...$chunk...); 
    // ... code ... 
    } 
    // ... more code ... 
?> 

2)openssl_encrypt正式文件尚未發佈。有人可以澄清用於AES-CTR模式的功能參數的含義嗎?計數器是否自動處理?是否需要應用手動異或函數返回的數據?

注意:這是一個專業的項目,所以我不想使用phpseclib或其他的「匿名」庫,也不想使用命令行。

回答

1

看起來像php這是不可能的,沒有臨時文件使用aes-256-ctr。

但是對於接下來的chiper類型:

OPENSSL_CIPHER_RC2_40 
OPENSSL_CIPHER_RC2_128 
OPENSSL_CIPHER_RC2_64 
OPENSSL_CIPHER_DES 
OPENSSL_CIPHER_3DES 
OPENSSL_CIPHER_AES_128_CBC 
OPENSSL_CIPHER_AES_192_CBC 
OPENSSL_CIPHER_AES_256_CBC 

您可以使用生成的飛行關鍵:

$res = openssl_pkey_new('chiper args here'); 
openssl_pkey_export($res, $private_key); 

$public_key = openssl_pkey_get_details($res); 
$public_key = $public_key["key"]; 

然後加密:

$crypted_text = openssl_get_privatekey($private_key,'your data'); 

和解密:

openssl_public_decrypt($crypted_text,$decrypted_text,$public_key); 

那麼如果你不想使用文件,可能會切換到OPENSSL_CIPHER_AES_256_CBC會幫你嗎?

+0

感謝發佈,但我的主題不是非對稱加密。 1 /我的第一個問題是;有沒有辦法通過PHP OpenSSL對稱加密(AES)在全球範圍內工作(CBC,ECB,CTR,...)? 2 /我的第二個問題是關於CTR模式,特別是AES對稱加密以及PHP OpenSSL如何實現。我知道PHP OpenSSL支持AES-256-CTR,因爲當我執行'openssl_get_cipher_methods'時,它就在這裏! –

1

1)它應該是這樣的:

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

$method = "aes-256-ctr"; //aes-256-cbc 
echo "Selected method: ".$method."<br /><br />"; 
$textToEncrypt = "My chunk of data"; 
$iv = "123456789"; 
$pass = 'some_pass'; 
$dec_iv = strtohex($iv); 
$key = strtohex($pass); 
$enc_data = openssl_encrypt($textToEncrypt, $method, $pass, true, $iv); 
echo "Encrypted message (openssl): ".$enc_data."<br />"; 
$dec_data = openssl_decrypt($enc_data, $method, $pass, OPENSSL_RAW_DATA, $iv); 
echo "Decrypted message (openssl): ".$dec_data."<br />"; 

對於CTR $ IV應該是每個塊唯一或您的數據可能被打破。

2)我只知道愨CBC和CTR ABOT區別:

對於CBC中,IV必須是隨機的,但不是唯一的。它也不能被瞭解。

對於點擊率,IV必須是唯一的且不知道,但不必是隨機的。

+0

海報專門詢問了一個文件;而不是一個字符串。 – jww