Разработка генератора паролей

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    280,22 Кб
  • Опубликовано:
    2012-07-06
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка генератора паролей

Введение


В наше время информация играет важную роль в мире. Не менее важную роль играет защита информации, призванная «скрыть от ненужных глаз» важные для людей данные. Один из способов защиты информации - паролирование.

Паролирование сейчас применяется повсеместно. Чаще всего паролирование встречается в Интернете. Однако и в жизни часто встречаются пароли: например, банкомат требует ПИН-код, который тоже является паролем. Такой же код требуется ввести при включении телефона.

Пароль - это секретное слово или набор символов, предназначенный для подтверждения личности или полномочий. Пароли часто используются для защиты информации от несанкционированного доступа. В большинстве вычислительных систем комбинация «имя пользователя - пароль» используется для удостоверения пользователя. Паролирование - основной способ защиты информации.

Для повышения безопасности обычно используются следующие методы:

·    Ограничение минимальной длины пароля.

·              Требование повторного ввода пароля после определенного периода бездействия.

·              Требование периодического изменения пароля.

·              Назначение стойких паролей (генерируемых с использованием аппаратного источника случайных чисел, либо с использованием генератора псевдослучайных чисел, выход которого перерабатывается стойкими хэш-преобразованиями).

Исследования показывают, что около 40 % всех пользователей выбирают пароли, которые легко угадать автоматически. Легко угадываемые пароли (123, admin) считаются слабыми и уязвимыми. Пароли, которые очень трудно или невозможно угадать, считаются более стойкими.

Часто требуют следующие требования к паролям:

·    Пароль не должен быть слишком коротким, поскольку это упрощает его взлом полным перебором. Наиболее распространенная минимальная длина - восемь символов. По той же причине он не должен состоять из одних цифр.

·              Пароль не должен быть словарным словом или простым их сочетанием, это упрощает его подбор по словарю.

·              Пароль не должен состоять только из общедоступной информации о пользователе.

В качестве рекомендацией к составлению пароля можно назвать использование сочетания слов с цифрами и специальными символами (#, $, * и т.д.), использование малораспространенных или несуществующих слов, соблюдение минимальной длины.

Для большей безопасности применяют сложные пароли. Однако не все сложные пароли можно придумать «в голове». Плюс, придуманные пароли нужно где-то хранить. Притом хранить нужно так, чтобы «лишние глаза» эти пароли не видели. Для реализации функции создания и хранения паролей была создана эта программа.

Для генерирования паролей программа использует отдельный класс. Список паролей представляет собой таблицу, из которой, по нажатию на определённую ячейку, можно скопировать данные в буфер обмена. Кроме того, в эту таблицу можно занести заметку и флаг. Любую таблицу можно сохранить в файл, притом зашифрованный. Файл можно защитить от открытия чужими людьми особым паролем, до ввода которого список паролей не будет виден.

Обзор основных существующих языков программирования

С++ - это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.

Ключевым понятием С++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают сокрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. С++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.

С++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из С++ программ можно использовать C библиотеки, и с С++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C.

Java - объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания апплетов, приложений и серверного программного обеспечения.

Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) - программе, обрабатывающей байт-код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байт-код, в отличие от текста, обрабатывается значительно быстрее.

Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке C++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента - языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры, и можно было бы использовать на различных процессорах под различными операционными системами.

Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с C и C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++.

Три ключевых элемента объединились в технологии языка Java:

·  Java предоставляет для широкого использования свои апплеты (applets) - небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML

·        Java высвобождает мощь объектно-ориентированной разработки приложений, сочетая простой и знакомый синтаксис с надежной и удобной в работе средой разработки. Это позволяет широкому кругу программистов быстро создавать новые программы и новые апплеты

·        Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов

Pascal (назван в честь Блеза Паскаля) - это чисто процедурный язык программирования, часто использующийся для обучения структурному программированию.был разработан Никлаусом Виртом в 1970; вопреки расхожему мнению, он не был исключительно учебным языком, а предназначался для практического применения. Прототипом послужил Algol. Первоначально язык компилировался в байт-код, подобно языку Java.

В 1983 году был принят первый стандарт языка, ISO 7185:1983, который также называют Standard Pascal. Этот стандарт не добавлял в язык новые элементы, а только формально описывал существующие особенности языка. В 1990 году был принят стандарт ISO/IEC 10206, определяющий так называемый Extended Pascal. Основным изменением стало добавление модульности.

Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Pascal был одним из первых таких языков. По мнению Н. Вирта, язык должен был способствовать дисциплинированию программирования, поэтому, наряду со строгой типизацией, в Pascal сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис интуитивно понятен даже при первом знакомстве с языком. Это упрощает написание компиляторов языка.

Кроме того, язык предоставлял ряд встроенных структур данных: записи, массивы, файлы, множества и указатели.

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

Диалект Object Pascal, разработанный в 1985 году, поддерживает объектно-ориентированное программирование. Существует ряд современных компиляторов, и в настоящее время язык достаточно популярен.

генератор пароль шифрование

Методы шифрования паролей


Base64 буквально означает - позиционная система счисления с основанием 64. Здесь 64 - это наибольшая степень двойки (26), которая может быть представлена с использованием печатных символов ASCII. Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование). Все широко известные варианты, известные под названием Base64, используют символы A-Z, a-z и 0-9, что составляет 62 знака, для недостающих двух знаков в разных системах используются различные символы.

