Zend Filter Encryption/Decryption добавляет нулевые байты при расшифровке

Я пытаюсь выполнить симметричное шифрование некоторых данных с помощью функции Zend_Filter_Encrypt. Проблема в том, что если я зашифрую некоторые данные, а затем расшифрую их, за расшифрованными данными будут нулевые байты, и я понятия не имею, почему.

Например: Открытый текст: test Зашифрованный: ����pk� Расшифрованный: test����

Похоже, что в конец расшифрованного текста добавляются нулевые байты, чтобы сделать его длину равной некоторому 2 ^ n (строка из 11 символов дополняется до 16 => 2 ^ 4). Самым очевидным было бы просто убрать этих персонажей, но я хочу знать, почему это происходит...

Это код, который я использую, который отличается от того, как документация требует, чтобы вы делали это, потому что их код просто не работает для меня (см.: http://framework.zend.com/manual/en/zend.filter.set.html)

    define('VECTOR','EXfPCW23'); //example, not the actual used VECTOR / KEY
    $key = 'lolwatlolwat';

    public function encryptPassword($password, $key)
    {
            $filter = new Zend_Filter_Encrypt();
            $filter->setEncryption(array('key' => $key));       
            $filter->setVector(VECTOR);

            return $filter->filter($password);      
    }

    public function decryptPassword($password, $key)
    {
            $filter = new Zend_Filter_Decrypt();
            $filter->setEncryption(array('key' => $key));
            $filter->setVector(VECTOR);

            return $filter->filter($password);
    }

person Tim Strijdhorst    schedule 22.09.2011    source источник
comment
Хм, я только что понял, что «тест» - это 4 символа, что равно 2 ^ 2, так что теперь я вообще этого не понимаю ._.   -  person Tim Strijdhorst    schedule 22.09.2011


Ответы (2)


Вы должны использовать функцию rtrim для расшифровки строки.

Пример:

   public function decryptPassword($password, $key)
    {
            $filter = new Zend_Filter_Decrypt();
            $filter->setEncryption(array('key' => $key));
            $filter->setVector(VECTOR);

            return rtrim($filter->filter($password);
    }
person Dhiraj    schedule 22.02.2012

Документация Zend говорит вам, как указать заполнение? Если это так, укажите обратимое заполнение; как вы обнаружили, заполнение нулями необратимо. В противном случае выясните, какой размер дополненного открытого текста ожидает Zend, и добавьте дополнение PKCS7 самостоятельно. Это легко распознается и удаляется впоследствии.

person rossum    schedule 22.09.2011