Библиотека Интернет Индустрии I2R.ru |
|||
|
Пишем криптозащиту на ActionScript10.04.04 Думаю многие из нас сталкивались с такими ситуациями когда вы не хотите чтобы ваша информация была доступна кому-то ещё кроме вас. Такой контроль над информацией можно осуществить многими способами, но я хочу рассказать о том как написать простейший крипто-алгоритм для небезызвестной программы macromedia flash широко распространённой в инете. Для понимания и извлечения хоть какой-то пользы из статьи вам необходимо знать основы языка Начинаем шКодить. Как известно, есть несколько типов шифров: шифр замены, шифр перестановки шифрование ключом, и.т.д. Мы будим использовать шифр перестановки, так как его легко реализовать, он не обладает высокой сложностью. Думаю, из названия понятно, что шифр перестановки основан на перестановке символов по определённому алгоритму. Например: у нас есть эталонный символьный ряд - а б в г д е ё ж з и к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я чтобы зашифровать фразу "привет" мы воспользуемся перестановкой на 4 символа вперёд, если символы выходят за рамки символьного ряда то начинаем считать с начала. И так у нас из слова "привет" получится " П - П [ р с т у ] Ф Думаю, общее представление о шифре перестановки у вас появилось. Теперь перейдём непосредственно к программированию. Для наглядности реализуем шифр перестановки немного посложнее:
/* init */ Теперь разберём подробней алгоритм работы кода. У нас есть символьный ряд - abcdefghijklmnopqrstuvwxyz0123456789 этот ряд мы присваиваем переменной
encArr[0] = "i"; Массив
cTable[0] = 9; Массив Зашифровываемая фраза передаётся функции encrypt как параметр. Таким образом вызов функции Рассмотрим этот код поподробней:
for (i=0; i к данному зашифровываемому символу (в цифровом виде) прибавляем некоторое число, т.е. осуществляем сдвиг.Шаг сдвига определён в переменной encStep и к нему прибавляется значение переменной цикла i, другими словами сдвиг зависти от суммы шага и положения буквы в строке
if (cTable[i]>=_root.stl) { /* создаём эффект круговой таблицы, если после прибавления шага к числовому эквиваленту фразы значение превышает символьный ряд (сопоставление числового ряда символьному становится невозможным, соответственно и шифрование не правильным) то отнимаем длину ряда, т.е. начинаем считать сначала. Для наглядности приведу пример: в массиве cTable[i] содержалось значение 31 что эквивалентно числу 4 в символьной таблице и мы к нему прибавляем ещё 27 и получаем 58, а символа соответствующего числу 58 в символьном ряде нет. */ Всё, осуществили сдвиг, и теперь осталось превратить полученные цифры в буквы =). Пятый цикл именно этим и занимается (вложенные циклы я не считаю).Строка Что жe, проверим:
с = 3 + encStep(3) + i(1) = 7 = g Алгоритм работает =). Думаю теперь надо написать дешифровательную функцию. По моему мнению, она должна выглядеть так:
/* init */ Думаю, вы заметили, что код очень похож на код шифрования. Не буду останавливаться на коде, а перейду непосредственно к расшифровке:
for (i=0; i Все предельно просто - отнимаем шаг шифровки + позиция в строке. Всё. =). После прогона фразы "
g = 7 - (encStep(3) + i(1)) = 3 = c Работа алгоритма и математика.Как видно из объявления символьного ряда, шифр работает только с числами и английским алфавитом нижнего регистра, так как в символьном ряде нет пробелов то и шифрование не отдельных слов, а предложения становится невозможным. Но этот недостаток легко исправить, нужно всего лишь добавить нужные символы в объявление символьного ряда. Теперь поговорим о математике, как можно увидеть из кода все криптографические параметры определяются значениями переменных, а не константами, следовательно, нужно сделать функцию, которая будет проверять перед инициализацией кода в памяти правильность значений криптопараметров, таких как шаг при сдвиге, длинна символьного ряда, и т.д. Но как же рассчитать при каком значении сдвига будет верным уравнение? Вопрос сложности расчётов при разработке и использовании алгоритмов один из самых главных препятствий в разработке шифров. Например, если бы в символьной таблице нашего алгоритма существовал символ «/» и шаг при шифровании составлял бы 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 */ |
|
2000-2008 г. Все авторские права соблюдены. |
|