Треба совет знающих и просто желающих пообщаться. Кастуйте всех, кто в теме.
Часть I. Истоки
В последнее время всплывают, одно за другим, сообщения о том, что то тут, то там, в общеиспользуемых криптоалгоритмах (реализациях) находят уязвимости (закладки). Возникает вопрос доверия даже опенсорсным, ибо я вот, например, не в силах проверить весь код (хотя бы критический) в них, а если и в силах, то не в желаниях, ибо времени жалко. Плюс, возникла мысль, что к общеизвестным алгоритмам (реализациям) уже давно понапилено эксплойтов и прочего кулхацкерского софта, и, что если я запилю свой собственный софт для шифрования (пусть и дырявый как сама дырка, но мой) то вероятность взлома сего шифра кулхацкером упадет в ноль, а от криптоаналитиков меня надежно охраняет неуловимый Джо. Итак, решено, пилим свой софт...
Часть II. Попытка
Как только я сел за работу, так через полчаса обнаружил что все — готово. (идея и работающий прототип: програмка на делфи с тремя кнопками — создать ключ, зашифровать файл, расшифровать файл) Сам был в шоке, но оно работало, и, как мне тогда казалось, с бесконечной криптостойкостью. Потом появился ряд мыслей, но оно уже — шлифовка, а не идея.
II 1 Генерация ключа
В делфи (как и везде в подлунном мире) бывает только генератор ПСЕВДОслучайных чисел, и, совершенно очевидно (даже мне), что оно для генерации ключа не годится. Мною было принято управленческое решение как реализовать случайность ключа:
- создаем массив в 64Кб (чтоб адресовался двухбайтовой переменной)
- заполняем его числами 0, 1, 2, .. , 255, 0, 1, ... то есть 256 раз последовательностью 0..255
- теперь перемешиваем: генерируем два псевдослучайных двухбайтовых целых числа и меняем в массиве, который только что заполняли, местами числа (восьмибитные) местами по этим адресам
- когда пользователю надоедает пырить в экран, он жмет кнопку «стоп» и в этом мой главный козырь, ибо момент, в который он нажмет на конопку, СЛУЧАЕН, а не псевдослучаен. На выходе мы заимели массив, в котором гарантированно по 256 раз встречается каждое целое число из диапазона 0..255. Сохраняем в файл.
II 2 шифрование файла
Файл, как знает каждый ЛОРовец, представляет из себя одномерный массив восьмибитных целых чисел (так принято). По моей мысли, алгоритм шифрования следующий:
- побайтно считываем исходный файл и для каждого байта выполняем «бесконечный» цикл:
- псевдослучайно выбираем двухбайтовый индекс и, если в ключ[индекс] == наш_байт — то записываем в выходной файл этот самый индекс и выходим из цикла
таким макаром мы получаем на выходе массив чисел, который и сохраняем в файлнейм.энкриптед (внимательный анон сразу же заметит, что шифрованный файл в два раза пожирнеет)
II 3 расшифровка
она очевидна: читаем по два байта шифрованного файла, используем их как адрес в ключе — получаем нешифрованный байт
III замечания и предложения
пока ехал домой с работы, возникла пара идей: криптоаналитик, предполагая содержимое криптограммы, может предполагать первые (и не только) несколько байт, которые часто одинаковые. И даже несмотря на то, что один и тот же байт раз от разу кодируется разной двухбайтовой последовательностью, он все равно получит нехилую подсказку для эвристического анализа, ибо лобовой полный перебор в случае с такой длиной ключа — бесполезен. От сией напасти спасет повторное кодирование (можно неоднократоное, если мьсе — параноик)
второе - можно генерировать несколько ключей, каждый по 64КБ и подировать каждую часть файла своим ключем (очень положительно скажется на скорости шифрования)
Естественно, приведенные мною цифры — не закон: ими можно лавировать. Я хочу обсудить лишь саму идею: каждый, кто осилил программирование за 10 кл, способен запилить свою криптосистему и, через это, на 100% обезопасить себя от кулхацкеров, при условии что неуловимый Джо будет присматривать.
ЗЫ в криптонауке я не просто нубас — я, сука, эталон нубаса