Вопрос

Мне нужно иметь возможность отправлять зашифрованные данные между клиентом Ruby и сервером Python (и наоборот), и у меня возникли проблемы с ruby-aes gem / library. Библиотека очень проста в использовании, но у нас возникли проблемы при передаче данных между ней и библиотекой pyCrypto AES для Python. Эти библиотеки кажутся хорошими, когда они используются только один, но они, кажется, не играют хорошо за пределами языка. Есть идеи?

Редактировать: мы осуществляем связь через SOAP, а также пытались преобразовать двоичные данные в base64 безрезультатно. Кроме того, более того, что шифрование / дешифрование почти, но не совсем одинаково между двумя (например, длины отличаются на единицу или есть дополнительные символы мусора в конце расшифрованной строки)

Это было полезно?

Решение 2

Оказалось, что ruby-aes автоматически дополняет данные, заполняя 16 символов, и вставляет нулевой символ в конце последней строки в качестве разделителя. PyCrypto требует, чтобы вы делали кратные 16 символов, чтобы мы поняли, что делают ruby-aes.

Другие советы

  

(например, длины отличаются на один или в конце дешифрованной строки есть лишние символы мусора)

Я пропустил этот бит. Нет ничего плохого в вашем шифровании / дешифровании. Это звучит как проблема заполнения. AES всегда кодирует данные в блоках по 128 бит. Если длина ваших данных не кратна 128 битам, данные должны быть дополнены перед шифрованием, а заполнение должно быть удалено / проигнорировано после шифрования.

Трудно даже догадаться, что происходит без дополнительной информации ...

На вашем месте я бы проверил это в ваших программах на Python и Ruby:

<Ол>
  • Ключи одинаковы (очевидно). Снимите их как шестнадцатеричные и сравните каждый байт.
  • Векторы инициализации одинаковы. Это параметр IV в AES.new () в pyCrypto. Дамп их как шестнадцатеричный тоже.
  • Режимы одинаковые. Параметр mode в AES.new () в pyCrypto.
  • В pyCrypto есть значения по умолчанию для IV и mode , но не верьте, что они такие же, как в реализации Ruby. Используйте один из более простых режимов, например, CBC. Я обнаружил, что разные библиотеки по-разному интерпретируют принцип работы сложных режимов, таких как PTR.

    В Википедии есть отличная статья о том, как режимы блочного шифрования .

    Вид зависит от того, как вы передаете зашифрованные данные. Возможно, вы пишете файл на одном языке, а затем пытаетесь прочитать его с другого. Python (особенно в Windows) требует, чтобы вы указали двоичный режим для двоичных файлов. Так что в Python, если вы хотите расшифровать там, вы должны открыть файл следующим образом:

    f = open('/path/to/file', 'rb')
    

    «b» указывает на двоичный И если вы записываете зашифрованные данные в файл из Python:

    f = open('/path/to/file', 'wb')
    f.write(encrypted_data)
    

    В основном то, что сказал Хью выше: проверьте IV, размеры клавиш и режимы цепочки, чтобы убедиться, что все идентично.

    Независимо тестируйте обе стороны, кодируйте некоторую информацию и проверяйте, чтобы Ruby и Python идентифицировали ее одинаково. Вы предполагаете, что проблема связана с шифрованием, но это может быть что-то столь же простое, как отправка зашифрованных данных с помощью put , который выбрасывает в данные случайные символы новой строки. Убедившись, что они правильно шифруют данные, убедитесь, что вы получаете именно то, что, как вы думаете, вы отправили. Продолжайте шаг за шагом, пока не найдете стадию, которая повреждает данные.

    Кроме того, я бы предложил использовать библиотеку openssl, входящую в стандартную библиотеку ruby, вместо использования внешнего гема.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top