2013-10-03 38 views
0

我有一個問題,使用mcrypt加密文件系統上的文件爲例如將其存儲到Mysql數據庫中。我的問題已經降低到下面的代碼行:爲什麼使用mcrypt的文件加密失敗?

<?php 
$key = vzc_generateKey(); 

$file_content = file_get_contents("test.pdf"); // Fails 
$file_content = file_get_contents("test2.docx"); // Fails 
//$file_content = "12323"; // Works great 

$hash_start = md5($file_content); 

$encrypt = vzc_encryptV3($file_content, $key); 

$decrypt = vzc_decryptV3($encrypt, $key); 

$hash_end = md5($decrypt); 

echo ($hash_end == $hash_start)."##"; 

function vzc_generateKey() 
{ 
    $cstrong = false; 

    while ($cstrong == false) 
    { 
     $bytes = openssl_random_pseudo_bytes(16, $cstrong); 
    } 

    return bin2hex($bytes); 
} 

function vzc_decryptV3($crypt,$key) { 

    $content = base64_decode($crypt['crypt']); 
    $iv = $crypt['iv']; 

    $rijndael = 'rijndael-256'; 

    $cp = mcrypt_module_open($rijndael, '', 'ofb', ''); 

    $ks = mcrypt_enc_get_key_size($cp); 

    $key = substr(md5($key), 0, $ks); 

    mcrypt_generic_init($cp, $key, $iv); 

    $decrypted = mdecrypt_generic($cp, $content); 

    mcrypt_generic_deinit($cp); 

    mcrypt_module_close($cp); 

    return trim(base64_decode($decrypted)); 

} 

function vzc_encryptV3($file_content,$key) { 

    $content = base64_encode($file_content); 

    $rijndael = 'rijndael-256'; 

    $cp = mcrypt_module_open($rijndael, '', 'ofb', ''); 

    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') 
     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($cp), MCRYPT_RAND); 
    else 
     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($cp), MCRYPT_DEV_RANDOM); 

    $ks = mcrypt_enc_get_key_size($cp); 

    $key = substr(md5($key), 0, $ks); 

    mcrypt_generic_init($cp, $key, $iv); 

    $encrypted = mcrypt_generic($cp, $content); 

    $returnvalue = array("crypt"=>trim(base64_encode($encrypted)), "iv"=>$iv); 

    mcrypt_generic_deinit($cp); 

    mcrypt_module_close($cp); 

    return $returnvalue; 

} 

?> 

使用字符串「12323」一切正常,這兩個哈希做相等。但是這兩個測試文件(一個pdf和一個docx)失敗。看來解密返回不同的值,然後是原始數據。

我能做些什麼來解決這個問題?

非常感謝您提前爲您提供的任何提示。

回答

0

這可能是文件不是完全n * blocksize長的事實。這導致算法使用'\ 0'填充文件的末尾,這會在您執行md5計算時更改文件的內容。

解決這個問題的方法之一是如果您可以可靠地找到文件的末尾,則可以從最後一個塊中除去填充。

相關問題