Проблема шифрования / дешифрования в режиме php mcrypt CBC

У меня проблема с режимом CBC, когда я пытаюсь зашифровать / расшифровать некоторый текст, используя расширение mcrypt в php. Я создал класс для выполнения этих операций, он отлично работает с другими режимами, кроме CBC.

Проблема заключается в следующем:

Я использую открытый текст Even in cryptography, silence is golden, Я делаю часть шифрования, без проблем до этого момента. Но каждый раз, когда я пытаюсь расшифровать, я получаю что-то вроде этого: 9��'t"�cryptography, silence is golden, Как видите, первые 8 символов текста неверны. Я не знаю, что может быть причиной такого поведения.

Части моего класса, которые обрабатывают эти операции:

public function encrypt($data)
    {
        $cypher = $this->_getCypher();
        $iv = $this->_getIv($cypher);

        return trim(base64_encode(mcrypt_encrypt($cypher, self::KEY, $data, MCRYPT_MODE_CBC, $iv)));
    }

    public function decrypt($data)
    {
        $cypher = $this->_getCypher();
        $iv = $this->_getIv($cypher);

        return trim(mcrypt_decrypt($cypher, self::KEY, base64_decode($data), MCRYPT_MODE_CBC, $iv));
    }

    protected function _getCypher()
    {
        return self::$_cyphers[$this->_algorithm];
    }

    protected function _getIv($cypher)
    {
        return mcrypt_create_iv(mcrypt_get_iv_size($cypher, MCRYPT_MODE_CBC), MCRYPT_RAND);
    }

И алгоритм, используемый для приведенного выше примера, является 3DES. Как я уже говорил, при использовании другого режима, например, ECB, все работает нормально.

Какие-либо предложения?

1 ответ

Решение

Вам нужно запомнить IV, который вы использовали для шифрования, и снова использовать его для расшифровки.

Другие вопросы по тегам