Существует множество вариантов применения Base64. Например, Thunderbird и Mozilla использовали Base64 для сокрытия паролей в POP3. Base64 часто используется как рациональный метод в безопасности для скрытия секретов без издержек на криптографическое управление ключами.

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

MD5. Этот алгоритм был разработан в 1991 году профессором Рональдом Л. Ривестом. Алгоритм MD5 часто называют алгоритмом шифрования, но на самом деле это утверждение ошибочно. Главным преимуществом MD5 является то, что зашифрованные данные восстановить нельзя. А что это за алгоритм шифрования, который шифрует данные так, что никто их не сможет узнать? MD5 - это хэш-функция. У многих возник вопрос: что же это такое? Остановимся на этом вопросе.

Что такое Хэш-функция? Предположим, у нас есть некоторый набор данных. Для простоты будем рассматривать натуральные числа от 1 до 106. И пусть есть некоторая функция, в которой один параметр - натуральное число от 1 до 106, а возвращаемое значение - натуральное число от 1 до 1000. Нам не важно, что именно делает эта функция, нам важно то, что она каждому натуральному числу от 1 до 106 ставит в соответствие другое натуральное число от 1 до 1000. Для примера рассмотрим одну из самых простых функций, выполняющих это действие:

int hash(long int x){(x%1000==0) return 1000;(x % 1000);

}hash(x:longint):longint;(x mod 1000=0) then hash:=1000 else:=x mod 1000;

end;

Это и есть простая хэш-функция. Если мы знаем параметр функции, то однозначно можем сказать, какой будет результат. А если нам известен результат, то можем ли мы узнать однозначно параметр? Конечно, нет. Для числа 234 параметр может быть 234,1234, 2234,3234… Поэтому однозначно восстановить параметр не получится.

Зачем нужен MD5? Для функции из примера, если известен результат, можно легко найти параметр, для которого будет такой же результат. А вот для функции MD5 это сделать не так-то просто. Т.е. если у нас есть только результат функции MD5, то мы не сможем найти параметр, для которого функция выдаст этот же результат (речь даже не идет про однозначное восстановление параметра). MD5 используют для хранения паролей. Приведу пример, когда хранение паролей в открытом виде опасно. Возьмем сайт "Дистанционное обучение" ( сайт ). На этом сайте проходят городские олимпиады школьников по информатике, ежедневно обучаются сотни школьников и студентов. Во многих школах доступа в Интернет нет, и школьникам необходимо пользоваться услугами сайта либо дома, либо не в своей школе. Поэтому сайт начали устанавливать в самих школах. Т.е. обучение происходит не на самом сайте, а на его копии, установленной в школе. Проблема в том, что вместе с сайтом школа получала пароли всех пользователей (в том числе и администраторов), и этими паролями любой мог воспользоваться для "администрирования" самого сайта. Было два способа решить эту проблему:

. Перед созданием копии сайта, которая будет перенесена в школу, удалять все пароли.

. Зашифровать все пароли так, чтобы никто не смог расшифровать их обратно.

Был выбран второй способ. Сейчас пароли хранятся в зашифрованном виде (при помощи MD5). После того, как пользователь введет свой пароль, от пароля вычисляется хэш-функция MD5. Результат сравнивается со значением, хранящимся в базе. Если значения равны, то пароль верен. Еще MD5 можно использовать в качестве контрольной суммы. Предположим, необходимо куда-то скопировать файл. Причем нет никаких гарантий, что файл будет доставлен без повреждений. Перед отправкой можно посчитать MD5 от содержимого файла и передать результат вместе с файлом. Затем посчитать MD5 от принятого файла и сравнить два результата. Если результаты различные, то это означает, что файл или результат был испорчен при передаче. Последнее время MD5 стали использовать интернет-казино. Перед тем, как сделать ставку, игрок получает хэш от результата игры. Когда ставка сделана, игрок получает результат игры (например, выпало число 26). Посчитав от результата хэш-функцию, можно убедиться, что казино сгенерировало это число до того, как игрок сделал ставку. Но не стоит думать, что выиграть в этом казино очень просто. Весь секрет в том что, вероятность выигрыша подобрана таким образом, что игрок почти всегда будет в проигрыше.

Как работает MD5? Теперь посмотрим, как именно работает MD5. Для обработки MD5 получает некоторую строку. Эта строка преобразуется в последовательность из нулей и единиц. Как это делается? У каждого символа есть свой номер. Эти номера можно записать в двоичной системе счисления. Получается, каждый символ можно записать как последовательность нулей и единиц. Если этим воспользоваться, получим из строки последовательность из нулей и единиц. Пусть q будет длина получившейся последовательности (ровно 64 бита, возможно, с незначащими нулями). К получившейся последовательности приписывается 1. В результате длина последовательности увеличивается на 1. Затем к последовательности приписываются нули, пока длина не станет по модулю 512 равна 448 (length mod 512=448). Далее к последовательности дописываются младшие 32 бита числа q, а затем - старшие. Длина последовательности становится кратной 512. Полученную последовательность назовем S. Для подсчета результата используются четыре двойных слова (32 бита). Эти двойные слова инициализируются следующими шестнадцатеричными значениями, где первым следует самый младший байт:

A: 01 23 45 67: 89 ab cd ef: fe dc ba 98: 76 54 32 10

