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