Шифрування в Delphi (исходники), Різне, Програмування, статті

Borland надав нам кілька цікавих функцій для роботи з рядками, про які не всі знають. Зосереджені вони в модулі StrUtils.pas. Такі функції, як RightStr, LeftStr суміщають стандартні команди Copy і Delete: так, LeftStr повертає значення лівої частини рядка до зазначеної вами позиції (що витворяє RightStr, здогадайся сам), а функція ReverseString і зовсім робить дзеркальне відображення даної рядки: 321 замість 123. Використовуємо її в особливості, щоб ускладнити життя хитрому дешифрувальники.

Алгоритм шифрування буде простий, як Win 3.1. З кожним символом кодованого документа проробимо наступне:




  1. Перетворимо символ в число командою Ord.


  2. Перетворимо кожен символ користувальницького пароля в число і суму цих чисел додамо до отриманого в пункті 1.


  3. Від результату віднімаємо число, рівне позиції даного символу. Тобто буковки будуть шифруватися по-різному в залежності від їх позиції в рядку :).


  4. Те, що вийшло, запишемо назад з чисел на символи командою Chr. Як бачиш, після всіх наших маніпуляцій цей символ вже буде іншим.


  5. Запишемо весь рядок навиворіт командою ReverseString.

Дешифрування, як ти здогадуєшся, буде проводитися в зворотному порядку.

Тепер, коли алгоритм намертво засів в голові, реалізуємо відповідну програму. Увага! Не виключено, що це буде перша твоя програма з цим синтаксисом команд:

 

<Команда> <шлях> <пароль>

 

– Так буде виглядати він в консолі нашого застосування (так, воно буде консольним!). Команд всього дві: crypt і decrypt – відповідно зашифрувати і дешифрувати файл, шлях до якого вказується після пробілу, а потім – твій пароль. НЕ ЗАБУДЬ ЙОГО! Попереджаю цілком серйозно.

 

Crypt C:file.txt linuxmustsurvive

 

– Закодируем File.txt. Результат (зашифрований текст) зберегтися в тій же директорії, що і виконуваний файл нашого додатки під ім’ям Translated_File.txt.

 

Decrypt C:Translated_file.txt linuxmustsurvive

 

– Дешифрування.

Реалізовується це ось як:

 

 

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:=LeftStr(CryptStr,1);

    CryptStr:=RightStr(CryptStr,Length(CryptStr)-1);

/ / Шифровку:

    s:=chr(ord(s[1])+Password(PassW)-i);

    result:=result+s;

  end;

  result:=ReverseString(result);

end;

 

function Decrypt(DecryptStr: String): String;

var

  i: integer;

  s: String;

begin

  DecryptStr:=ReverseString(DecryptStr);

  if DecryptStr<>EmptyStr then

  for i:=1 to Length(DeCryptStr) do begin

    s:=LeftStr(DeCryptStr,1);

    DeCryptStr:=RightStr(DeCryptStr,Length(DeCryptStr)-1);

/ / Дешифрування:

    result:=result+chr(ord(s[1])-password(PassW)+i);

  end;

end;

 

begin

  while true do begin

    isCrypt:=0;

    writeln(#10+”Crypter >”+#10);

/ / Яку команду ввів юзер?

    readln(ToDo);

    if UpperCase(ToDo)=”EXIT” then Exit;

    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.

 

Ось, власне, і все. Ще раз нагадую, що результат (файл з перекладом) збережеться У тій же директорії, що і наше додаток, а не в тій, де лежить вихідний файл.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*