Данные надо беречь. Сами посудите, обидно, если открытие ценой в сто
миллионов долларов или рецепт безалкогольной водки, над которым вы корпели три
вечера в мрачном подвале нелегального компьютерного клуба, - уплывет к злостному
ленивому конкуренту, который, пользуясь вашим похмельем, наложил грязную лапу на
приватные дискеты с ценнейшей инфой?! Дальше можно не продолжать. Шифруем,
шифруем, шифруем!..
Добрый дядюшка Borland предоставил нам несколько занятных функций для работы
со строками, о которых не все знают. Сосредоточены они в модуле
StrUtils.pas. Такие функции, как RightStr, LeftStr
совмещают известные нам стандартные команды Copy и Delete: так,
LeftStr возвращает значение левой части строки до указанной вами позиции (что
вытворяет RightStr, догадайтесь сами), а функция ReverseString и вовсе
делает зеркальное отображение данной строки: 321 вместо 123. Используем ее в
особенности, чтобы осложнить жизнь хитрому дешифровщику.
Алгоритм шифрования будет прост, как Win 3.1: с помощью команды Ord
получим числовой код данного символа. НО! Для дешифровки нужен пароль, который
(я надеюсь) будете знать только вы. Каждый символ пароля будет декодирован в
числовое значение, и алгебраическая сумма всех этих чисел будет прибавлена к
имеющемуся значению зашифрованного знака в тексте. И так - для каждой буквы
шифруемого документа, между которыми добавятся пробелы, иначе декодер примет
множество символов, записанных в цифровом виде, за одно большое многозначное
число и ничего не переведет. А затем результат будет записан навыворот командой
ReverseString.
Когда же настанет пора декодировать информацию, обработанные "чистые"
цифровые значения переведутся в символьные командой Chr. Без пароля такой
цикл взломать достаточно сложно, даже зная алгоритм, если только вы не гуру
криптографии или титан алгебры (я-то надеюсь, что вы, конечно же,
усовершенствуете мое скромное творение: это - лишь заготовка).
Единственный значительный недостаток - размер зашифрованного файла
увеличивается по сравнению с исходным в 3 раза. Но для того и архиваторы
придумали :).
Теперь, когда алгоритм намертво засел в голове, реализуем
соответствующую программу. Внимание! Не исключено, что это будет первая ваша
программа с настоящим синтаксисом команд:
<команда> <путь>
<пароль>
- так будет выглядеть он в консоли нашего приложения (да,
оно будет консольным!). Команд всего две: crypt и decrypt -
соответственно зашифровать и дешифровать файл, путь к которому указывается после
пробела, а затем - ваш пароль. НЕ ЗАБУДЬТЕ ЕГО! Предупреждаю совершенно
серьезно. Запомнили? В бой!
Crypt C:\file.txt linuxmustsurvive
- закодируем File.txt. Результат (зашифрованный текст) сохраниться в той же
директории, что и исполняемый файл нашего приложения под именем
Translated_File.txt.
program Crypter;
{$APPTYPE
CONSOLE}
uses
SysUtils,
StrUtils; //!!
var
F, //входящий
файл
F1: TextFile; //результат (файл с переводом)
ToDo, FileName, PassW,
Line, TranslatedFile: string;
position, IsCrypt:
integer;
//преобразуем пароль в числовое значение
function
Password(Psw: string): integer;
var
i,res:
integer;
begin
res:=0;
for i:=1 to Length(psw) do
res:=res+ord(psw[i]);
result:=res;
end;
function
Crypt(CryptStr: string): string;
var
s: string;
i:
integer;
begin
if CryptStr<>EmptyStr then
for i:=1 to
Length(CryptStr) do
begin
s:=CryptStr;
s:=LeftStr(s,1);
CryptStr:=RightStr(CryptStr,Length(CryptStr)-1);
s:=IntToStr(ord(s[1])+Password(PassW));
result:=result+s+'
';
end;
delete(result,Length(result),1);
result:=ReverseString(result);
end;
function
Decrypt(DecryptStr: String): String;
var
Xpos, i: integer;
Code:
String;
begin
DecryptStr:=ReverseString(DecryptStr);
for i:=1 to
length(decryptstr) do begin
xpos:=pos(' ',decryptstr);
if xpos<=0 then
begin
result:=result+chr(StrToInt(decryptStr)-password(PassW));
exit;
end;
code:=copy(DeCryptStr,1,Xpos-1);
result:=result+chr(StrToInt(code)-password(PassW));
delete(DecryptStr,1,Xpos);
end;
end;
begin
while
true do begin
isCrypt:=0;
writeln(#10+'Crypter >'+#10);
//Какую
команду ввел юзер?
readln(ToDo);
if AnsiContainsText(ToDo,'decrypt') then
isCrypt:=1
else if AnsiContainsText(ToDo,'crypt') then
isCrypt:=2;
position:=pos(' ',ToDo);
if position>0 then
ToDo:=RightStr(ToDo,Length(ToDo)-position);
//Читаем путь к
файлу
position:=pos(' ',ToDo);
if position>0 then
FileName:=LeftStr(ToDo,position-1);
//Читаем
пароль
PassW:=RightStr(ToDo,Length(ToDo)-position);
//Всё правильно?
Начинаем!
if (isCrypt<=0) or (PassW=EmptyStr) or (not
FileExists(FileName)) then writeln('Wrong command')
else
begin
TranslatedFile:=ExtractFilePath(paramStr(0))+'translated_'+ExtractFileName(FileName);
AssignFile(F,
FileName);
AssignFile(F1,
TranslatedFile);
Rewrite(F1);
Reset(F);
while not EOF(F) do
begin
ReadLn(F, Line);
if isCrypt=1 then Line:=Decrypt(Line);
if
isCrypt=2 then Line:=Crypt(Line);
Writeln(F1,
Line);
end;
CloseFile(f);
CloseFile(F1);
end;
end;
end.
Вот, собственно, и всё. В заключение процитирую отрывок из статьи
"Криптография в C + +" в номере 3.03 журнала "Хакер":
//(с) Николай
"GorluM" Андреев
Но я хочу тебя предупредить: в нашей стране, согласно указу
№ 334 от 1995 года, производить и распространять любые шифрующие средства можно,
только имея лицензию ФАПСИ. Соответственно, шифровать нельзя :). Поэтому пиши
программы только для личного пользования и только в познавательных целях
//Отредакции журнала "В помощь Веб-Мастеру"
Помимо
всего у на в стране (Россия) запрещенно использовать криптографические
алгоритмы с криптоустойчивостью превышающую 16 бит, меньше - можно,
больше - препятствие следствию еще как минимум 1 год.
Такчто
уважаемые обладатели PGP у вас серьезные проблемы :-)