Теперь, когда алгоритм намертво засел в голове, реализуем соответствующую программу. Внимание! Не исключено, что это будет первая ваша программа с настоящим синтаксисом команд:
- так будет выглядеть он в консоли нашего приложения (да, оно будет консольным!). Команд всего две: 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.