如何在PHP中使用CBC加密模式
我试图用AES加密一个长度为50-150个字符的字符串,加密模式不是ECB(由于安全问题)。我编写了一个加密类,能够在ECB模式下完美地加密/解密,但是当我切换到CBC、CTR或OFB模式时,我无法恢复原始明文 资料来源:如何在PHP中使用CBC加密模式,php,encryption,mcrypt,Php,Encryption,Mcrypt,我试图用AES加密一个长度为50-150个字符的字符串,加密模式不是ECB(由于安全问题)。我编写了一个加密类,能够在ECB模式下完美地加密/解密,但是当我切换到CBC、CTR或OFB模式时,我无法恢复原始明文 资料来源: define('DEFAULT_ENCRYPTION_KEY', 'asdHRMfjkahguglw84tlrogl9y8kamaFDaufasds'); class Encryption { private $mode = 'ctr'; pri
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;
返回值$dec不等于“hello world”
有什么想法吗?看起来您正在丢弃初始化向量,
$iv
。您需要知道IV才能成功解密消息。IV不是秘密;它通常以某种封装格式与密文一起传递
由于块之间没有反馈,ECB不需要初始化向量。但是块链接模式需要一些数据来“引导”密码模式。Hm,但是如果我像这样使用类,IV应该保持不变:$crypt1=new Encryption()$enc=$crypt1->encrypt('hello world')$dec=$crypt1->解密($enc);但是,它仍然会生成随机的明文作为输出,这是假设IV存储在$td中的某个地方,但事实并非如此。很难说这样做是好的设计,因为在大多数应用程序中,同一个密码对象不太可能加密和解密同一条消息,并且在加密多条消息时,应为每条消息使用不同的IV。