« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
    Популярное
Функция AccessResource

Настройка диалогов

Инструкции write и writeln

О модульной архитектуре Windows 7

Системный реестр

Объекты сериализации

Учебная программа INTSLJMM

Использование директивы #import в Visual C++

Таблица 1: расходы на каждого члена семьи и по статьям

Oracle: Изучаем метки доступа к строкам: задание свойств столбца доступа в таблице




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 131
Пользователей: 0

Статьи:: Delphi :: Разные статьи :: ШИФРОВАНИЕ В DELPHI



отправить ссылку другу версия для печати  Обсудить на форуме

ШИФРОВАНИЕ В DELPHI



Новая страница 1

Трофим Роцкий

ШИФРОВАНИЕ В 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 года, производить и распространять любые шифрующие средства можно, только имея лицензию ФАПСИ. Соответственно, шифровать нельзя :). Поэтому пиши программы только для личного пользования и только в познавательных целях.




Рубрика: Разные статьи




Вышел MySQL 5.1.30, первый стабильный рели....

MySQL

После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:


Подробнее... | Рубрика: MySQL | Добавлено: 28.11.2008

Тестирование параллельных программ.

Тестирование

Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.


Подробнее... | Рубрика: Тестирование | Добавлено: 28.11.2008

Архитектура AMD64 (EM64T).

Архитектура AMD

Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.


Подробнее... | Рубрика: Архитектура AMD | Добавлено: 27.11.2008

Остальные статьи:

Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новы...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейс...
Генераторы отчетов FastReport 4 и QuickRep...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия