- PVSM.RU - https://www.pvsm.ru -
Здравствуйте, дорогие жители ! В этой публикации (а, скорее всего, и цикле) я расскажу о моей реализации одного из алгоритмов шифрования. Почему о реализации? Потому что идея не нова, и утверждать то, что задумка принадлежит именно мне, нельзя. Но способ достаточно интересный, поэтому узнать о нём стоит.
В этой части я достаточно кратко опишу принцип работы самого алгоритма и мою реализацию.
В этом разделе будет описан алгоритм шифрования. Для его описания ответим на некоторые вопросы:
Будем шифровать строки, а точнее каждый отдельный символ. Хотя с таким же успехом кодированию поддаются все целые числа. Можно шифровать и дробные, но из-за их особого представления в компьютере временно отбросим их.
Обработав входную строку, мы вернём её в зашифрованном виде. При этом длинна и кодировка строки остаются неизменными, что достаточно удобно.
А что происходит внутри? Это самое интересное! Каждый символ входной строки мы скармливаем элементарному клеточному автомату [1]! Почему он?
Как это происходит? Да очень просто!
Действия 2-6 повторяем для каждого символа и выходная строка готова, возвращаем её.
Ссылку на GitHub дам в конце описания.
Для осуществления моей идеи был использован объектно-ориентированный язык программирования C++. Для наглядности и удобства все сущности, выделенные в первой части, были реализованы в виде отдельных классов. Они получили логичные названия — Field и Rule.
Это вспомогательный класс, который хранит в себе информацию о правиле перехода состояний и содержит функции для работы с правилом.
Данные
Каждый экземпляр имеет лишь состояния клеток, хранящиеся в std::vector в соответствии с каждым случаем окрестности. Почему std::vector? Потому что для типа bool имеется специализация этого контейнера. При этом под каждый элемент отводится лишь 1 бит, вместо целого байта. За счёт этого количество занимаемой памяти уменьшается в 8 раз.
Функции
Класс прост в использовании и понимании. Но и тут найдётся тема для дискуссий. Раз он используется только в связке с экземпляром класса Field, так почему бы не сделать его внутренним? Чёткого ответа на данный вопрос у меня не имеется. И правда, почему бы и нет? Можно сделать его приватным, так, чтобы объекты конструировались по мере необходимости. Заманчиво, но на данный момент я считаю, что он достаточно самостоятелен. Ведь можно определить заранее несколько отдельных правил перехода и кодировать с их помощью строки, которые требуют различных способов шифрования. Я не хочу лишать программистов такого удобства, поэтому в моей реализации тип Rule объявлен отдельно от типа Field.
Это основной тип, в котором и определены функции, непосредственно выполняющие кодирование.
Данные
Функции
Проверить работоспособность программы самостоятельно вы сможете по ссылке ниже. Здесь же я приведу некоторые факты о производительности, показавшиеся мне интересными. Помните, они характеризуют лишь данную программу, но ни в коем случае не сам алгоритм. Начнём!
Для зашифровки всех символов кодировки Unicode с использованием правила 110 понадобилось на моей системе 645 000 тиков или приблизительно 0.645 секунды (средние значения для 10 запусков).
Для зашифровки одного символа кодировки Unicode с использованием правила 110 понадобилось 80 тиков или приблизительно 0.00008 секунды (средние значения для 10 запусков).
Все символы Unicode с использованием всех 256 правил были зашифрованы за 133500000 тиков или приблизительно 134 секунды (средние значения для 10 запусков).
Но самое странное, что выдаются верные результаты! Проверял вручную, лично зашифровав некоторые числа.
По моему, получилось [2] достаточно хорошо и наглядно. От ошибок никуда не деться, но кто не без греха. Реализация работает верно, выполняет свою работу. Использовать её, конечно, ещё рано, многое не реализовано до конца, но я подкинул вам пищу для размышлений и надеюсь, что вскоре появятся ещё и ваши попытки реализовать данный алгоритм.
Автор: chistobaevAndrey
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/248023
Ссылки в тексте:
[1] элементарному клеточному автомату: https://habrahabr.ru/post/273393/
[2] получилось: https://github.com/Andrew15381/Cryptographic-algorithm-based-on-linear-Cellular-Automata/tree/master/Lib
[3] Источник: https://habrahabr.ru/post/323302/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.