2009-06-11 50 views
2

我試圖使用除ECB以外的模式(由於安全問題)的AES加密字符串,長度爲50-150個字符。我編寫了一個加密類,並且能夠在ECB模式下完美地加密/解密,但是當我切換到CBC,CTR或OFB模式時,我無法恢復原始明文。如何在PHP中使用CBC加密模式

來源:

define('DEFAULT_ENCRYPTION_KEY', 'asdHRMfjkahguglw84tlrogl9y8kamaFDaufasds'); 

class Encryption 
    { 
    private $mode = 'ctr'; 
    private $algo = 'rijndael-128'; 
    private $td  = null; 

    function __construct($key = DEFAULT_ENCRYPTION_KEY) 
     { 
     $this->td = mcrypt_module_open($this->algo, '', $this->mode, ''); 
     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_DEV_URANDOM); 
     $key = substr($key, 0, mcrypt_enc_get_key_size($this->td)); 
     mcrypt_generic_init($this->td, $key, $iv); 
     } 

    public function encrypt($data) 
     { 
     $encrypted_data = mcrypt_generic($this->td, $data); 
     return $encrypted_data; 
     } 

    public function decrypt($data) 
     { 
     $decrypted_data = mdecrypt_generic($this->td, $data); 
     $decrypted_data = rtrim($decrypted_data, "\0"); 
     return $decrypted_data; 
     } 

    function __destruct() 
     { 
     mcrypt_generic_deinit($this->td); 
     mcrypt_module_close($this->td); 
     } 

    } 

$crypt1 = new Encryption(); 
$enc = $crypt1->encrypt('hello world'); 

$crypt2 = new Encryption(); 
$dec = $crypt2->decrypt($enc); 

echo $dec; 

返回值$十二月,不等於 '世界你好'。

任何想法?

回答

2

看起來您正在丟棄初始化向量$iv。您需要知道IV才能成功解密郵件。 IV不是祕密;它通常以某種包絡格式與密文一起傳遞。

由於塊與塊之間沒有反饋,因此ECB不需要初始化向量。但塊鏈模式需要一些數據來「引導」密碼模式。

+0

嗯,但如果我使用這樣的類,IV應該保持不變: $ crypt1 = new Encryption(); $ enc = $ crypt1-> encrypt('hello world'); $ dec = $ crypt1-> decrypt($ enc); 但是,它仍然產生隨機明文作爲輸出。 – Matic 2009-06-11 14:08:15

相關問題