Также для подсчета результата используются следующие функции:

F(X,Y,Z) = XY v not(X) Z(X,Y,Z) = XZ v Y not(Z)(X,Y,Z) = X xor Y xor Z(X,Y,Z) = Y xor (X v not(Z))

X,Y,Z - это двойные слова. Результаты функций, также двойные слова. Для подсчета используется еще одна функция (назовем ее W). Она хитро обрабатывает данные и возвращает результат (подробно ее описывать не буду, т.к. она выполняет серию простых преобразований). Обработка данных происходит с использованием функций F, G, H, I.

На рисунке схематически изображена функция. Слева - входные данные, справа - выходные.

Все необходимые функции и обозначения рассмотрены. Теперь рассмотрим, как происходит просчет результата:

. Запоминаем первые 512 бит последовательности S.

. Удаляем первые 512 бит последовательности S (можно обойтись и без удаления, но тогда на первом шаге надо брать не первые 512, а следующие 512 бит).

. Вызываем функцию W. Параметры A,B,C,D - это текущие значения соответствующих двойных слов. Параметр T - это запомненные 512 бит.

. Прибавляем к A A0.

. B=B+B0.

. C=C+C0.

. D=D+D0.

. Если длина последовательности 0, выходим.

. Переходим к шагу 1.

После выполнения этого алгоритма A,B,C,D - это результат (его длина будет 128 бит). Часто можно видеть результат MD5 как последовательность из 32 символов 0..f. Это то же самое, только результат записан не в двоичной системе счисления, а в шестнадцатеричной.

Концепция объектно-ориентированного программирования


Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.

Мы живем в мире объектов. Стол, автомобиль, ручка, классная доска - все это объекты. Наряду с физическими существуют так же абстрактные объекты, типичными представителями которых являются числа. Таким образом, объект - это любая физическая или абстрактная четко идентифицируемая сущность. Объект - это общефилософское понятие, которое изучалось философами на протяжении длительного времени.

Объекты характеризуются атрибутами. Так атрибутами автомобиля являются максимальная скорость, мощность двигателя, цвет кузова и т. д. Атрибутами усилителя являются частотный диапазон, выходная мощность, коэффициент нелинейных искажений, уровень шума и т. д.

Помимо атрибутов объекты обладают некоторыми функциональными возможностями, которые в объектно-ориентированном программировании (ООП) называют операциями или методами. Так автомобиль может ездить, корабль - плавать, компьютер - производить вычисления.

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

Объект - это экземпляр некоторого класса объектов или просто класса. Так автомобиль Audi 6 является экземпляром класса автомобилей данной модели, приемник Sony SW-7600G так же будет представителем класса одноименных приемников. Таким образом, класс - это абстрактное понятие. Отношение класса и объекта примерно такое же, как платоновские идеи и объекты реального мира. На UML - унифицированном языке моделирования - класс отображается в виде прямоугольника, разделенного на три части. В первой содержится имя класса, во второй - атрибуты, в третьей - методы (рис. 1, а).

Классы могут быть связаны друг с другом различными отношениями. Одним из основных таких отношений является отношение класс - подкласс, известный в объектно-ориентированном программировании как наследование. Например, класс автомобилей Audi 6 является подклассом легковых автомобилей, который в свою очередь входит в более крупный класс автомобилей, а последний является подклассом класса транспортных средств, который помимо автомобилей включает в себя самолеты, корабли поезда и т. д. Примером подобных отношений, являются системы классификации в ботанике и зоологии. Отношением, обратным наследованию, является обобщение или генерализация. Она указывает, что некий класс, является более общим (обобщенным) классом другого класса. Класс транспортных средств, к примеру, является генерализацией классов автомобилей, самолетов и кораблей. В UML принято пользоваться именно понятием генерализация, что отразилось и в символе, представляющем это отношение: большая не закрашенная стрелка, направленная на класс, являющимся обобщением некоторых классов (рис. 1, б).

Рис. 1. Изображения класса и отношений генерализации в UML: а - изображение класса; б - одиночное наследование; с - множественное наследование

При наследовании все атрибуты и методы родительского класса наследуются классом-потомком. Наследование может быть многоуровневым, и тогда классы, находящиеся на нижних уровнях иерархии, унаследуют все свойства (атрибуты и методы) всех классов, прямыми или косвенными потомками которых они являются. Класс B унаследует атрибуты и методы класса A и, следовательно, будет обладать атрибутами A, B, C и D и методами A, B, C и D, а класс C - атрибутами A, B, C, E, F и методами A, B и E.

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

Такая проблема известна как «Алмаз Никсона». Ее суть состоит в том, как должен повести себя Никсон, который является квакером и в то же время принадлежит к республиканской партии. А известно, что квакеры - пацифисты, в то время как республиканцы - сторонники военного решения проблем. На лицо явная коллизия. В разных языках, поддерживающих парадигму ООП и допускающих множественное наследование (а оно допустимо не во всех языках и, например, язык Java, широко распространенный в сфере интернет-приложений, не поддерживает множественного наследования), она преодолевается по-разному, но в любом случае необходимо быть предельно осторожным при возникновении таких ситуаций.

