ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Шифрування в Delphi
         

     

    Інформатика, програмування

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

    Ось, власне, і все. Ще раз нагадую, що результат (файл з перекладом) збережеться У ТОЙ же директор, що і наш додаток, а не в тій, де лежить вихідний файл. На закінчення процитую уривок зі статті «Криптографія в C + +» в 3.03 номері журналу «Хакер»:

    (с) Микола «GorluM» Андреєв

    Але я хочу тебе попередити: в нашій країні, згідно з указом № 334 від 1995 року, виробляти і поширювати будь-які шифрувальні кошти можна, тільки маючи ліцензію ФАПСИ. Відповідно, шифрувати не можна:). Тому пиши програми тільки для особистого користування і тільки в пізнавальних цілях.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.soch.imperium.by

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status