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;
返回值$十二月,不等於 '世界你好'。
任何想法?
嗯,但如果我使用這樣的類,IV應該保持不變: $ crypt1 = new Encryption(); $ enc = $ crypt1-> encrypt('hello world'); $ dec = $ crypt1-> decrypt($ enc); 但是,它仍然產生隨機明文作爲輸出。 – Matic 2009-06-11 14:08:15