При наследовании одни методы класса могут замещаться другими. Так, класс транспортных средств будет обладать обобщенным методом движения. В классах-потомках этот метод будет конкретизирован: автомобиль будет ездить, самолет - летать, корабль - плавать. Такое изменение семантики метода называется полиморфизмом. Полиморфизм - это выполнение методом с одним и тем же именем различных действий в зависимости от контекста, в частности, от принадлежности тому или другому классу. В разных языках программирования полиморфизм реализуется различными способами. Например, в C++ он реализован с помощью механизма виртуальных функций.

Другим основным видом отношений между классами и объектами является агрегация. Она означает, что один класс содержит в себе в качестве агрегатов (составных частей, подсистем) другие классы. Так автомобиль состоит из кузова, двигателя, трансмиссии и т.п., а в состав приемопередающего устройства входят передатчик, приемник и антенно-фидерное устройство. В UML агрегации обозначаются в виде линии с закрашенным ромбом на конце. Агрегация имеет кратность. Так автомобиль обычно содержит один двигатель, который в свою очередь может принадлежать только одному автомобилю. Автомобиль может обычно содержать от двух до пяти дверей. В свою очередь каждая дверь может принадлежать лишь одному автомобилю.

Чтобы обратиться к атрибутам и методам агрегата, необходимо сначала получить указатель на его владельца, а затем уже выбрать требуемые атрибуты и методы.

Пусть объект D имеет методы f1() и f2() (рис. 2). Чтобы воспользоваться ими, надо сначала получить указатель на корневой объект А, затем на объект С, что в объектно-ориентированном программировании обычно записывается следующим образом:.C.

Далее получаем указатель на D, так как он является агрегатом C, и, наконец, вызываем требуемые методы f1() и f2():.C.D.f1().C.D.f2()

Рис. 2. Иерархическое представление вложенных объектов

Композиция является еще одним отношением, родственным агрегации. Но если в агрегации агрегаты принадлежат классу или объекту, то в композиции существует более слабая связь. Так, студенты с вузом находятся в отношении композиции, тогда как факультеты, которые входят в состав вуза (т. е. являются его неотъемлемой частью или агрегатами), связаны с ним отношением агрегации. На UML композиция обозначается с помощью незакрашенных ромбов. Как и в случае агрегации, отношение композиции имеет кратность. Агрегация и композиция являются подклассами класса отношений ассоциации. Ассоциация обозначается в виде линии без стрелок и ромбиков и может принимать вид, как агрегации, так и композиции. На ранних этапах объектно-ориентированного анализа и проектирования часто задаются отношения ассоциаций, а свою конкретизацию в виде агрегаций и композиций они получают на более поздних этапах.

Существует заблуждение, что объектно-ориентированное программирование является чем-то сложным и непонятным. Но объектная декомпозиция является ничуть не менее естественной и интуитивно понятной, чем алгоритмическая, которая безраздельно властвовала до появления ООП. В программирование основные понятия ООП перешли из других областей знаний, таких как философия, логика, математика и семиотика, причем, не претерпев особых изменений, по крайней мере того, что касается сути этих понятий. Объектный способ декомпозиции (представления) является естественным, и применяется на протяжении многих веков. Поэтому не удивительно, что в процессе эволюции технологии программирования он занял подобающее место и поддерживается, так или иначе, практически всеми современными алгоритмическими языками.

Объектно-ориентированные, объектные и объектно-базированные языки программирования. После того, как были изучены основы ООП, следует дать классификацию языков программирования по степени поддержки данной технологии. Существует 3 класса языков, так или иначе связанных с объектами:

1. Объектно-ориентированные

2.      Объектные

.        Объектно-базированные

Объектно-ориентированные языки в полной мере поддерживают парадигму ООП, а именно, инкапсуляцию, наследование и полиморфизм. Типичными представителями таких языков являются C++, Java, C#.

К объектным языкам относят языки как минимум поддерживающие инкапсуляцию. Они позволяют создавать пользовательские объекты, но, обычно не поддерживают наследование или полиморфизм, или же поддерживают, но не в полной мере. Типичными представителем объектных языков являются Visual Basic до шестой версии включительно и Ada.

К объектно-базированным языкам программирования относятся языки, которые могут использовать имеющиеся объекты, но не имеющие механизма создания полноценных пользовательских объектов. JavaScript относится именно к объектно-базированным языкам программирования. Так, с помощью этого языка можно использовать многочисленные объекты объектной модели документа (DOM), с помощью которых, согласно последним стандартам, предписывается представлять содержимое веб-страницы.

Реализация программы на языке Object Pascal


Обозначение и наименование программы:

·  Наименование исполняемого файла:Generator.exe

·        Размер исполняемого файла: 7,70 Мбайт.

·        Иконка исполняемого файла:

·        Версия файла: 1,0

·        Версия продукта: 1,0

·        Внутреннее имя: Generator

·        Исходное имя файла: Generator.exe

·        Название продукта: Generator

·        Описание версии файла: 1,0

·        Производитель: Щелканов Роман

·        Язык: Русский(Russian)

Программное обеспечение, необходимое для функционирования программы:

·  Операционная система: Windows XP, Windows 7

Языки программирования, на которых написана программа:

·  DelphiXE2(Object Pascal);

Классы решаемых задач:

·  Генерация паролей;

·        Шифрование паролей.

Назначение программы: генерация паролей заданной длины и из символов заданных библиотек. Возможность сохранять пароли в зашифрованный файл и возможность скрытия содержимого файла паролем.

Сведения о функциональных ограничениях на применение:

