Шифрування в Delphi h2>
Дані
треба берегти. Сам посуди, прикро, якщо відкриття ціною в сто мільйонів єнотів або
рецепт безалкогольної горілки, над яким ти сидів три вечори в похмурому підвалі
нелегального комп'ютерного клубу, - спливе до злісного ленивому конкурентові,
який, користуючись своїм похміллям, наклав брудну лапу на приватні дискети з
цінної інфой?! Далі можна не продовжувати. Шифруємо, шифруємо, шифруємо !.. p>
Добрий
дядечко Borland надав нам декілька цікавих функцій для роботи з
рядками, про які не всі знають. Зосереджені вони в модулі StrUtils.pas.
Такі функції, як RightStr, LeftStr суміщають стандартні команди Copy і
Delete: так, LeftStr повертає значення лівої частини рядки до вказаної вами
позиції (що витворяє RightStr, здогадайся сам), а функція ReverseString і
зовсім робить дзеркальне відображення цього рядка: 321 замість 123. Використовуємо
її особливо, щоб ускладнити життя хитрому дешіфровщіку. p>
Алгоритм
шифрування буде простий, як Win 3.1. З кожним символом кодованого документа
проробимо наступне: p>
1.
Перетворимо символ до числа командою Ord. P>
2.
Перетворимо кожен символ користувальницького пароля в число і суму цих чисел
додамо до отриманого в пункті 1. p>
3.
Від результату віднімаємо число, яке дорівнює позиції даного символу. Тобто буковки
будуть шифруватися по-різному в залежності від їх позиції в рядку :). p>
4.
Те, що вийшло, запишемо назад з чисел в символи командою Chr. Як
бачиш, після всіх наших маніпуляцій цей символ вже буде іншим. p>
5.
Запишемо весь рядок навиворіт командою ReverseString. P>
Дешифрування,
як ти здогадуєшся, буде проводитися в зворотному порядку. p>
Тепер,
коли алгоритм намертво засів в голові, реалізуємо відповідну програму.
Увага! Не виключено, що це буде перша твоя програма з цим
синтаксисом команд: p>
<команда>
<шлях> <пароль> p>
--
так буде виглядати він в консолі нашого застосування (так, воно буде консольним!).
Команд всього дві: crypt і decrypt - відповідно зашифрувати і дешифрувати
файл, шлях до якого вказується після пробілу, а потім - твій пароль. НЕ
ЗАБУДЬ ЙОГО! Попереджаю цілком серйозно. Запам'ятав? У бій! P>
Crypt
C: file.txt linuxmustsurvive p>
--
закодіруем File.txt. Результат (зашифрований текст) зберегтися в тій же
директорії, що і виконуваний файл нашого застосування під ім'ям
Translated_File.txt. P>
Decrypt C: Translated_file.txt
linuxmustsurvive p>
--
дешифрування. p>
Реалізовується
це ось як: p>
program Crypter; p>
($ APPTYPE CONSOLE) p>
uses p>
SysUtils, p>
StrUtils;
//!! p>
var
p>
F,
//вхідний файл p>
F1:
TextFile;// результат (файл з перекладом) p>
ToDo, FileName, PassW, Line,
TranslatedFile: string; p>
position,
IsCrypt: integer; p>
// знаходимо
суму числових значень символів пароль p>
function Password (Psw: string):
integer; p>
var p>
i, res: integer; p>
begin p>
res: = 0; p>
for i: = 1 to Length (psw) do
res: = res + ord (psw [i]); p>
result: = res; p>
end; p>
function Crypt (CryptStr: string):
string; p>
var p>
s: string; p>
i: integer; p>
begin p>
if CryptStr <> EmptyStr then p>
for i: = 1 to Length (CryptStr) do
begin p>
s: = LeftStr (CryptStr, 1); p>
CryptStr: = RightStr (CryptStr, Length
CryptStr) -1); p>
// Шифровки: p>
s: = chr (ord (s [1]) + Password (PassW)-i);
p>
result: = result + s; p>
end; p>
result: = ReverseString (result); p>
end; p>
function Decrypt (DecryptStr:
String): String; p>
var p>
i: integer; p>
s: String; p>
begin p>
DecryptStr: = ReverseString (DecryptStr);
p>
if DecryptStr <> EmptyStr then p>
for i: = 1 to Length (DeCryptStr) do
begin p>
s: = LeftStr (DeCryptStr, 1); p>
DeCryptStr: = RightStr (DeCryptStr, Length
DeCryptStr) -1); p>
// Дешифрування: p>
result: = result + chr (ord (s [1])-password (PassW) + i);
p>
end; p>
end; p>
begin p>
while true do begin p>
isCrypt: = 0; p>
writeln (# 10 + 'Crypter>' + # 10); p>
// Яку команду ввів юзер? p>
readln (ToDo); p>
if UpperCase (ToDo) = 'EXIT' then Exit;
p>
if AnsiContainsText (ToDo, 'decrypt')
then isCrypt: = 1 p>
else if
AnsiContainsText (ToDo, 'crypt') then isCrypt: = 2; p>
// прочитавши
команду, видаляємо її з рядка і читаємо далі p>
position: = pos ( '', ToDo); p>
if position> 0 then
ToDo: = RightStr (ToDo, Length (ToDo)-position); p>
// Читаємо шлях до файлу p>
position: = pos ( '', ToDo); p>
if position> 0 then
FileName: = LeftStr (ToDo, position-1); p>
// Читаємо пароль p>
PassW: = RightStr (ToDo, Length (ToDo)-position);
p>
// Все правильно? Починаємо! p>
if (isCrypt <= 0) or
(PassW = EmptyStr) or (not FileExists (FileName)) then writeln ( 'Wrong command') p>
else begin p>
TranslatedFile: = ExtractFilePath (paramStr (0))
+ 'Translated_' + ExtractFileName (FileName); p>
// з'єднується з
файлами p>
AssignFile (F, FileName); p>
AssignFile (F1, TranslatedFile); p>
// переходимо
в початок файлу p>
Rewrite (F1);
p>
Reset (F);
p>
// читаємо
рядка, поки не дійдемо до кінця файлу p>
while not EOF (F) do begin p>
// читаємо
з перекладного файлу p>
ReadLn (F,
Line); p>
if isCrypt = 1 then
Line: = Decrypt (Line); p>
if isCrypt = 2 then Line: = Crypt (Line);
p>
// записуємо
у файл з перекладом p>
Writeln (F1,
Line); p>
end;
p>
// від'єднався
від файлів p>
CloseFile (F);
p>
CloseFile (F1); p>
end; p>
end; p>
end. p>
Ось,
власне, і все. Ще раз нагадую, що результат (файл з перекладом)
збережеться У ТОЙ же директор, що і наш додаток, а не в тій, де лежить
вихідний файл. На закінчення процитую уривок зі статті «Криптографія в C + +» в
3.03 номері журналу «Хакер»: p>
(с)
Микола «GorluM» Андреєв p>
Але
я хочу тебе попередити: в нашій країні, згідно з указом № 334 від 1995 року,
виробляти і поширювати будь-які шифрувальні кошти можна, тільки маючи
ліцензію ФАПСИ. Відповідно, шифрувати не можна:). Тому пиши програми
тільки для особистого користування і тільки в пізнавальних цілях. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://www.soch.imperium.by
p>