Какую библиотеку AES использовать в Ruby / Python? - PullRequest
2 голосов
/ 13 октября 2008

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

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

Ответы [ 5 ]

5 голосов
/ 13 октября 2008

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

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

3 голосов
/ 13 октября 2008

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

2 голосов
/ 13 октября 2008

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

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

  1. Ключи одинаковы (очевидно). Выкиньте их как шестнадцатеричные и сравните каждый байт.
  2. Векторы инициализации одинаковы. Это параметр IV в AES.new() в pyCrypto. Дамп их как шестнадцатеричный тоже.
  3. Режимы одинаковые. Параметр mode в AES.new() в pyCrypto.

Существуют значения по умолчанию для IV и mode в pyCrypto, но не верьте, что они такие же, как в реализации Ruby. Используйте один из более простых режимов, например, CBC. Я обнаружил, что разные библиотеки имеют разные интерпретации того, как работают сложные режимы режимов, такие как PTR.

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

1 голос
/ 13 октября 2008

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

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

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

1 голос
/ 13 октября 2008

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

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

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

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