На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Сайтостроительство » Flash

Пишем криптозащиту на ActionScript

10.04.04

Думаю многие из нас сталкивались с такими ситуациями когда вы не хотите чтобы ваша информация была доступна кому-то ещё кроме вас. Такой контроль над информацией можно осуществить многими способами, но я хочу рассказать о том как написать простейший крипто-алгоритм для небезызвестной программы macromedia flash широко распространённой в инете. Для понимания и извлечения хоть какой-то пользы из статьи вам необходимо знать основы языка ActionScript.

Начинаем шКодить.

Как известно, есть несколько типов шифров: шифр замены, шифр перестановки шифрование ключом, и.т.д. Мы будим использовать шифр перестановки, так как его легко реализовать, он не обладает высокой сложностью. Думаю, из названия понятно, что шифр перестановки основан на перестановке символов по определённому алгоритму.

Например:

у нас есть эталонный символьный ряд -

а б в г д е ё ж з и к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

чтобы зашифровать фразу "привет" мы воспользуемся перестановкой на 4 символа вперёд, если символы выходят за рамки символьного ряда то начинаем считать с начала. И так у нас из слова "привет" получится "фхожич".

П - П [ р с т у ] Ф
^^^^ 4 символа пропускаем.

Думаю, общее представление о шифре перестановки у вас появилось. Теперь перейдём непосредственно к программированию. Для наглядности реализуем шифр перестановки немного посложнее:

/* init */
var encStep = 3; //переменная шага при шифровании
var sTable = "abcdefghijklmnopqrstuvwxyz0123456789"; //наш символьный ряд
var stl = sTable.length; //длинна символьного ряда
var encArr = new Array(); //массив, в котором будут храниться символы фразы для зашифровки
var cTable = new Array(); //соотношение символьного ряда числовому для зашифровываемой фразы
var nTable = new Array(); //числовой эквивалент символьного ряда

function encrypt(tx) {
var txl = tx.length; //длинна зашифровываемой фразы
var encrypted = ""; //переменная для хранения полученной зашифрованной фразы
/* 1 */ for (var i = 0; i<_root.stl; i++) { //соотносим символьному ряду числовой
nTable[i] = i+1;
}
/* 2 */ for (i=0; i encArr[i] = tx.substring(i, i+1);
}
/* 3 */ for (i=0; i<_root.stl; i++) {
//заносим в массив цифровой эквивалент зашифровываемой фразы относительно числовой таблицы
for (var x = 0; x<_root.stl; x++) {
if (encArr[i] == _root.sTable.substring(x, x+1)) {
cTable[i] = nTable[x];
}
}
}
/* 4 */ for (i=0; i cTable[i] += (i+_root.encStep);
/* создаём эффект круговой таблицы, т.е. если алгоритм вышел за предел длинны цифрового ряда то
начинаем считать с начала ряда */
if (cTable[i]>=_root.stl) {
cTable[i] -= _root.stl;
}
}
/* 5 */ for (i=0; i т.е. в конечный результат */
var tmp = cTable[i];
encrypted += _root.sTable.substring(tmp, tmp+1);
}
trace(encrypted); //выводим результат в окно output
}

Теперь разберём подробней алгоритм работы кода. У нас есть символьный ряд -

abcdefghijklmnopqrstuvwxyz0123456789

этот ряд мы присваиваем переменной sTable. В переменной encStep хранится шаг, используемый при расчёте сдвига. Переменной stl присваиваем длину символьного ряда для дальнейших вычислений. В массиве encArr у нас будет храниться каждый символ зашифровываемой фразы отдельно. То есть если мы будим шифровать фразу index, то массив примет следующий вид:

encArr[0] = "i";
encArr[1] = "n";
encArr[2] = "d";
encArr[3] = "e";
encArr[4] = "x";

Массив cTable хранит соотношение символьного ряда цифровому, фраза index в массиве выглядела бы так:

cTable[0] = 9;
cTable[1] = 14;
cTable[2] = 4;
cTable[3] = 5;
cTable[4] = 24;

Массив nTable числовой эквивалент символьного ряда.

Зашифровываемая фраза передаётся функции encrypt как параметр. Таким образом вызов функции encrypt("sometext"); зашифрует фразу sometext. Переменная txl хранит длину зашифровываемой фразы. Переменная encrypted будет хранить результат шифрования. В первом цикле мы соотносим символьный ряд числовому. Второй цикл заносит фразу в массив encArr то одному символу. Третий цикл заносит в массив cTable цифровой эквивалент зашифровываемой фразы. В четвёртом цикле идёт непосредственно процесс сдвига.

Рассмотрим этот код поподробней:

for (i=0; i cTable[i] += (i+_root.encStep);
/* ^^^
к данному зашифровываемому символу (в цифровом виде) прибавляем некоторое число, т.е. осуществляем сдвиг.

Шаг сдвига определён в переменной encStep и к нему прибавляется значение переменной цикла i, другими словами сдвиг зависти от суммы шага и положения буквы в строке */

if (cTable[i]>=_root.stl) { /* создаём эффект круговой таблицы, если после прибавления шага к числовому эквиваленту фразы значение превышает символьный ряд (сопоставление числового ряда символьному становится невозможным, соответственно и шифрование не правильным) то отнимаем длину ряда, т.е. начинаем считать сначала. Для наглядности приведу пример: в массиве cTable[i] содержалось значение 31 что эквивалентно числу 4 в символьной таблице и мы к нему прибавляем ещё 27 и получаем 58, а символа соответствующего числу 58 в символьном ряде нет. */
cTable[i] -= _root.stl;
}
}

