Проблема шифрования AES: Python pycrypt OFB = C++ Gladman CFB

Пытаясь заставить приложение Python общаться с приложением C++, используя зашифрованную ссылку, мы не смогли заставить их говорить. Пробуя различные комбинации параметров, мы случайно обнаружили, что если мы скажем Python шифровать в режиме OFB, он успешно расшифрует на C++ в режиме CFB.

И библиотека Python pycrypt, и библиотека C++ Gladman высоко ценятся, так что же может быть не так?

Как ни странно, первый байт нормально расшифровывается при использовании OFB или CFB на обоих концах. Поскольку стандартные тестовые векторы, кажется, проверяют только первый байт (я не эксперт в этом деле и, возможно, не понимаю тестовые векторы), возможно ли, что оба алгоритма пройдут стандартный тест?


person Richard Whitehead    schedule 02.03.2011    source источник
comment
Обновление: конвертация Python OFB в C++ CFB работает только для одного блока данных, а затем превращается в тарабарщину! Только ECB, кажется, работает должным образом между этими двумя. Не очень безопасно!   -  person Richard Whitehead    schedule 02.03.2011
comment
Пробовал другую реализацию C++, получил идентичные данные, так что, похоже, виноват pycrypt.   -  person Richard Whitehead    schedule 02.03.2011
comment
Что это за «стандартные тестовые векторы»? Я уверен, что они не просто проверяют первый байт, это было бы более чем глупо.   -  person TonyK    schedule 02.03.2011
comment
Ссылки на библиотеки не помешали бы.   -  person aaz    schedule 02.03.2011


Ответы (1)


PyCrypto по умолчанию использует 8-битный режим CFB. Я предполагаю, что другой конец использует режим CFB размером с блок. Размер сегмента в битах устанавливается аргументом ключевого слова segment_size равным AES.new, для режима CFB с размером блока он должен быть равен AES.block_size*8.

Для первого блока режим OFB идентичен режиму CFB размера блока.

person aaz    schedule 02.03.2011
comment
Я не понимаю, что подразумевается под 8-битным режимом CFB. В режиме CFB результат шифрования одного блока становится IV для шифрования следующего блока. Где двусмысленность? В Википедии есть хорошее объяснение режимов, если оно неполный, возможно, вы могли бы добавить что-то о размере этого сегмента? - person Richard Whitehead; 04.03.2011
comment
@Richard — CFB определяется как семейство режимов с параметром s – размер сегмента. Таким образом, у вас может быть сегмент из 8 бит, и для каждого вывода шифра вы берете только старшие 8 бит для операции xor с открытым текстом. Дело в том, что если у вас есть ошибка передачи одного бита, вы получите только два неверных байта, а не два блока. - person aaz; 05.03.2011