Разработка алгоритма шифрования текста в графику

 

Оглавление


ВВЕДЕНИЕ

ОПИСАНИЕ АЛГОРИТМА

ЗАДЕЙСТВОВАННЫЕ В ПРОГРАММНОЙ РЕАЛИЗАЦИИ ТЕХНОЛОГИИ

ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ


Введение


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

Один и тот же текст при каждом шифровании образует разные шифровки за счет генерации рандомных ключей. Ключ имеет более 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');.width = canv.height = 1;cs = canv.getContext('2d');

Изначально высота и ширина области - 1 пиксель. Cs теперь - объект canvas, к которому можно применять методы из API.

Присвоение обработчиков клика выглядит так:


cryp_but.onclick = function() {();

}


Здесь функция coder будет запускаться по клику на кнопку.

После всех инициализаций происходит создание алфавита, в котором символам ставится в соответствие некоторая комбинация RGB.

Символы берутся по их числовому коду. Алфавит создается в три итерации цикла. Так сделано потому, что нужно иметь в алфавите как кириллические, так и латинские символы, а также все знаки препинания и спецсимволы, но при этом нет необходимости получать все символы, имеющие коды в диапазоне кодов от латинских до кириллических. Поэтому было решено забирать тремя итерациями спецсимволы, латинские, а затем кириллические символы.

В итоге функция формирования алфавита получилась такой:

var alf_s = {}; //Инициализировать массивcreate_alfabet() { (var i = 0; i < 3; i++) {

//На первой итерации берутся знаки препинания и спецсимволы:

if (i === 0) {st = 0;end = 256; j = 0;

}

//На второй - символы латинницы:

else if (i === 1) {st = 256; end = 512;

var j = 1;

}

//На третьей - кириллица:

else {st = 1024;end = 1280;j = 2

}col = 0;(var c = st; c < end; c++) {

//Формируется массив RGB:(String.fromCharCode(c).length > 0) {rgb = [];[0] = 1;[1] = 1;[2] = 1;(String.fromCharCode(c) === ' ') {[0] = 0;[1] = 0;[2] = 0;

}{[j] = col;

}

rgb[3] = 255;

/*Из массива RGB формируется JSON-строка и сохраняется вместе с символом: */

alf_s[String.fromCharCode(c)] = JSON.stringify(rgb);++;

}

}

}

}

В итоге получается массив, в котором каждому символу соответствует уникальное сочетание RGB.

Когда в поле для исходных данных введен текст и происходит нажатие на кнопку шифрования, запускается упомянутая выше функция coder(), которая выглядит следующим образом:

function coder() {(source_text_ta.value + '') {_message(1, 'Шифрование...');(function() {

//Проверяется длина текста: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);

/*Генерируется рандомный ключ: */

var key_arr = key_gener(); //Функция вернет массив.

/*Цикл по символам шифруемого текста: */

for (var i = 0; i < text_len; i++) {

/*Взять один символ: */ch = source_text_ta.value.substring(i, i + 1);

/*Получить массив RGB, соответствующий данному символу в алфавите, преобразовав из JSON-строки: */

if (!alf_s[ch]) ch = ' ';rgb_arr = JSON.parse(alf_s[ch]);

/*Вставить пиксель в объект изображения: */

pixel_put(rgb_arr, i);

}

/*Произвести сдвиги (подробнее эта функция будет описана ниже): */

shift(key_arr[4]);

/*Выдать пользователю ключ: */_key_output();

/*Вставить объект получившегося изображения в canvas: */.putImageData(pix_d, 0, 0);

/*Сохранить файл (выдать пользователю png для сохранения): */

var img = canv.toDataURL();_message(0, 'Завершено. Сохрани файл и ключ.');

save_file(img, 'crypted_file.png');

/*Функция вывода ключа: */crypted_key_output() {key_str = '';(var i = 0; i < 4; i++) {C = key_arr[i];(C < 10) C = '00' + C;if (C < 100) C = '0' + C;_str = key_str + C;

}_k_inp.value = key_str + key_arr[key_arr.length - 1];_k_inp.classList.add('crypted_k_inp_al');_key_span.innerHTML = 'Сгенерированный ключ: ';

}

/*Функция, производящая сдвиги цветовых каналов: */

function shift(step) {

/*Будет 4 цикла. Можно и больше, но, чтобы иметь приемлемое быстродействие, я сделал 4. */

for (var k = 1; k < 5; k++) {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);(C > 255) C = C - 255;_d.data[j * 4 + c] = C;

}

j = j + k;

/*Если число для выбора пикселя уже больше длины массива пикселей, то уменьшить это число вдвое: */

if (j > pix_d.data.length) {= parseInt(j / 2);

}

}

}

}

/*Функция записи rgb пикселя: */pixel_put(rgb_arr, pos) {_d.data[pos * 4] = rgb_arr[0];_d.data[(pos * 4) + 1] = rgb_arr[1];_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);G = parseInt(Math.random() * 255);B = parseInt(Math.random() * 255);A = parseInt(Math.random() * 255);step = parseInt(Math.random() * 8 + 2);

/*Записать в массив: */

var key_arr = [];

key_arr[0] = R;_arr[1] = G;_arr[2] = B;_arr[3] = A;_arr[4] = step;key_arr; //Массив ключа в качестве возвращаемого функцией значения

}

