سؤال

أحاول تشفير سلسلة، 50-150 حرفا طويلا، مع AES في وضع غير البنك المركزي الأوروبي (بسبب مشاكل الأمان). لقد كتبت فئة تشفير وقادرة على تشفير / فك تشفيرها بشكل مثالي في وضع البنك المركزي الأوروبي، ولكن عند التبديل إلى وضع CBC أو CTR أو OFB، فشلت في الحصول على النسخة الخلفية الأصلية.

مصدر:

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. وبعد ستحتاج إلى معرفة الرابع لفك تشفير الرسالة بنجاح. الرابع ليس سرا؛ عادة ما يتم تمريره مع النص المشفر في نوع من التنسيق المغلف.

نظرا لعدم وجود تعليقات من كتلة إلى كتلة، لا يحتاج البنك المركزي الأوروبي إلى متجه التهيئة. لكن كلاك أوضاع السلسلة تحتاج إلى بعض البيانات إلى "bootstrap" وضع التشفير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top