PHP CBC şifreleme modu nasıl kullanılır

1 Cevap php

Ben (güvenlik sorunları nedeniyle) ECB'nin dışında bir modda AES ile 50-150 karakter uzunluğunda bir dize, şifrelemek çalışıyorum. Ben bir şifreleme sınıf yazdı ve ben CBC, TO veya OFB moduna geçtiğinizde, ancak geri orijinal metin almak için başarısız, ECB modu mükemmel / şifresini şifrelemek mümkün duyuyorum.

Source:

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;

Dönüş değeri $ Aralık, eşit 'hello world' değildir.

Herhangi bir fikir?

1 Cevap

Eğer başlatma vektörü atarak, $iv gibi görünüyor. Başarıyla mesajı deşifre IV bilmek gerekir. IV sır değildir; genellikle saran biçimi çeşit şifreli ile birlikte geçirilir.

Blok blok herhangi bir geri bildirim yoktur Çünkü, ECB bir başlatma vektörü gerekmez. Ama blok zincirleme modları şifreleme modu "bootstrap" için bazı verilere ihtiyaç.