2012-06-27 4 views
0

Я пытаюсь передать данные между приложениями, которые были зашифрованы с использованием Horde/phpmyadmin blowfish.php library, вместо этого вместо этого используется mcrypt. Если я что-то вроде:Substitute 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== 

It кажется, что версия Орды/ПМА меняет ключ каждый блок.

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

ответ

0

Ударные ящики меняют по дизайну каждый раз, когда ключ установлен в том же экземпляре. Так работает хэширование 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 должно быть только резервным.

+0

Я пытаюсь быть совместимым с кодом, который указывает ключ для каждого блока из 8 байтов - могу ли я обработать ключ с помощью функций mcrypt? – Andrew

+0

Не совсем. Вы можете выполнить ручное микширование вручную (путем копирования источника функции из Horde_Cipher_blowfish) или вы можете повторно инициализировать '$ pma_cipher' перед выполнением каждого вызова' encryptBlock() '. – mjec

Смежные вопросы