Немного исходников для криптографии
Исходник 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
Поточный шифр левиафан (исходник). Поскольку во время его редактирования у меня упал редактор студии и потерял кучу текста,
то свои коментарии в текст расставлять уже не хочется. А равно как и развивать тему поточных шифров.
Ссылки
- [testvectors]
- по этой ссылке вы можете найти тестовые вектора для очень большого множества шифров.
- [www.enrupt.com]
- новый простой и сильный шифр, сделанный очень талантливым и крупным криптоаналитиком. Со временем будет опубликован в SASC 2008.
- [chaos]
- стойкий генератор случайных чисел, того же автора.
- [www.random.org] - сайт генерирующий случайные числа