Иногда шифрование может оказаться весьма полезной вещью. В этой статье мы рассмотрим основы шифрования. Рассматривать будем на примерах, написанных на Delphi, так как этот язык знают наверно все, а по необходимости перевести на другой не составит труда. Начнём с элементарных алгоритмов, без особых наворотов. С начала у нас будет сдвиг. Алгоритм прост:
X:=10; for i:=1 to Length(s) do Str[i]:=chr(ord(str[i]-x));
В этом случае ключом к расшифровке будет значение Х. Сдвигать мы можем на любое число, но возьмите на заметку, что при х равном 10 и 266 результат будет одним и тем же, а это заметно сокращает время дешифровки. Но такой алгоритм наверно самый не надёжный. Что же нам нужно для его дешифровки? Словарь по больше и желание. Алгоритм дешифровки не многим сложнее:
for i := 1 to 256 do begin s:=sdvig(dest,i); if check(s) then memo1.lines.add('['+IntToStr(i)+']->'+s); end;
Функция Sdvig сдвигает каждый символ строки dest на I и возвращает полученную строку. Функция check работает следующим образом – берём слово их строки s, ищем его с словаре, если не находим не одного слова возвращаем false, дальше есть два варианта, либо мы считаем строку подходящей если все слова есть в словаре или хотя бы одно слово есть в словаре, мне нравится второй случай, так как идеальных словарей не бывает. Далее рассмотрим не более сложный алгоритм, с использованием функции xor. Как она работает описывать не буду – это в любом учебники по информатике есть, но самая важная для нас её особенность, это то что если мы дважды отксорим переменную с одни и тем же ключом, мы получим исходное значение. Вот самый простой пример:
X:=10; for i:=1 to Length(s) do Str[i]:=chr(ord(str[i]) XOR X);
Так же как и в предыдущем случае расшифровывается элементарно, только придётся подождать дольше. Так же возможен ещё один метод, в нём каждому символу сопоставляется соответствующий символ их ключа. Вот пример:
Procedure Shifr(var S:string); Const Al = ‘abcdefghijklmnopqrstvuwxyz’ //латинский алфавит маленькие буквы Var X :string = ‘qwertyuiopasdfghjklzxcvbnm’//все маленькие буквы латинского алфавита, в перемешано порядке I:integer; Begin For i:=1 to length(s) do If pos(s[i],al)o then S[i]:=x[pos(s[i],al)]; End;
Это алгоритм работает только с маленькими буквами латинского алфавита, но это легко исправимо. Расшифровать строку зашифрованную таким алгоритмом сложнее, тут уже другой подход, просто перебор не поможет, А если мы шифруем ещё и не буквенные символы (т.е. пробелу может соответствовать, скажем, “Ч”), то дешифровка ещё более усложняется.
Так же можно рассмотреть простейшие навороты в алгоритмах. Можно менять значение аргумента при сдвиге и Xor’e, скажем так:
X:=10 For I := 1 to length(S) do Begin S[i]:=chr(Ord(s[i])-X); X:=X+1; End;
Это в самом простом случае. Так же можно поступить и с Xor’ом. В третьем нашем алгоритме можно разными способами переставлять местами символы ключа. Так же никто не запрещает применять по нескольку способов шифрования с разными ключами и т.д. была бы фантазия , главное самим не запутаться.