И кто из нас не сталкивался с желанием защитить свое творение от посягательств не верных? Уверен, что 90 человек из 100 ежедневно ломают голову над этим голову, разрабатывая хитрые алгоритмы шифрования столь ценной информации…
Однако не все так просто! В нашем не совершенном обществе существуют структуры, призванные защищать наш сон и покой, и которые наложили вето на разработку и использование средств шифрования информации (криптографии). Но как известно, любая медаль имеет обратную сторону и в любом законе есть слабые стороны.
Целью данной статьи является разработка такой системы защиты информации, которая бы не противоречила действующему законодательству, а заодно позволяла в некоторой мере обеспечить сохранность информации и заставить взломщика почувствовать себя не ловко.
Что и по чем?
Итак! Обсудим наш проект, вернее то, как мы можем обезопасить себя от посягательств со стороны правительства.. Ограничением, по сути, является длина ключа шифрования, т.е. того куска информации, которым мы будем «похабить» наше творение с целью сокрытия информации. Ограничение по длине ключа составляет 32-40бит, соответственно, если мы сделаем ключ меньше 32бит, то не попадем «под прицел», в то время, как сделай мы алгоритм шифрования скажем на 64бита, то мы станем чуть ли не международными террористами.
Существует 2 основных типа крипто-алгоритмов: синхронные и асинхронные. В данной статье, нам предстоит познакомиться с сообщениями и способами их обработки. Синхронные алгоритмы шифрования подразумевают наличие одного ключа и у отправителя и у получателя (в случае, если информация предназначена для получения и прочтения/использования одним человеком), они в свою очередь разделяются на потоковые и блочные алгоритмы. Асинхронные алгоритмы шифрования применяют, когда необходимо предоставить информацию определенному кругу людей, при чем у каждого будет свой закрытый ключ, созданный на основе главного открытого ключа.
К сожалению рамки данной статьи не позволяют в полном объеме рассмотреть данные алгоритмы, но желающие могут легко найти данную информацию в сети, или в печатных изданиях.
Мы остановимся на синхронном шифровании поточного типа, с ключевым словом, длиной 12бит.
Легко и просто.
Вот наконец-то мы добрались до того момента, когда в ход вступают не слова, а реальные примеры и реальные коды. Ниже будет приведен код программы, написанной мною для того, чтобы дать общее понятие о криптографии, текст снабжен исчерпывающими комментариями, так что понять думаю, будет очень легко и просто.
Итак приступим.
unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ShellAPI;
const key = '2147483640'; // Наш ключик ? crname = 'crypt.fln'; // Шифрованый файлик dcrname = 'decrypt.fln'; // Востановленный (расшифрованый) файлик
type TForm1 = class(TForm) GroupBox1: TGroupBox; Button2: TButton; OpenDialog1: TOpenDialog; Button3: TButton; BitBtn1: TBitBtn; Edit1: TEdit; StaticText1: TStaticText; CheckBox1: TCheckBox; Label1: TLabel; GroupBox2: TGroupBox; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label11: TLabel; Label10: TLabel; Label12: TLabel; Button1: TButton; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Label11Click(Sender: TObject); procedure Label10Click(Sender: TObject); procedure Label12Click(Sender: TObject); private public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure Crypt (FileName : TFileName); //Процедура шифрования var f, f1 : File of Char; // Определяем переменные, в которых будут имена исходного и // зашифрованного файла j : Integer; i, i2 : Char; begin AssignFile (f, FileName); // Сопоставляем имя исходного файла с переменной f AssignFile (f1, crname); // и имя итогового файла с переменной f1 типов Char try {$I-} Reset (f); // Пробуем открыть файл; Rewrite (f1); // и создать макет итогового файла {$I+} finally // В случае успеха While not Eof(f) do // Открываем цикл чтения файла побитно begin Read (f, i); // Считываем текущий символ j := Ord(i) xor StrToInt(key); // Берем ASCII код символа и проводим над ним и // ключевым словом операцию «исключающее ИЛИ // (XOR)» i2 := Chr(j); // Полученный результат преобразуем в символ Write (f1, i2); // и записываем в итоговый файл. end; CloseFile (f); // Закрываем исходный CloseFile (f1); // и итоговый файлы. Form1.Label1.Caption := 'Обработан'; If Form1.CheckBox1.Checked <> True then DeleteFile (FileName); end; end;
procedure Decrypt (FileName : TFileName); //Процедура дешифровки файла var f, f1 : File of Char; // Опять объявляем переменные j : Integer; i, i2 : Char; begin AssignFile (f, FileName); // Ассоциируем исходный (зашифрованный) AssignFile (f1, dcrname); // и итоговый (расшифрованный) файлы try {$I-} Reset (f); // Пробуем открыть Rewrite (f1); // Продуем создать {$I+} finally //Если корректно, то While not Eof(f) do // Открываем цикл чтения/записи begin Read (f, i); //Читаем символ i2 := Chr(Ord(i) xor StrToInt(key)); // Восстанавливаем символ Write (f1, i2); // и записываем его в выходной файл. end; CloseFile (f); // Закрываем исходный CloseFile (f1); // и итоговый (восстановленный) файлы end; end;
procedure TForm1.Button3Click(Sender: TObject); begin Close; end;
procedure TForm1.Button2Click(Sender: TObject); begin Crypt (OpenDialog1.FileName); end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin OpenDialog1.Execute; Edit1.Text := OpenDialog1.FileName; Label1.Caption := 'Новый'; Button2.Enabled := True; end;
end.
Эпилог.
Данная статья и тем более данный алгоритм не претендуют на оригинальность, они призваны показать, что криптография не такая уж сложная штука. В настоящее время существует огромное количество различных форм шифрования и защиты информации, это и рассмотренное здесь шифрование ключом, и электронно-цифровая подпись, и хэш-функции… Перечислять можно до бесконечности, однако принцип один – искажение информации (порой даже необратимое). Эта наука представляет Вам обширное поле деятельности, главное помнить, то, что не нужно попадаться. 
!nVert0r
|