Всё, осуществили сдвиг, и теперь осталось превратить полученные цифры в буквы =). Пятый цикл именно этим и занимается (вложенные циклы я не считаю).Строка trace(encrypted); выводит полученную фразу в окно output. Настал момент проверить нашу функцию шифрования в качестве подопытной фразы будим использовать слово "code". После пропускания нашей фразы через функцию шифрования получилось следующее: "gtjl".

Что жe, проверим:

с = 3 + encStep(3) + i(1) = 7 = g
o = 15 + encStep(3) + i(2) = 20 = t
d = 4 + encStep(3) + i(3) = 10 = j
e = 5 + encStep(3) + i(4) = 12 = l

Алгоритм работает =). Думаю теперь надо написать дешифровательную функцию. По моему мнению, она должна выглядеть так:

/* init */
var encStep = 3; //переменная шага при шифровании
var sTable = "abcdefghijklmnopqrstuvwxyz0123456789"; //наш символьный ряд
var stl = sTable.length; //длинна символьного ряда
var encArr = new Array(); //массив, в котором будут храниться символы фразы для зашифровки
var cTable = new Array(); //соотношение символьного ряда числовому для зашифровываемой фразы
var nTable = new Array(); //числовой эквивалент символьного ряда

function decrypt(decObj) {
var ol = decObj.length; //длинна зашифрованного объекта
var decrypted = ""; //расшифрованная фраза
for (var i = 0; i<_root.stl; i++) {
nTable[i] = i+1;
}
for (i=0; i encArr[i] = decObj.substring(i, i+1);
}
for (i=0; i<_root.stl; i++) {
for (var x = 0; x<_root.stl; x++) {
if (encArr[i] == _root.sTable.substring(x, x+1)) {
cTable[i] = nTable[x];
}
}
}
for (i=0; i cTable[i] -= (i+_root.encStep);
}
for (i=0; i var tmp = cTable[i] - 2;
decrypted += _root.sTable.substring(tmp, tmp+1);
}
trace(decrypted);
}

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

for (i=0; i cTable[i] -= (i+_root.encStep);
}

Все предельно просто - отнимаем шаг шифровки + позиция в строке. Всё. =). После прогона фразы "gtjl" через функцию дешифровки получаем "code" чего и следовало ожидать =). Проверим:

g = 7 - (encStep(3) + i(1)) = 3 = c
t = 20 - (encStep(3) + i(2)) = 15 = o
j = 10 - (encStep(3) + i(3)) = 4 = d
l = 12 - (encStep(3) + i(4)) = 5 = e

Работа алгоритма и математика.

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

Теперь поговорим о математике, как можно увидеть из кода все криптографические параметры определяются значениями переменных, а не константами, следовательно, нужно сделать функцию, которая будет проверять перед инициализацией кода в памяти правильность значений криптопараметров, таких как шаг при сдвиге, длинна символьного ряда, и т.д. Но как же рассчитать при каком значении сдвига будет верным уравнение? Вопрос сложности расчётов при разработке и использовании алгоритмов один из самых главных препятствий в разработке шифров. Например, если бы в символьной таблице нашего алгоритма существовал символ «/» и шаг при шифровании составлял бы 19, то конечная зашифрованная строка была бы на 2 символа длиннее той, которую функция получила в качестве параметра при зашифровке, а расшифровка вообще бы не работала.

(n.length(7)) %_root.encStep = /(41) + encStep(19) = 60 - (tx.length(7)*6+19+i(1)) = -2;

При зашифровывании следующего символа уравнение определит его позицию по отношению к предыдущему как -1 то есть на 2 символа выход будут больше. При разработке шифров или использовании чужых обращайте внимание на математику алгоритма, максимально снизьте возможность изменения критических параметров алгоритма.

Заключение.

Я не стремился сделать сложный шифр, при желании и надобности вы сами сможете усложнить алгоритм. Применений шифрованию можно найти очень много, например можно шифровать имена пользователей и пароли в xml базе. Думаю, приведённой информации хватит для написания "шифра цезаря" =).

//Для тех, кто хочет побольше узнать о криптографии советую прочитать книгу "Введение в криптографию" Автор: В.В. Ященко.

Если возникнут вопросы, пишите - T/B \ b1ade <blade@blade.net.co.nr>.

До встречи.

/* b1ade \ http://blade.net.co.nr \ http://www.itx.ru */
return true;
}
Спонсор раздела

Рассылки Subscribe.ru:

Библиотека сайтостроительства - новости, статьи, обзоры
Дискуссионный лист для web-разработчиков
Подписка на MailList.Ru
Автор: NunDesign
Другие разделы
Оптимизация сайтов
Web-студии
» Новое в разделе
Web-дизайн
Web-программирование
Интернет-реклама
Раскрутка сайта
Web-графика
Flash
Adobe Photoshop
Рассылка
Инструменты вебмастера
Контент для сайта
HTML/DHTML
Управление web-проектами
CSS
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100