·  Программа работает только на операционных системах семейства Windows.

·        Для функционирования программы нужен файл «settings.stgg» (файл настроек)

Рис. 3. Алгоритм программы

Программа использует следующие методы:

·  Generate - генерирование пароля;

·        Coder - шифрование пароля;

·        Decoder - дешифрование пароля.

Программа состоит из пяти модулей.

Главный модуль отвечает за интерфейс. Из него вызываются все остальные модули, и она принимает информацию из всех этих модулей.

Модуль настроек отвечает за настройки генерирования паролей. Она принимает информацию из главного модуля.

Модуль генерации отвечает за генерацию паролей. Она принимает и отдаёт информацию главному модулю.

Модуль шифрования отвечает за шифрование паролей. Он принимает и отдает информацию в главный модуль.

Модуль дешифрования отвечает за дешифрование паролей. Он принимает и отдает информацию в главный модуль.

Связи программы с другими программами. Программа не вызывает и не обращается к другим ПО и программам. Поэтому для полнофункционального её функционирования нужны только средства операционных систем семейства Windows.

Используемые технические средства. В состав используемых технических средств входит: IBM PC совместимый с процессором 80386 и выше, ОЗУ не менее 32 Мбайт, 16 МБ видеопамяти, наличие свободного места на жестком диске 15 Мбайт.

Вызов и загрузка. Загрузка и запуск программы осуществляется способами, детальные сведения о которых изложены в Руководстве пользователя операционной системы.

Программа при запуске считывает следующие данные:

«.psw»-файл, содержащий лист с паролями (По требованию пользователя).

«Settings.stgg» - файл, содержащий настройки программы.

В ходе работы программа отдаёт следующие данные:

«.psw»-файл, содержащий лист с паролями (По требованию пользователя).

«Settings.stgg» - файл, содержащий настройки программы.

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

1.   Архангельский А.Я. - Delphi 7. Справочное пособие. -  «Бином», 2004.

2.      Дарахвелидзе П.Г., Марков Е.П. - Программирование в Delphi 7, «БХВ-Петербург", 2003.

.        Культин Н.Б. - Основы программирования в Delphi 7. - «БХВ-Петербург», 2007.

.        Фленов М.Е. - Библия Delphi. 2-е издание, «БХВ-Петербург», 2008.

Приложение 1

Описание основной формы рабочей программы: 1 - строка меню; 2 - таблица паролей; 3 - поле безопасности файла; 4 - кнопка добавления строк; 5 - настройки безопасности файла

Приложение 2

Структурная схема

Модуль интерфеса - отвечает за взаимодействие программы и пользователя.

Модуль настроек - отвечает за настройки генерирования паролей и шифрования.

Модуль генерации паролей - отвечает за генерирование паролей заданной длины из заданных библиотек символов.

Модуль шифрования - отвечает за шифрование поступивших на него паролей.

Модуль дешифрования - отвечает за расшифровывание поступивших на него паролей.

Приложение 3

Функциональная схема

При открытии программы открывается главный модуль.

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

При открытии модуля возможен ввод настроек с клавиатуры, а также происходит вывод настроек на экран.

При требовании пользователя происходит генерация паролей. Главный модуль отправляет данные о настройках пароля в модуль генерации паролей. Модуль генерирует пароль и отправляет его обратно на главную форму.

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

При требовании пользователя главный модуль сохраняет сгенерированные пароли.

Сначала он обращается в модуль шифрования, где происходит шифрование пароля.

Зашифрованный пароль отправляется обратно в главную форму, откуда он отправляется в созданный файл с паролями.

При требовании пользователя главный модуль открывает сгенерированные пароли.

Сначала он обращается в файл с паролями, откуда получает зашифрованный пароль. Зашифрованный пароль отправляется из главной формы в модуль дешифрации, откуда приходит назад в форму расшифрованный.

Приложение 4

Основная форма:kurs;

interface.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.StdCtrls, Vcl.Grids,.Imaging.jpeg, Vcl.ExtCtrls, Vcl.Menus, Vcl.Imaging.pngimage, Clipbrd,, generate, coder, decoder, about, ShellApi;Pass=Record:boolean;

password:string[100];:integer;:string[100];

End;= class(TForm): TStringGrid;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TButton;: TImage;

OpenDialog1: TOpenDialog;: TSaveDialog;: TLabel;

Label4: TLabel;: TLabel;: TLabel;

Label1: TLabel;: TButton;: TEdit;: TEdit;: TEdit;: TLabel;: TLabel;: TButton;: TButton;: TEdit;: TButton;: TLabel;: TLabel;FormCreate(Sender: TObject);AddPasswordClick(Sender: TObject);TablicaSelectCell(Sender: TObject; ACol, ARow: Integer;CanSelect: Boolean);TablicaMouseWheelDown(Sender: TObject; Shift: TShiftState;: TPoint; var Handled: Boolean);TablicaMouseWheelUp(Sender: TObject; Shift: TShiftState;: TPoint; var Handled: Boolean);N3Click(Sender: TObject);N2Click(Sender: TObject);N5Click(Sender: TObject);SecuritybuttonClick(Sender: TObject);N9Click(Sender: TObject);Button1Click(Sender: TObject);N4Click(Sender: TObject);SaveButtonClick(Sender: TObject);PasswordButtonClick(Sender: TObject);N13Click(Sender: TObject);FormClose(Sender: TObject; var Action: TCloseAction);N12Click(Sender: TObject);

