15.05.2019

Шифрация. Продолжение.

Ого! Как активно я пишу в блог-то. ))) С прошлого сообщения про шифрацию прошел ровно год.
За этот год мне в голову пришли некоторые улучшения в описанный ранее алгоритм.

Во-первых, перемешивание символов текста гораздо лучше проводить после основного этапа шифрации, а не до него! Ведь в случае обратного порядка криптоаналитик может судить об успешности дешифровки по статистике появления символов в дешифрованном тексте и принимать решение о продолжении дешифровки перемешивания символов на основе этой информации.
Если же сначала проводится шифровка подмешиванием случайных данных ЛКГ, а затем перемешивание уже шифрованных символов, то у криптоаналитика не будет никакой вспомогательной информации, правильно ли произошло восстановления перемешивания. Единственный вариант - попытаться дешифровать текущий вариант, что максимально усложняет задачу.

Во-вторых, можно перемешивать не символы, а биты. Это вообще жесть. Процесс, правда, замедляется на порядок, но зато подбирать ключ получается весьма сложно. В принципе, можно было бы использовать такой способ как отдельный алгоритм шифрации. Единственный его недостаток состоит в том, что можно на основе статистики встречаемости бит сделать какие-то выводы о характере исходного текста. Например, если используется какой-либо европейский язык, а текст записан в формате UTF-16, то нулевых бит будет существенно больше, чем единичных. Для текстов же с равномерным распределением бит, например, больших архивов, трудно что-либо сделать.

В-третьих, можно использовать разные ключи для основного алгоритма шифрации, и для этапа перемешивания, что равноценно увеличению длины ключа в два раза.

В четвертых, это вариант использование ЛКГ. Считается, что младшие биты ЛКГ слишком легко предсказуемы и статически связаны между собой, поэтому лучше использовать для генерации случайных значений биты подальше от правого края числа.
Но меня смутило другое соображение. Пусть у нас имеется параметр a, который является множителем ЛКГ. С этим параметром и заданным ключом X, которое является начальным значением для ЛКГ, у нас получится ряд случайных значений R1,..., Rn, которое мы получили, взяв справа некоторое количество бит из сгенерированных значений ЛКГ X1, ..., Xn. Не важно, возьмем ли мы их совсем справа, или с каким-то смещением.
Теперь, допустим, мы захотели увеличить в два раза разрядность ЛКГ, для существенного повышения криптостойкость. Если мы это сделаем таким образом: добавив к a слева такое же по разрядности число b, то есть ba, а к ключу - Q, получив QX, и используя тот же алгоритм выделения случайных значений, мы получим тy же последовательность R1,..., Rn, что и ранее! То есть на самом деле криптостойкость не увеличилась, и можно раскрыть даже полным перебором с небольшими затратами времени более криптостойкий алгоритм. Возможно, использую даже меньшую разрядность, что исходные a и X.
Поэтому для шифрации надо брать самые старшие разряды из сгенерированного ЛКГ числа. Не знаю, может в этом случае тоже есть какие-то недостатки, я пока их не заметил.

Ну и наконец-то, не прошло и года, как я таки накидал первую, корявую версию на 64-битном ЛКГ генераторе. На всякий случай оставлю ее здесь, а то когда-то давно я уже делал что-подобное, менее совершенное. И все пропала из-за умершего HDD. И да, на текущий момент я уверен, что мой метод абсолютно надежен. Надеюсь, сами догадаетесь почему. ;)

Комментариев нет:

Отправить комментарий