Повреждение данных: где ошибка‽

Последнее изменение: Я выяснил, в чем была проблема (см. Мой собственный ответ ниже), но я не могу отметить вопрос как ответ, Казалось бы. Если кто-то может ответить на вопросы, которые у меня есть в моем ответе ниже, а именно, является ли это ошибкой в ​​Cython или это предполагаемое поведение Cython, я отмечу , что ответ принят, потому что это был бы самый полезный урок, который можно извлечь из этого, ИМХО.


Во-первых, я должен начать с того, что я пытался понять это в течение трех дней, и я просто бьюсь головой о стену. Насколько я могу судить по документации, я все делаю правильно. Очевидно, я не могу делать что-то правильно, потому что, если бы я был так, у меня не было бы проблем (верно?).

В любом случае, я работаю над привязкой mcrypt к Python. Он должен работать как с Python 2, так и с Python 3 (хотя он не тестировался для Python 2). Он доступен на моем сайте , связан, потому что он слишком велик для включения в сообщение, и, учитывая, что я не знаю , что я делаю неправильно, я даже не могу выделить, что может быть код проблемы. Сценарий, показывающий проблему, также есть на моем сайте . Сценарий просто передает 100 блоков ничего, кроме буквы «а» (независимо от размера блока, используемого алгоритмом шифрования / режимом шифрования), и, конечно же, должен получить блок «а» в результате двусторонней передачи. Но это не так (всегда). Вот результат одного запуска:

Wed Dec 15 10:35:44 EST 2010
test.py:5: McryptSecurityWarning: get_key() is not recommended
  return ''.join(['{:02x}'.format(x) for x in o.get_key()])

key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
self test result: 0
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
Stats: 88 / 100 good packets (88.0%)

#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7'
#6: b'aaaaaaaaaaaaaaaa' != b'aaaaaaa1\xb3@\x8d\xff\xf9\xafpy'
#13: b'aaaaaaaaaaaaaaaa' != b'\xb9\xc8\xaf\x1f\xb8\x8c\x0b_\x15s\x9d\xecN,*w'
#14: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaa\xeb?\x13'
#49: b'aaaaaaaaaaaaaaaa' != b'_C\xf2\x15\xd5k\xe1XKIF5k\x82\xa4\xec'
#50: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa+\xdf>\x01\xee'
#74: b'aaaaaaaaaaaaaaaa' != b'\x1c\xdf0\x05\xc7\x0b\xe9\x93H\xc5B\xd7\xcfj+\x03'
#75: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaw+\xed\x0f'
#79: b'aaaaaaaaaaaaaaaa' != b"\xf2\x89\x1ct\xe1\xeeBWo\xb4-\xb9\x085'\xef"
#80: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa\xcc\x01n\xf0<'
#91: b'aaaaaaaaaaaaaaaa' != b'g\x02\x08\xbf\xa5\xd7\x90\xc1\x84D\xf3\x9d$a)\x06'
#92: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaaaa\x01'

Странно то, что это в точности то же самое для данной пары (алгоритм, режим). Я могу изменить алгоритм, и это приведет к разным циклам, но всегда одинаково для каждого прогона, когда я не меняю алгоритм. Я в полном тупике. Кроме того, это всегда два блока подряд, которые повреждены, как вы можете видеть в выходных данных выше: блоки 5 и 6, 13 и 14 и т. Д. Итак, есть шаблон, но я по какой-то причине не могу понять, на что именно указывает этот шаблон.

Я понимаю, что, вероятно, о многом спрашиваю: я не могу выделить небольшой фрагмент кода, и, вероятно, требуется знакомство как с mcrypt, так и с Python. Увы, после трех дней ударов по этой проблеме мне нужно немного отойти от проблемы, поэтому я публикую это здесь в надежде, что, возможно, пока я отдыхаю от этой проблемы, либо (а) кто-то увидит, где я ввел ошибку, (б) я смогу увидеть свою ошибку, когда вернусь к проблеме позже, или (в) кто-то или я могу найти проблему, которая, возможно, не является ошибкой в ​​моем коде, но ошибка в процессе связывания или в самой библиотеке.

Одного я не сделал, так это попытался использовать другую версию библиотеки mcrypt. Я работаю с Cython 0.13, Python 3.1 и mcrypt 2.5.8, все это распространяется Ubuntu в Ubuntu 10.10 (кроме Cython, который я получил от PyPi). Но я управляю системами с PHP-приложениями, которые работают нормально и использую mcrypt на Ubuntu 10.10 без повреждения данных, поэтому у меня нет оснований полагать, что это сборка mcrypt, так что просто оставляет ... ну, что-то не так с моей стороны где-то Я думаю.

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

Правка : Кто-то указал, что мне следует использовать memcpy вместо strncpy. Я сделал это, но теперь тестовый сценарий показывает, что каждый блок неверен. Раскрасьте меня еще больше, чем раньше ... вот новый результат на pastebin .

Редактировать 2 : Я вернулся к компьютеру и снова смотрел на него, и я ' m просто добавляю повсюду операторы печати, чтобы найти, где что-то может пойти не так. Следующий код в функции raw_encrypt.step (input):

    cdef char* buffer = malloc(in_len)
    print in_bin[:in_len]
    memcpy(buffer, in_bin, in_len)
    print "Before/after encryption"
    print buffer[:in_len]
    success = cmc.mcrypt_generic(self._mcStream, buffer, in_len)
    print buffer[:in_len]

Первый оператор печати показывает ожидаемый результат, открытый текст, который передается. Однако второй показывает что-то совершенно другое, которое должно быть идентичным. Похоже, что с Cython происходит что-то, чего я не совсем понимаю.

7
задан Michael Trausch 15 December 2010 в 18:20
поделиться