{ Private declarations };: TForm1;

Gener: TGenerate;: TCode;: TDecode;

i,n,pis:integer;: file of Pass;,namer,confrm,reader,reader2,j:shortstring;,newdoc:boolean;:Pass;

{$R *.dfm}TForm1.AddPasswordClick(Sender: TObject);.RowCount:=Tablica.RowCount+1;.cells[2,Tablica.RowCount-1]:='✓';.cells[3,Tablica.RowCount-1]:='♪';.cells[5,Tablica.RowCount-1]:='✄';;TForm1.SaveButtonClick(Sender: TObject);lastpassword.text='' then lastpassword.Text:='';newdoc=false then(f,namer);(f);(f,0);(f,zap);lastpassword.Text<>decode.cipher(zap.password,zap.dlin) then informationlabel.Caption:='Старый пароль неверен'beginnewpassword1.Text=newpassword2.text then(f,0);.password:=code.cipher(newpassword1.text,length(newpassword1.text));.dlin:=length(newpassword1.text);(f,zap);.Text:='';.Text:='';.Text:='';.Caption:='Сохранено';informationlabel.Caption:='Пароли не совпадают';; pswchange:=true;newpassword1.Text=newpassword2.text thenSaveDialog1.Execute then:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);.password:=code.cipher(newpassword1.text,length(newpassword1.text));.dlin:=length(newpassword1.text);(f,zap);.Text:='';.Text:='';.Text:='';.Caption:='Сохранено';(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; endinformationlabel.Caption:='Пароли не совпадают';:=false; pswchange:=false;;TForm1.SecuritybuttonClick(Sender: TObject);.ClientHeight:=509;;TForm1.Button1Click(Sender: TObject);.ClientHeight:=296;;TForm1.FormClose(Sender: TObject; var Action: TCloseAction);PSWChange=true then

case MessageBox(Handle,PChar('Изменения не сохранены. Закрыть без сохранения?'),PChar('Внимание'),MB_YESNOCANCEL+MB_APPLMODAL) of

IDYES:begin end;: beginSaveDialog1.Execute then:=caNone;:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);.password:='';.dlin:=0;(f,zap);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; pswchange:=false; newdoc:=true; end;: begin action:=caNone; end;;;;TForm1.FormCreate(Sender: TObject);not FileExists(ExtractFilePath( ParamStr(0) ) + 'settings.stgg') then begin

showmessage('Нет файла настроек. Убедитесь, что он находится в папке с программой или переустановите её');

Halt;;:=true; pis:=1;.PasswordChar := '*';.PasswordChar := '*';.PasswordChar := '*';.passwordchar:= '*';.ClientHeight:=296;.Options:=Tablica.Options-[goEditing];.cells[0,0]:='Флаг';.ColWidths[0]:=42;.cells[1,0]:='Пароль';.cells[2,0]:='Генерация';.ColWidths[2]:=76;i := 1 to Tablica.rowcount do.cells[2,I]:='✓';.cells[3,0]:='В буфер';.ColWidths[3]:=66;i := 1 to Tablica.rowcount do.cells[3,I]:='♪';.cells[4,0]:='Заметка';.ColWidths[4]:=120;.Cells[5,0]:='Удалить';i:=1 to tablica.rowcount do.cells[5,i]:='✄';;TForm1.N12Click(Sender: TObject);(Form1.Handle, nil, PChar(ExtractFilePath( ParamStr(0) ) + 'help.doc'), nil, nil, SW_RESTORE);;TForm1.N13Click(Sender: TObject);.ShowModal;;TForm1.N2Click(Sender: TObject);pis <>0 then beginPSWChange=true thenMessageBox(Handle,PChar('Изменения не сохранены. Закрыть без сохранения?'),PChar('Внимание'),MB_YESNOCANCEL+MB_APPLMODAL) of:begin end;: beginSaveDialog1.Execute then:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);.password:='';.dlin:=0;(f,zap);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; pswchange:=false; newdoc:=true; end;: begin exit; end;;; end;.RowCount:=10;i:=1 to Tablica.RowCount do.Rows[i].Clear;.RowCount:=10;i := 1 to Tablica.rowcount do.cells[2,I]:='✓';i := 1 to Tablica.rowcount do.cells[3,I]:='♪';;TForm1.N3Click(Sender: TObject);pis<>0 then begin if PSWChange=true thenMessageBox(Handle,PChar('Изменения не сохранены. Закрыть без сохранения?'),PChar('Внимание'),MB_YESNOCANCEL+MB_APPLMODAL) of:begin end;: beginSaveDialog1.Execute then:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);.password:='';.dlin:=0;(f,zap);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; newdoc:=false; pswchange:=false; end;: begin exit; end;;; end;OpenDialog1.execute then:=OpenDialog1.FileName;(f,namer);(f);(f,0);(f,zap);filesize(f)=1 then tablica.RowCount:=2filesize(f)-1<>Tablica.RowCount thenzap.dlin<>0 then n:=1 else n:=0;.RowCount:=filesize(f);(f,1);i:=1 to filesize(f)-1 do(f,zap);zap.flag=false then tablica.Cells[0,i]:=''tablica.Cells[0,i]:='✰';n=1 then begin tablica.cells[1,i]:='Ай-ай-ай!'; pis:=0; endbegin tablica.cells[1,i]:=decode.cipher(zap.password, zap.dlin); pis:=1; end;.Cells[4,i]:=zap.zamet;;:=false;:=false;;;;TForm1.N4Click(Sender: TObject);pis <>0 then if newdoc=false then begin(f,namer);(f);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;;if SaveDialog1.Execute then:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);.password:='';.dlin:=0;(f,zap);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; end;:=false; newdoc:=false;;TForm1.N5Click(Sender: TObject);pis <>0 then if SaveDialog1.Execute then:=SaveDialog1.FileName+'.psw';(f,namer);(f);(f,0);

