Расшифровка зашифрованной строки PHP с использованием Ruby - PullRequest
1 голос
/ 23 августа 2011

Я довольно новое шифрование и дешифрование, поэтому, пожалуйста, извините, что я не знаю этого предмета.

Я пытаюсь расшифровать строку в Ruby. Строка читается с сервера, где она была зашифрована в PHP с использованием MCRYPT_RIJNDAEL_128. У меня есть код для расшифровки в PHP, который работает, и я пытаюсь преобразовать его в Ruby. Это необходимо для аутентификации мобильного приложения, которое я создаю с использованием Rhodes (платформа мобильных приложений на Ruby).

Вот фрагмент для расшифровки в конце PHP.

  $key = "This is a test key";

  $string2 = hex2bin($string);  // The encrypted string   

  $iv = '1111F321414LOJL018473914DSADAS'; // Just given a random Initialisation vector for the example

  $encrypted = mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $string2, MCRYPT_DECRYPT, $iv);

function hex2bin($str) {
    $bin = "";
    $i = 0;
     do {
       $bin .= chr(hexdec($str{$i}.$str{($i + 1)}));
       $i += 2;
       } while ($i < strlen($str));
    return $bin;
 }

hex2bin - это функция, которая преобразует шестнадцатеричный код в двоичный.

Пока здесь моя неудачная попытка выполнить расшифровку с использованием библиотеки crpt: rijndael, предоставленной Ruby.

key = "This is a test key"
rd = Crypt::Rijndael.new(key, 128, 128)
string = @params['body'] // The encrypted string 
encrypted_string = hex2bin(string) 
decrypted_string = rd.decrypt_block(encrypted_string)

def hex2bin(str)
  bin = ""
  i = 0
  begin
    bin = bin + ((str[i]+str[i+1]).hex).chr
    i = i+2
  end while i<str.length
  return bin
end

Я получаю сообщение об ошибке «Ошибка приложения: блок должен быть длиной 16 байт». Я попытался добавить код, чтобы он принял вектор инициализации от http://pastebin.com/m1rsJUXM. Я все еще получаю ту же ошибку. Любая помощь или направление будет принята с благодарностью.

С уважением,

Ash

1 Ответ

1 голос
/ 23 августа 2011

Глядя на ваш PHP-код, вы, похоже, используете 128-битный Rijndael в режиме CBC с явным IV и неопределенным заполнением. Лучше явно указать отступы, обычно PKCS5 или PKCS7. Учитывая, что ваше сообщение об ошибке говорит о том, что один из ваших блоков не имеет длину 16 байт, я склонен сначала подозревать проблему с заполнением. Последний блок вашего открытого текста, возможно, не был добавлен к границе следующего блока, поэтому ему не хватит необходимых 16 байтов, отсюда и сообщение об ошибке.

Кроме того, вам необходимо убедиться, что вы указали режим CBC в своем коде Ruby, чтобы он соответствовал коду PHP, и чтобы зашифрованный текст, ключ и IV были идентичны на уровне байтов в обеих системах. Преобразование в и из строк может привести к различиям и, следовательно, к проблемам. Это моя вторая мысль о вашей проблеме с размером блока. Если преобразование вашего зашифрованного текста из байтов в строку и обратно в байты снова приводит к изменению длины шифротекста, то вы получите то же сообщение об ошибке.

...