Шифрование в Delphi delphid.dax.ru WinSov.com Данные надо беречь. Сами посудите, обидно, если открытие ценой в сто миллионов долларов или рецепт безалкогольной водки, над которым вы корпели три вечера в мрачном подвале нелегального компьютерного клуба, - уплывет к злостному ленивому конкуренту, который, пользуясь вашим похмельем, наложил грязную лапу на приватные дискеты с ценнейшей инфой?! Дальше можно не продолжать. Шифруем, шифруем, шифруем!.. Добрый дядюшка 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. {$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 года, производить и распространять любые шифрующие средства можно, только имея лицензию ФАПСИ. Соответственно, шифровать нельзя :). Поэтому пиши программы только для личного пользования и только в познавательных целях