Замените Horde/phpmyadmin blowfish.php на mcrypt

Я пытаюсь передать данные между приложениями, которые были зашифрованы с помощью Horde/phpmyadmin blowfish .php, используя вместо этого mcrypt. Если я сделаю что-то вроде:

$key = "qwerty";
$data = "12345678";

$pma_cipher = new Horde_Cipher_blowfish;

print base64_encode( mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC ) );
print PMA_blowfish_encrypt( $data, $key );
print base64_encode( $pma_cipher->encryptBlock( $data, $key ) );
print base64_encode( $pma_cipher->encryptBlock( $data, $key ) );

Выход

pC+XbHWnqIg= // mcrypt
pC+XbHWnqIg= // PMA blowfish
pC+XbHWnqIg= // OK
WwkIWeYzlHw= // next block is different

Кроме того, если я изменю данные:

$key = "qwerty";
$data = "123456789";

$pma_cipher = new Horde_Cipher_blowfish;

print base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC));
print PMA_blowfish_encrypt( $data, $key );

Теперь я получаю:

pC+XbHWnqIjaCTiQlKkXRQ==
pC+XbHWnqIg99GXjyWLMmA==

Кажется, что версия Horde/PMA меняет ключ каждый блок.

Есть ли способ настроить вызовы mcrypt, чтобы сделать две библиотеки кросс-совместимыми, или мне просто выбрать одну или другую и соответствующим образом настроить?


person Andrew    schedule 27.06.2012    source источник


Ответы (1)


S-блоки Blowfish различаются дизайном каждый раз, когда ключ устанавливается в одном и том же экземпляре. Вот как работает хеширование bcrypt.

Я считаю, что вместо этого вы должны делать следующее:

$pma_cipher = new Horde_Cipher_blowfish;

$pma_cipher->setKey( $key ); // Set the key only once!

print base64_encode( mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC ) );
print PMA_blowfish_encrypt( $data, $key );
print base64_encode( $pma_cipher->encryptBlock( $data ) ); // specifying the key resets it
print base64_encode( $pma_cipher->encryptBlock( $data ) ); // specifying the key resets it

Это должно дать вам один и тот же результат каждый раз.

Однако с точки зрения вашего другого вопроса:

Должен ли я просто выбрать один или другой и настроить вещи соответствующим образом

Если возможно, вам следует использовать функции mcrypt_*, так как они намного быстрее, чем необработанная реализация PHP, используемая PMA. Blowfish, как известно, медленный (по крайней мере, в настройке клавиш) в первую очередь; выполнение этого в PHP вместо библиотеки C должно быть только запасным вариантом.

person mjec    schedule 05.07.2012
comment
Я пытаюсь быть совместимым с кодом, указывающим ключ для каждого блока из 8 байтов. Могу ли я повторно указать ключ с помощью функций mcrypt? - person Andrew; 09.07.2012
comment
Не совсем. Вы можете смешивать клавиши вручную (скопировав исходный код функции из Horde_Cipher_blowfish) или повторно инициализировать $pma_cipher перед выполнением каждого вызова encryptBlock(). - person mjec; 13.07.2012