Немного исходников для криптографии

Исходник DES шифра (эталон)

  • des_lite.cpp
    Собственно ради него и был создан раздел. А остальные исходники я положил, как говориться, для кучи. Данный исходник является практически минимально возможной по размеру кода реализацией DES шифра. По скорости и использованию стека, он разумеется не самый лучший вариант. Потому что биты начальных данных и ключа он раскладывает на массивы по 64 байта. Кроме того сам объект, реализующий шифр, не содержит данных. Вся промежуточная информация лежит в локальных переменных отдельных функций. А в остальном всё красиво и хорошо. Массивы совсем не трудно заменить битовыми картами, сократив тем самым, до минимального и размер используемой памяти. Так же можно заменить байтовые (byte) операции, заполнения, копирования или xor операций, операциями c (dword) словами или вызовом библиотек. Что вызовет дальнейшее сокращение кода и увеличение скорости. Возможно что и сам алгоритм можно немного подтянуть (мне пока некогда думать). В любом случае, если бы я захотел сделать хорошо оптимизированную версию алгоритма, то для меня этот текст был бы лучшей отправной точкой.

    Кстати на тему оптимизации очень рекомендую две книги:

    Исходник MD5 хеша (эталон)

  • md5_lite.cpp
    Пару раз понадобился на отдельных работах, да и мне самому. В общем вещь в хозяйстве довольно нужная. Переписано в упор на минимальное количество исходного кода. Так же как и с DES, для рабочего применения, вы можете (должны) оптимизировать исходник на свой вкус.

    Исходник SHA-1 хеша (эталон)

  • sha1_lite.cpp
    Почти без коментариев. По устройству почти полный близнец MD5, только расчитан на другой порядок байт в регистрах. Так что слепил заодно.

    Исходник SHA-256 хеша (эталон)

  • sha2_lite.cpp
    Без коментариев.

    Колизия в MD5

  • md5_bad.zip
    Забавы ради, образец двух разных файлов с одинаковой md5 суммой. Один из блоков который попадает в ядро md5 сумматора слегка подкорректирован. Разумеется всё это имеет прямое отношение к открытиям китайских математиков, которые изучали md5. Но на мой взгляд, столь незначительные отличия можно найти и перебором, хотя искать придётся долго и с большим трудом.

    Исходник RC4 шифра

  • rc4.cpp
    Написал я его когда-то давно. Работает он вроде правильно, потому что исходный текст мне один раз понадобился и по этому случаю я его раз 10 перечитал и перепроверил. Правда по настоящему мне он так и не разу не пригодился.

    Исходник TEA шифра

  • tea.cpp
  • xtea.cpp - рекомендуется этот вариант.
    Tiny Encryption Algorithm. Шифр придуман в Кэмбридже в 1985 году. Он известен тем что является самым маленьким блочным шифром, который был признан криптостойким. Его удобно применять когда нужен маленький, но приличный шифр. Я применил его пару раз для шифрования, когда программе надо было сохранить пароли в .ini файле.

    А это слова только что сказанные криптоаналитиком в живую:

    Криптостойкость не упадёт вообще если его заменить даже на (x+i) вместо этого (x+i*9E3779B9), во всех вариантах TEA. Рекомендую только сдвиги заменить с 4 и 5 на 6 и 9 - эти гораздо крепче для всех TEA вариантов. 6-9 - это самый лучший выбор сдвигов. А ещё рекомендую пользоваться более простым и более быстрым TEA, только убрать в нём прибавление К[2i+1] вообще и вместо K[2i] просто прибавлять K[i] на каждом круге. Так легко залатывается дырка с equivalent keys и вообще уязвимость ко всем related-key атакам. В XTEA криптостойкость из-за использования D для выбора ключей - как K[D>>((D&1)*11)] - падает. Гораздо лучше пользоваться просто K[i] во всех вариантах.

    Исходник CRC32 - CRC256 сумматоров (и прочее)

  • adler32.cpp
  • crc8.cpp
  • crc16.cpp
  • crc32.cpp
  • crc64.cpp
  • crc128.cpp (на больших числах)
  • crc256.cpp (на больших числах)
  • crc_all.cpp (шаблон)
  • crc_all2.cpp (абсолютно универсальный вариант)
    Идеально оптимизированные по всем параметрам исходники для вычисления контрольных суммы (CRC32,CRC64). Может применяться для вычисления по любому полиному. Сrc32 по умолчанию применяет стандартный ZIP полином. Сам я, правда, не одобряю его применение, где надо и где не надо. Отлично справляется и обычное суммирование байт. Но штука всё-таки тоже полезная и кое-где нужная.

    Leviathan

  • leviathan.cpp Поточный шифр левиафан (исходник). Поскольку во время его редактирования у меня упал редактор студии и потерял кучу текста, то свои коментарии в текст расставлять уже не хочется. А равно как и развивать тему поточных шифров.

    Ссылки






    Hosted by uCoz