Меня это смущает.
Когда я пытаюсь использовать следующие входы для шифрования строки с помощью 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
рубиновый код:
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"]
Предполагая, что 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.
Удерживайте, ваш выход Ruby равен 8 байтам? Ваш ввод 12 – здесь находится код Ruby.
Я не использовал Crypt :: Blowfish (и документации мало), но вам, возможно, придется вставлять ваш ввод в несколько бит из 64 бит.
Поскольку Blowfish – это 64-битный блочный шифр, вам придется заполнять данные, и реализация Ruby не сделает это автоматически.
s = "input string" len = s.length mod = 8-len%8 padded = s.ljust(len+mod, "\0")
Мне просто нужно показать свою первую попытку …
encrypted = blowfish.encrypt_block (input. each_char. each_slice (8). map {| slice | slice.count == 8? slice.join: slice.join.ljust (8, "\ 0")}. join
Я использовал \ 0, так как кажется, что это то, что использует PHP.
Я не знаю, что такое Crypt / Blowfish.php или что это такое -> метод encrypt (), но, скорее всего, разница в строке – это php, используя соль при вызове crypt ().
Похоже, скрипт php custom Blowfish неправильно шифрует.
В PHP4 и PHP5 вы можете использовать встроенную функцию криптографии для шифрования с помощью Blowfish.
PHP crypt () .
CRYPT_BLOWFISH – хеширование Blowfish с солью следующим образом: «$ 2a $», двухзначный параметр стоимости, «$» и 22 базовых 64 цифры из алфавита «./0-9A-Za-z». Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины. Параметр стоимости двух цифр является логарифмом базы-2 итерации для базового алгоритма хэширования на основе Blowfish и должен находиться в диапазоне 04-31, значения вне этого диапазона вызовут сбой crypt ().
Таким образом, вы можете вызывать $hash = crypt($yourString, '$2a$07$'.$aSalt)
для шифрования с использованием Blowfish.
Если у вас нет доступа к PHP-коду, полностью игнорируйте этот ответ.
Попробуйте blowfish.encrypt_string
вместо encrypt_block