Шифрование строки с помощью Blowfish в ruby ​​возвращает более короткую строку, чем тот же процесс в php - PullRequest
3 голосов
/ 29 марта 2011

Это меня смущает.

Когда я пытаюсь использовать следующие входы для шифрования строки с помощью Blowfish: key = "some key" input = "input string"

Я получаю следующие результаты:

ruby: ["79af8c8ee9220bde"]
php: 79af8c8ee9220bdec2d1c9cfca7b13c6

Я собираюсь получать строки из приложения php, поэтому мне нужно синхронизировать эти два, но я не понимаю, почему строка php будет длиннее.Чего мне не хватает?

php код:

php > require_once 'Crypt/Blowfish.php';
php > $input = "input string";
php > $key = "some key";
php > $crypt = new Crypt_Blowfish($key);
php > echo bin2hex($crypt->encrypt($input));
79af8c8ee9220bdec2d1c9cfca7b13c6

ruby ​​code:

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'crypt/blowfish'
=> true
irb(main):003:0> input = "input string"
=> "input string"
irb(main):004:0> key = "some key"
=> "some key"
irb(main):005:0> blowfish = Crypt::Blowfish.new(key)
=> #<Crypt::Blowfish:0xb74b10c4 @sBoxes=[[3156471959, 1769696695, 1443271708, 181204541, 
...... 1894848609], @key="some key">
irb(main):006:0> blowfish.encrypt_block(input)
=> "y\257\214\216\351\"\v\336"
irb(main):007:0> blowfish.encrypt_block(input).unpack("H*")
=> ["79af8c8ee9220bde"]

Ответы [ 6 ]

4 голосов
/ 29 марта 2011

Подожди, у тебя выход Ruby 8 байтов?Ваш ввод 12 - это код Ruby, который здесь ошибочен.

Я не использовал Crypt :: Blowfish (и документации недостаточно), но вам может потребоваться заполнить ваш ввод кратным 64 битамво всяком случае.

3 голосов
/ 29 марта 2011

Предполагая, что Crypt_Blowfish использует mcrypt или действует так же, вы столкнулись с проблемой заполнения.В частности, строка дополняется правой частью нулевыми байтами, пока она не станет кратной размеру блока.Из интерактивной оболочки PHP:

php > $bf = mcrypt_module_open('blowfish', '', 'ecb', '');
php > $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($bf), MCRYPT_DEV_RANDOM);
php > $key = 'some key';
php > mcrypt_generic_init($bf, $key, $iv);
php > echo mcrypt_enc_get_block_size($td);
8
php > echo bin2hex(mcrypt_generic($bf, 'input string'));
79af8c8ee9220bdec2d1c9cfca7b13c6
php > echo bin2hex(mcrypt_generic($td, "input string\0\0\0\0"));
79af8c8ee9220bdec2d1c9cfca7b13c6

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

Если вам повезет, вы можете просто вместо этого установить режим заполнения Ruby или просто добавить нуль в строку на стороне Ruby.

1 голос
/ 29 марта 2011

Поскольку Blowfish - это 64-битный блочный шифр, вам нужно дополнить данные , и реализация Ruby не сделает это автоматически.

s = "input string"
len = s.length
mod = 8-len%8
padded = s.ljust(len+mod, "\0")

Мне просто нужно показать свою первую попытку ...

encrypted = blowfish.encrypt_block (вход. each_char. each_slice (8). карта {| ломтик | slice.count == 8? slice.join: slice.join.ljust (8, "\ 0")}. присоединиться

Я использовал \ 0, так как кажется, что это то, что использует PHP.

0 голосов
/ 21 февраля 2012

Попробуйте blowfish.encrypt_string вместо encrypt_block

0 голосов
/ 29 марта 2011

Похоже, что php-скрипт Blowfish неправильно шифрует.

В PHP4 и PHP5 вы можете использовать встроенную функцию crypt для шифрования с помощью Blowfish.

PHP crypt () .

CRYPT_BLOWFISH - Хеширование Blowfish с солью следующим образом: "$ 2a $", двухзначный параметр стоимости "$" и 22 64 цифры из алфавита "./0-9A-Za-z". Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины. Двузначный параметр стоимости - это логарифм base-2 числа итераций для базового алгоритма хеширования на основе Blowfish, и он должен находиться в диапазоне 04-31, значения вне этого диапазона вызовут ошибку crypt ().

Так что вы можете позвонить $hash = crypt($yourString, '$2a$07$'.$aSalt) для шифрования с помощью Blowfish.

Если у вас нет доступа к коду PHP, полностью проигнорируйте этот ответ.

0 голосов
/ 29 марта 2011

Я не знаю, что такое Crypt / Blowfish.php или что делает метод -> encrypt (), но, скорее всего, разница в строке заключается в использовании php соли при вызове crypt ().

...