Для дешифрования сначала необходимо ввести ключ, который будет проверен на длину. На поле ввода ключа повешен обработчик, реагирующий на ввод данных. Если введено нужное количество символов ключа, то открывается форма загрузки файла:

decryp_key_inp.onkeyup = function() {key = decryp_key_inp.value; //Если ключ введен

if (key.length === 13) { //и длина ключа = 13

file_form.style.display = 'block'; //показать форму

}

}

Тонкость в том, что необходимо было сделать отправку формы без перезагрузки страницы. Технологию AJAX применять было бы нерентабельно, поэтому обработка формы сделана в скрытом iframe. В iframe загружен PHP-скрипт, но сам фрейм не отображается на странице (установлен атрибут display со значением none). Когда файл выбран и нажимается кнопка "Загрузить", следующая функция отправляет форму:

function uploadimg(form){.submit();_message(0, '');

}

, а PHP-скрипт загружает файл на сервер:

/*Устанавливается папка, максимально допустимый размер файла и допустимый формат: */

$savefolder = 'files';

$max_size = 5;

$allowtype = array('png');

$result = '';

/*Если файл загружается: */

if (isset ($_FILES['file'])) {

@$type = end(explode(".", strtolower($_FILES['file']['name'])));(in_array($type, $allowtype)) {($_FILES['file']['size']<=$max_size*1) {($_FILES['file']['error'] == 0) {

/*Сгенерировать рандомное имя файла: */

$new_name = rand(100, 999).".".$type;

$thefile = $savefolder."/".$new_name;

/*Попытаться сохранить файл на сервере: */

/*Если по какой-то причине не удалось: */

if (!move_uploaded_file($_FILES['file']['tmp_name'], $thefile)) {

$result = '<script>error_show_div = window.parent.document.getElementById("error_show_div");

error_show_div.innerHTML = "Файл не загружен, попробуй снова.";

</script>';

}

/*Если файл успешно сохранен: */

else {

$result = '<script>show_div = window.parent.document.getElementById("show_div");.parent.document.getElementById("file").value = "";st_dec_but = document.createElement("input");_dec_but.setAttribute("value", "Расшифровать");_dec_but.setAttribute("type", "button");_dec_but.setAttribute("id", "st_dec_but");_dec_but.className = \'cryp_buttons\';_dec_but.setAttribute("onclick", \'decoder("'.$thefile.'")\');.parent.document.getElementById("error_show_div").innerHTML = "";_div.innerHTML = "";_div.appendChild(st_dec_but);

</script>';

}

}

}

/*Если размер больше допустимого: */

else {

$result = '<script>error_show_div = window.parent.document.getElementById("error_show_div");

error_show_div.innerHTML = "Размер файла больше допустимого <i>'. $max_size. 'KB</i>";

</script>';

}

}

else {

/*Если недопустимый формат: */

$result = '<script>error_show_div = window.parent.document.getElementById("error_show_div");_show_div.innerHTML = "Файл имеет некорректный формат.";

</script>';

}

}

echo $result;

Этот скрипт, загруженный в скрытый фрейм, загружает файл и показывает кнопку, по нажатию на которую запускается функция decoder. Описывать ее подробно смысла нет, так как в ней все происходит аналогично функции coder, но в обратном порядке, а результат выводится в текстовое поле. Весь программный код есть в приложении этой курсовой работы.

Пример зашифрованного сообщения "Курсовая по безопасности информационных систем":



Изображение размером 7х7 пикселей (здесь оно растянуто). В нем содержится 35 цветов со следующими RGB:

,11,222

,194,183

,133,111

,134,112

,73,40

,195,184

,73,40

,195,184

,134,112

,195,184

,12,223

,195,184

,134,112

,134,112

,73,40

,195,184

,73,40

,195,184

,134,112

,134,112

,134,112

,134,112

,73,40

,134,112

,195,184

,12,223

,134,112

,72,39

,195,184

,73,40

,195,184

,73,40

,134,112

,195,184

,12,223

Чем больше символов, тем больше будет различных цветов и тем сложнее будет шифр взломать. Но даже при шифровании данным алгоритмом простого текста, например, содержащего частые повторения, взлом не особо упрощается. Например, зашифрованное сообщение "000" выглядит так:



Взлом шифра посредством перебора весьма затруднителен.

Дешифрование зашифрованного текста длиной 5 символов занимает около 0.9 сек. Так как ключ имеет одиннадцать с половиной миллионов комбинаций, то перебор всех значений в этом случае занял бы около 2500 часов, если задействуется одна машина.

Заключение


В ходе выполнения курсовой был разработан и программно реализован простой алгоритм шифрования текста в графику.

Поставленная задача выполнена, алгоритм выполняет возложенные на него функции. Код далек от совершенства, в частности, ему не помешает повышения быстродействия, но это уже совсем другая история.


Оглавление ВВЕДЕНИЕ ОПИСАНИЕ АЛГОРИТМА ЗАДЕЙСТВОВАННЫЕ В ПРОГРАММНОЙ РЕАЛИЗАЦИИ ТЕХНОЛОГИИ ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ЗАКЛЮЧЕНИЕ СПИСОК ЛИТЕРА

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