Помощь в написании студенческих работ
Антистрессовый сервис

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

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Далее генерируется ключ, который содержит набор чисел от 0 до 255 и цифру от 0 до 9. На основе сгенерированного ключа производится сдвиг цветовых каналов по определенному алгоритму, который будет рассмотрен позднее в данной работе. Как видно из описанного выше кода, алгоритм прост. Тем не менее, за счет замены одного символа тремя числами RGB можно иметь возможность сильного искажения исходных… Читать ещё >

Разработка алгоритма шифрования текста в графику (реферат, курсовая, диплом, контрольная)

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

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

Актуальность темы

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

Один и тот же текст при каждом шифровании образует разные шифровки за счет генерации рандомных ключей. Ключ имеет более 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.

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

cryp_but.onclick = function () {

coder ();

}

Здесь функция 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©.length > 0) {

var rgb = [];

rgb[0] = 1;

rgb[1] = 1;

rgb[2] = 1;

if (String.fromCharCode© === ' ') {

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);

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

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

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

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

/*Взять один символ: */

var ch = source_text_ta.value.substring (i, i + 1);

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

if (!alf_s[ch]) ch = ' ';

var rgb_arr = JSON. parse (alf_s[ch]);

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

pixel_put (rgb_arr, i);

}

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

shift (key_arr[4]);

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

crypted_key_output ();

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

cs.putImageData (pix_d, 0, 0);

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

var img = canv. toDataURL ();

show_message (0, 'Завершено. Сохрани файл и ключ.');

save_file (img, 'crypted_file.png');

/*Функция вывода ключа: */

function crypted_key_output () {

var key_str = '';

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

var C = key_arr[i];

if (C < 10) C = '00' + C;

else if (C < 100) C = '0' + C;

key_str = key_str + C;

}

crypted_k_inp.value = key_str + key_arr[key_arr.length — 1];

crypted_k_inp.classList.add ('crypted_k_inp_al');

crypted_key_span.innerHTML = 'Сгенерированный ключ: ';

}

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

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'])) {

@$type = end (explode («.», strtolower ($_FILES['file']['name'])));

if (in_array ($type, $allowtype)) {

if ($_FILES['file']['size']<=$max_size*1) {

if ($_FILES['file']['error'] == 0) {

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

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

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

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

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

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

$result = '

var error_show_div = window.parent.document.getElementById («error_show_div»);

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

';

}

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

else {

$result = '

var show_div = window.parent.document.getElementById («show_div»);

window.parent.document.getElementById («file»).value = «» ;

var st_dec_but = document. createElement («input»);

st_dec_but.setAttribute («value», «Расшифровать»);

st_dec_but.setAttribute («type», «button»);

st_dec_but.setAttribute («id», «st_dec_but»);

st_dec_but.className = 'cryp_buttons';

st_dec_but.setAttribute («onclick», 'decoder («'.$thefile.'»)');

window.parent.document.getElementById («error_show_div»).innerHTML = «» ;

show_div.innerHTML = «» ;

show_div.appendChild (st_dec_but);

';

}

}

}

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

else {

$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 часов, если задействуется одна машина.

Заключение

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

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

Показать весь текст
Заполнить форму текущей работой