Быстрый поток шифрования RC4 для Python?

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

Шифр RC4 был бы идеальным для этого; это легкий и простой для понимания концептуально. Итак, я получил спецификацию и написал алгоритм RC4 на Python.

Он работает точно так, как ожидалось, но он медленный, как патока. На моем Core i7 2,2 ГГц я могу получить только около 1 МБ/с из алгоритма.

Ясно, что интерпретируемая природа Python не лучшим образом подходит для такого рода задач. Моя проблема в том, что я плохо разбираюсь в кодировании C - лучшее, что я сделал с C, - это некоторые вещи Hello World и некоторые эксперименты с чтением и записью файлов. В любом случае, я недостаточно хорошо разбираюсь в C, чтобы использовать API-интерфейсы Python-C.

Я знаю .NET/C#, и я написал тот же алгоритм в Windows на C#, и мне удалось легко получить из него более 60 МБ/с. Таким образом, среда CLR .NET намного более оптимизирована. Но целевой платформой для приложения Python является Unix/Linux.

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

Поскольку RC4 зависит от состояния, в идеале я бы сделал это с помощью класса (так я сделал это с моей реализацией только для Python). Итак, вот небольшой фрагмент того, что я хочу сделать:

rc4 = RC4Encrypter()
rc4.seed(myKey) # seed the RC4 algorithm with bytes from string myKey
rc4.getRC4Bytes(1048576) # get the next 1MB of RC4 cryptostream bytes as a binary string
rc4.encryptWithRC4(myString) # encrypt myString's bytes with RC4 bytes using xor and return

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


person fdmillion    schedule 14.05.2013    source источник
comment
Почему бы вам не найти шифр RC4, уже написанный на C, и не вызвать его из Python? governmentsecurity.org/forum/topic/   -  person Robert Harvey    schedule 15.05.2013
comment
Это была бы хорошая идея, за исключением того, что я недостаточно знаю C, чтобы написать необходимый связующий код, чтобы обернуть материал RC4 внутри модуля Python. На самом деле я достаточно знаю C, чтобы написать потоковый шифр RC4 — я написал такой, который просто заполняет себя из /dev/urandom определенным количеством байтов, а затем начинает выдавать псевдослучайные биты на стандартный вывод. Но я не знаю, как обернуть это в C. Мне нужно будет потратить больше времени на C, прежде чем я буду достаточно хорош, чтобы сделать это. ;-)   -  person fdmillion    schedule 16.05.2013


Ответы (1)


Я считаю, что PyCrypto имеет реализацию RC4, проверьте ее здесь

person sbrichards    schedule 14.05.2013
comment
Просто имейте в виду, что RC4 PyCrypto не отбрасывает ни один из начальных байтов ключевого потока RC4, что является слабым местом безопасности. На практике следует удалить первые 3000 байт. - person SquareRootOfTwentyThree; 15.05.2013
comment
Я мог бы решить эту проблему, просто захватив 3000 байт, а затем выбросив их... Сначала я был сбит с толку, но потом понял, что ARC4 - это то, что я ищу... Спасибо! - person fdmillion; 16.05.2013