Шифрування в 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 CryptStrEmptyStr 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 DecryptStrEmptyStr 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