zap.password:='';.dlin:=0;

write(f,zap);(f,1);I:=1 to Tablica.RowCount do((Tablica.Cells[0,i]='')(tablica.Cells[1,i]='')(tablica.Cells[4,i]='')) then continuebeginTablica.Cells[0,i]='' then zap.flag:=falsezap.flag:=true;.password:=code.cipher(tablica.Cells[1,i], length(tablica.Cells[1,i]));.dlin:=length(tablica.Cells[1,i]);.zamet:=tablica.Cells[4,i];(f,zap);;; newdoc:=false; pswchange:=false; end;;TForm1.N9Click(Sender: TObject);.ShowModal;;TForm1.PasswordButtonClick(Sender: TObject);(f,0);(f,zap);passwordedit.text=decode.cipher(zap.password,zap.dlin) theni:=1 to filesize(f)-1 do begin pis:=1; read(f,zap); tablica.cells[1,i]:=decode.cipher(zap.password,zap.dlin); label8.caption:=''; endlabel8.caption:='Пароль неверный';;TForm1.TablicaMouseWheelDown(Sender: TObject; Shift: TShiftState;: TPoint; var Handled: Boolean);.Perform(WM_VScroll, SB_LINEDOWN, 0); Handled:=True;;TForm1.TablicaMouseWheelUp(Sender: TObject; Shift: TShiftState;: TPoint; var Handled: Boolean);.Perform(WM_VScroll, SB_LINEUP, 0); Handled:=True;;TForm1.TablicaSelectCell(Sender: TObject; ACol, ARow: Integer;CanSelect: Boolean);(ACol=0) then:=true;.Options:=Tablica.Options-[goEditing];Tablica.cells[ACol,ARow]='✰' then Tablica.cells[ACol,ARow]:=''Tablica.cells[ACol,ARow]:='✰';;(Acol=1) then Tablica.Options:=Tablica.Options-[goEditing];(Acol=2) then.Options:=Tablica.Options-[goEditing];pis=1 then begin:=true; Tablica.Cells[Acol-1,Arow]:=gener.password(setting.symbol,setting.rate);;;(Acol=3) then.Options:=Tablica.Options-[goEditing];.AsText:=Tablica.Cells[ACol-2,Arow];;(Acol=4) then begin Tablica.Options:=Tablica.Options+[goEditing]; pswchange:=true; end;(ACol=5) then begin Tablica.Options:=Tablica.Options-[goEditing]; pswchange:=true;.Cells [0,arow]:=''; Tablica.Cells [1,arow]:=''; Tablica.Cells [4,arow]:='';;end;.

Форма настроек:setting;.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls,.Imaging.pngimage, Vcl.ExtCtrls, Vcl.Grids;= class(TForm): TImage;: TTrackBar;: TTrackBar;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;: TLabel;: TEdit;: TLabel;: TLabel;: TEdit;: TEdit;: TLabel;: TStringGrid;: TLabel;: TLabel;: TLabel;SymbolBarChange(Sender: TObject);RateBarChange(Sender: TObject);FormCreate(Sender: TObject);SaveButtonClick(Sender: TObject);StringGrid1KeyPress(Sender: TObject; var Key: Char);

{ Private declarations }

{ Public declarations };: TSettings;,rate,i:integer;: file of shortstring;, j: shortstring;

const= ('0..9');

{$R *.dfm}

procedure TSettings.FormCreate(Sender: TObject);:= ExtractFilePath( ParamStr(0) ) + 'settings.stgg';(f,names);(f);(f,j);.Position:=strtoint(j);(f,j);.Position:=strtoint(j);(f,j);.Text:=j;(f,j);.text:=j;(f,j);.text:=j;i:=0 to 9 do(f,j);.Cells[0,i]:=j;;i:=0 to 9 do(f,j);.Cells[1,i]:=j;;RateBar.Position of

:UserNoticeRateBar.Caption:='1 знак';

:UserNoticeRateBar.Caption:='2 знака';

:UserNoticeRateBar.Caption:='3 знака';

:UserNoticeRateBar.Caption:='4 знака';

:UserNoticeRateBar.Caption:='5 знаков';

:UserNoticeRateBar.Caption:='6 знаков ';

:UserNoticeRateBar.Caption:='7 знаков';

:UserNoticeRateBar.Caption:='8 знаков';

:UserNoticeRateBar.Caption:='9 знаков ';

:UserNoticeRateBar.Caption:='10 знаков';

:UserNoticeRateBar.Caption:='11 знаков';

:UserNoticeRateBar.Caption:='12 знаков';

:UserNoticeRateBar.Caption:='13 знаков';

:UserNoticeRateBar.Caption:='14 знаков';

:UserNoticeRateBar.Caption:='15 знаков';

