Возможности создания и обработки графики. Алгоритм шифрования текста в графику. Изменения цветовых каналов. Инициализация объектов html-сущностей. Формирование декодированной строки. Инструменты для обработки массивов, текстовых данных и графики.
После всех манипуляций по изменению RGB получится массив RGB, который можно сохранить в виде графического файла и выдать пользователю вместе с ключом для дешифрования. Также создается объект canvas, в который будет выводится изображение: шифрование текст графика массив var canv = document.GETELEMENTBYID("canvas"); Когда в поле для исходных данных введен текст и происходит нажатие на кнопку шифрования, запускается упомянутая выше функция coder(), которая выглядит следующим образом: function coder() {if (source_text_ta.value "") {show_message(1, "Шифрование..."); /*Генерируется рандомный ключ: */ var key_arr = key_gener(); //Функция вернет массив. Если введено нужное количество символов ключа, то открывается форма загрузки файла: decryp_key_inp.onkeyup = function() {var key = decryp_key_inp.value; //Если ключ введен if (key.length === 13) {//и длина ключа = 13 file_form.style.display = "block"; //показать формуВ ходе выполнения курсовой был разработан и программно реализован простой алгоритм шифрования текста в графику.
План
Оглавление
ВВЕДЕНИЕ
ОПИСАНИЕ АЛГОРИТМА
ЗАДЕЙСТВОВАННЫЕ В ПРОГРАММНОЙ РЕАЛИЗАЦИИ ТЕХНОЛОГИИ
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ
Введение
В данной курсовой работе будет описан разработанный и программно реализованный алгоритм шифрования текста в графику. Актуальность темы обоснована тем, что реализаций подобного алгоритма в сети автору найти не удалось. Несмотря на это, автор не берет на себя ответственность утверждать, что является первопроходцем в данной теме.
Один и тот же текст при каждом шифровании образует разные шифровки за счет генерации рандомных ключей. Ключ имеет более 11 млн. комбинаций.
В основной части приведено описание идеи алгоритма, а также отрывки листинга программной реализации с комментариями к коду.
Описание алгоритма
Основа алгоритма в том, что символам шифруемого текста ставится в соответствие некоторое сочетание RGB. Это дает более широкие возможности для искажения исходных данных при простом алгоритме и минимуме программного кода.
Когда система получает текстовые данные, из них формируется массив символов, которые затем заменяются комбинациями RGB, соответствующими данным символам в алфавите.
Далее генерируется ключ, который содержит набор чисел от 0 до 255 и цифру от 0 до 9. На основе сгенерированного ключа производится сдвиг цветовых каналов по определенному алгоритму, который будет рассмотрен позднее в данной работе.
Иногда изменения цветовых каналов могут быть незначительными. Это означает, что на цвета некоторых пикселей в конечном зашифрованном изображении могут быть неотличимы на глаз, но иметь, тем не менее, разные значения и, следовательно, разные зашифрованные символы.
После всех манипуляций по изменению RGB получится массив RGB, который можно сохранить в виде графического файла и выдать пользователю вместе с ключом для дешифрования.
Для дешифрования система должна получить зашифрованный графический файл и ключ. С изображения считываются данные об RGB всех пикселей, которые записываются в массив. Генерируется тот же самый алфавит, что и при шифровании.
Над полученным массивом RGB производятся те же действия, что и при шифровании, но в обратном порядке. На основе полученного ключа производятся все необходимые манипуляции над цветовыми каналами в обратном порядке, по завершении которых получится массив исходных RGB. Далее проверяется наличие соответствий в алфавите, формирование декодированной строки, которая выдается пользователю.
Задействованные в программной реализации технологии
Данный алгоритм мог бы быть реализован практически на любом языке программирования, который имеет инструменты для обработки массивов, текстовых данных и графики.
Автор использовал JAVASCRIPT, обосновывая это простотой данного языка, широтой выбора инструментов для обработки символьных данных и наличием простого API, предоставляющего возможности создания и обработки графики. Обработка RGB изображения производится средствами HTML5 API Canvas. Интерфейс просто сверстан на HTML. Скрипт залит на сервер, а загрузка файлов для дешифрования реализована на PHP.
Программная реализация
Интерфейс сверстан на html и имеет предельно простой вид:
При запуске скрипта происходит инициализация объектов html-сущностей. На кнопки html-форм вешаются обработчики кликов. Также создается объект canvas, в который будет выводится изображение: шифрование текст графика массив var canv = document.GETELEMENTBYID("canvas");
canv.width = canv.height = 1;
var cs = canv.GETCONTEXT("2d");
Изначально высота и ширина области - 1 пиксель. Cs теперь - объект canvas, к которому можно применять методы из API.
Здесь функция coder будет запускаться по клику на кнопку.
После всех инициализаций происходит создание алфавита, в котором символам ставится в соответствие некоторая комбинация RGB.
Символы берутся по их числовому коду. Алфавит создается в три итерации цикла. Так сделано потому, что нужно иметь в алфавите как кириллические, так и латинские символы, а также все знаки препинания и спецсимволы, но при этом нет необходимости получать все символы, имеющие коды в диапазоне кодов от латинских до кириллических. Поэтому было решено забирать тремя итерациями спецсимволы, латинские, а затем кириллические символы.
В итоге функция формирования алфавита получилась такой: var alf_s = {}; //Инициализировать массив function create_alfabet() { for (var i = 0; i < 3; i ) {
//На первой итерации берутся знаки препинания и спецсимволы: if (i === 0) { var st = 0;
var end = 256;
var j = 0;
}
//На второй - символы латинницы: else if (i === 1) { var st = 256;
var end = 512;
var j = 1;
}
//На третьей - кириллица: else { var st = 1024;
var end = 1280;
var j = 2
} var col = 0;
for (var c = st; c < end; c ) {
//Формируется массив RGB: if (String.FROMCHARCODE(c).length > 0) { var rgb = [];
rgb[0] = 1;
rgb[1] = 1;
rgb[2] = 1;
if (String.FROMCHARCODE(c) === " ") { rgb[0] = 0;
rgb[1] = 0;
rgb[2] = 0;
} else { rgb[j] = col;
} rgb[3] = 255;
/*Из массива RGB формируется JSON-строка и сохраняется вместе с символом: */ alf_s[String.FROMCHARCODE(c)] = JSON.stringify(rgb);
col ;
}
}
}
}
В итоге получается массив, в котором каждому символу соответствует уникальное сочетание RGB.
Когда в поле для исходных данных введен текст и происходит нажатие на кнопку шифрования, запускается упомянутая выше функция coder(), которая выглядит следующим образом: function coder() { if (source_text_ta.value "") { show_message(1, "Шифрование...");
SETTIMEOUT(function() {
//Проверяется длина текста: var text_len = source_text_ta.value.length;
/*На основе длины текста вычисляется размер будущего изображения: */ var side = PARSEINT(Math.sqrt(text_len)) 1; /*В итоге получается квадратное изображение. */ canv.width = canv.height = side; /*Размер canvas подгоняется под этот размер. */ cs.MOVETO(0, 0);
/*Создается объект нового изображения: */ var pix_d = cs.CREATEIMAGEDATA(side, side);
/*Функция, производящая сдвиги цветовых каналов: */ function shift(step) {
/*Будет 4 цикла. Можно и больше, но, чтобы иметь приемлемое быстродействие, я сделал 4. */ for (var k = 1; k < 5; k ) { var j = 0;
/*Вложенный цикл по всему массиву пикселей: */ for (var i = 0; i < pix_d.data.length; i ) {
/*Цикл по числам RGB обного отдельно взятого пикселя: */ for (var c = 0; c < 3; c ) {
/*Прибавить к числу канала соответствующее число из ключа и вычесть шаг: */ var C = pix_d.data[j * 4 c] (key_arr[c] - step);
if (C > 255) C = C - 255;
pix_d.data[j * 4 c] = C;
} j = j k;
/*Если число для выбора пикселя уже больше длины массива пикселей, то уменьшить это число вдвое: */ if (j > pix_d.data.length) { j = PARSEINT(j / 2);
}
}
}
}
/*Функция записи rgb пикселя: */ function pixel_put(rgb_arr, pos) { pix_d.data[pos * 4] = rgb_arr[0];
pix_d.data[(pos * 4) 1] = rgb_arr[1];
pix_d.data[(pos * 4) 2] = rgb_arr[2];
pix_d.data[(pos * 4) 3] = 255;
}
}, 0);
} else { //Если текст не введен, показать уведомление: alert("Введите текст.");
}
}
Как видно из описанного выше кода, алгоритм прост. Тем не менее, за счет замены одного символа тремя числами RGB можно иметь возможность сильного искажения исходных данных путем изменения этих самых чисел цветовых каналов RGB.
Генерация ключа производятся функцией key_gener: function key_gener() {
/*Сгенерировать псевдорандомы в нужных диапазонах: */ var R = PARSEINT(Math.random() * 255);
var G = PARSEINT(Math.random() * 255);
var B = PARSEINT(Math.random() * 255);
var A = PARSEINT(Math.random() * 255);
var step = PARSEINT(Math.random() * 8 2);
/*Записать в массив: */ var key_arr = [];
key_arr[0] = R;
key_arr[1] = G;
key_arr[2] = B;
key_arr[3] = A;
key_arr[4] = step;
return key_arr; //Массив ключа в качестве возвращаемого функцией значения
}
Для дешифрования сначала необходимо ввести ключ, который будет проверен на длину. На поле ввода ключа повешен обработчик, реагирующий на ввод данных. Если введено нужное количество символов ключа, то открывается форма загрузки файла: decryp_key_inp.onkeyup = function() { var key = decryp_key_inp.value; //Если ключ введен if (key.length === 13) { //и длина ключа = 13 file_form.style.display = "block"; //показать форму
}
}
Тонкость в том, что необходимо было сделать отправку формы без перезагрузки страницы. Технологию AJAX применять было бы нерентабельно, поэтому обработка формы сделана в скрытом iframe. В iframe загружен PHP-скрипт, но сам фрейм не отображается на странице (установлен атрибут display со значением none). Когда файл выбран и нажимается кнопка "Загрузить", следующая функция отправляет форму: function uploadimg(form){ form.submit();
show_message(0, "");
}
, а PHP-скрипт загружает файл на сервер: /*Устанавливается папка, максимально допустимый размер файла и допустимый формат: */
$savefolder = "files";
$max_size = 5;
$allowtype = array("png");
$result = "";
/*Если файл загружается: */ if (isset ($_FILES["file"])) {
$result = " var error_show_div = window.parent.document.GETELEMENTBYID("error_show_div");
error_show_div.INNERHTML = "Размер файла больше допустимого ". $max_size. "KB";
";
}
} else {
/*Если недопустимый формат: */
$result = " var error_show_div = window.parent.document.GETELEMENTBYID("error_show_div");
error_show_div.INNERHTML = "Файл имеет некорректный формат.";
";
}
} echo $result;
Этот скрипт, загруженный в скрытый фрейм, загружает файл и показывает кнопку, по нажатию на которую запускается функция decoder. Описывать ее подробно смысла нет, так как в ней все происходит аналогично функции coder, но в обратном порядке, а результат выводится в текстовое поле. Весь программный код есть в приложении этой курсовой работы.
Пример зашифрованного сообщения "Курсовая по безопасности информационных систем":
Изображение размером 7х7 пикселей (здесь оно растянуто). В нем содержится 35 цветов со следующими RGB: 95,11,222
215,194,183
175,133,111
235,134,112
188,73,40
26,195,184
200,73,40
16,195,184
244,134,112
35,195,184
156,12,223
21,195,184
237,134,112
231,134,112
205,73,40
8,195,184
195,73,40
24,195,184
243,134,112
236,134,112
241,134,112
240,134,112
198,73,40
230,134,112
13,195,184
144,12,223
238,134,112
135,72,39
39,195,184
183,73,40
10,195,184
197,73,40
239,134,112
27,195,184
121,12,223
Чем больше символов, тем больше будет различных цветов и тем сложнее будет шифр взломать. Но даже при шифровании данным алгоритмом простого текста, например, содержащего частые повторения, взлом не особо упрощается. Например, зашифрованное сообщение "000" выглядит так:
Взлом шифра посредством перебора весьма затруднителен.
Дешифрование зашифрованного текста длиной 5 символов занимает около 0.9 сек. Так как ключ имеет одиннадцать с половиной миллионов комбинаций, то перебор всех значений в этом случае занял бы около 2500 часов, если задействуется одна машина.
Вывод
В ходе выполнения курсовой был разработан и программно реализован простой алгоритм шифрования текста в графику.
Поставленная задача выполнена, алгоритм выполняет возложенные на него функции. Код далек от совершенства, в частности, ему не помешает повышения быстродействия, но это уже совсем другая история.
Размещено на
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы