Проблема шифрования / дешифрования в режиме php mcrypt CBC - PullRequest
4 голосов
/ 24 мая 2011

У меня проблема с режимом 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 Ответ

3 голосов
/ 24 мая 2011

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

...