:UserNoticeRateBar.Caption:='16 знаков';

:UserNoticeRateBar.Caption:='17 знаков';

:UserNoticeRateBar.Caption:='18 знаков';

:UserNoticeRateBar.Caption:='19 знаков';

:UserNoticeRateBar.Caption:='20 знаков';;SymbolBar.Position of

1:UserNoticeSymbolBar.Caption:='Только строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Только заглавные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры и строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры и заглавные латинские буквы';

:UserNoticeSymbolBar.Caption:='Заглавные и строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры, заглавные и строчные латинские буквы';

end;;TSettings.RateBarChange(Sender: TObject);:=RateBar.Position;RateBar.Position of

:UserNoticeRateBar.Caption:='1 знак';

:UserNoticeRateBar.Caption:='2 знака';

:UserNoticeRateBar.Caption:='3 знака';

:UserNoticeRateBar.Caption:='4 знака';

:UserNoticeRateBar.Caption:='5 знаков';

:UserNoticeRateBar.Caption:='6 знаков ';

:UserNoticeRateBar.Caption:='7 знаков';

:UserNoticeRateBar.Caption:='8 знаков';

:UserNoticeRateBar.Caption:='9 знаков ';

:UserNoticeRateBar.Caption:='10 знаков';

:UserNoticeRateBar.Caption:='11 знаков';

:UserNoticeRateBar.Caption:='12 знаков';

:UserNoticeRateBar.Caption:='13 знаков';

:UserNoticeRateBar.Caption:='14 знаков';

:UserNoticeRateBar.Caption:='15 знаков';

:UserNoticeRateBar.Caption:='16 знаков';

:UserNoticeRateBar.Caption:='17 знаков';

:UserNoticeRateBar.Caption:='18 знаков';

:UserNoticeRateBar.Caption:='19 знаков';

:UserNoticeRateBar.Caption:='20 знаков';;;TSettings.SaveButtonClick(Sender: TObject);(f,0);:=inttostr(symbolbar.Position);(f,j);:=inttostr(ratebar.Position);(f,j);:=edit1.Text;(f,j);:=edit2.text;(f,j);:=edit3.text;(f,j);i:=0 to 9 do:=StringGrid1.Cells[0,i];(f,j);;i:=0 to 9 do:=StringGrid1.Cells[1,i];(f,j);;;;TSettings.StringGrid1KeyPress(Sender: TObject; var Key: Char);not (key in ['0'..'9',#8]) then key:=#0;;TSettings.SymbolBarChange(Sender: TObject);:=SymbolBar.Position;SymbolBar.Position of

:UserNoticeSymbolBar.Caption:='Только цифры';

:UserNoticeSymbolBar.Caption:='Только строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Только заглавные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры и строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры и заглавные латинские буквы';

5:UserNoticeSymbolBar.Caption:='Заглавные и строчные латинские буквы';

:UserNoticeSymbolBar.Caption:='Цифры, заглавные и строчные латинские буквы';

end;;.

Модуль генерации:generate;classes, Sysutils;=class(TObject)password(symbolpassword,ratepassword:integer):string;;schet:integer;:string;, name:string;, nabor2, nabor3:shortstring;: shortstring;: file of shortstring;TGenerate.password (symbolpassword,ratepassword: Integer):String;:= ExtractFilePath( ParamStr(0) ) + 'settings.stgg';(f,names);(f);(f,2);(f,nabor1);(f,nabor2);(f,nabor3);symbolpassword of

:nabor:=nabor1;

:nabor:=nabor2;

:nabor:=nabor3;

:nabor:=nabor1+nabor2;

:nabor:=nabor1+nabor3;

:nabor:=nabor2+nabor3;

:nabor:=nabor1+nabor2+nabor3;;:='';schet:=0 TO ratepassword DO:=gener+nabor[random(length(nabor))+1];:=gener;(f,25);(F);(f);;.

Модуль кодирования:

unit coder;classes,Sysutils,StrUtils;

type=class(TObject)cipher(password:string;lang:integer):string;;TCode.cipher(password: string; lang: Integer):string;i:integer;:string;:array[1..20] of integer;:file of shortstring;,j,str,nabor:shortstring;:='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789';:= ExtractFilePath( ParamStr(0) ) + 'settings.stgg';(f,names);(f);(f,5);i:=1 to 20 do(f,j);[i]:=strtoint(j);:=mask+j;;:='';i:=1 to 100 do:=mask+nabor[random(length(nabor))+1];i:=1 to 20 doi<lang+1 then:=stuffString(mask,tabl[i],1,copy(password,i,1));lang<>0 then cipher:=maskcipher:='';(f);;.

Модуль декодирования:decoder;classes,Sysutils,strutils;=class(TObject)cipher(mask:string;lang:integer):string;;TDecode.cipher(mask: string; lang: Integer):string;i,n:integer;:string;:array[1..20] of integer;:file of shortstring;,j:shortstring;:= ExtractFilePath( ParamStr(0) ) + 'settings.stgg';(F,names);(F);(f,5);:='';i:=1 to 20 do(f,j);[i]:=strtoint(j);;i:=1 to 20 doi<lang+1 then:=stuffString(password,i+0,1,copy(mask,tabl[i],1));lang<> 0 then cipher:=passwordcipher:='';(f);;.

Приложение 5

Пример работы программы


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!