У меня проблема с режимом 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, все работает нормально.
Какие-либо предложения ?
Вам нужно запомнить IV, который вы использовали для шифрования, и снова использовать его для дешифрования.