Высокоуровневые методы информатики и программирования

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 21.04.2012
Размер файла 863,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Полиалфавитные шифры

2. Шифр Виженера

2.1 История

2.2 Описание

2.3 Криптоанализ

2.3.1 Метод Касиски

2.3.2 Тест Фридмана

2.4 Частотный анализ

2.5 Варианты

2.6 Экспериментальная проверка работы программы

3. Взлом полиалфавитных шифров

Заключение

Список использованной литературы

Приложения

Приложение А. Шифр Виженера

Приложение Б. Скриншоты программы

Приложение В. Квадрат Виженера (tabula recta)

Введение

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

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

Благодаря работе Абу аль - Кинди оказалось, что шифры типа «Шифра Цезаря» (то есть моноалфавитные шифры, в которых каждой букве кодируемого текста ставится в соответствие однозначно какая-то шифрованная буква) довольно-таки легко поддаются частотному криптоанализу. Возникла потребность в разработке таких шифров, ручная расшифровка которых может потребовать очень значительных усилий. И на смену моноалфавитным шифрам пришли полиалфавитные шифры. Абу аль - Кинди первым предложил использовать многоалфавитный шифр. В европейских странах это произошло в эпоху Возрождения, когда развитие торговли потребовало надежные способы защиты информации. Одним из первых предложил полиалфавитный шифр итальянский архитектор Батисте Альберти. Впоследствии данный шифр получил имя дипломата XVI века Блеза де Виженера. Также вклад в развитие полиалфавитных шифров внес немецкий аббат XVI века Иоганн Трисемус. Простым, но стойким способом полиалфавитной замены является шифр Плейфера, открытый в начале XIX века Чарльзом Уитстоном.

Этот шифр использовался вплоть до I мировой войны. Последним словом в развитии полиалфавитных шифров стали так называемые роторные машины, которые позволяли легко создавать устойчивые к криптоатакам полиалфавитные шифры. Примером такой машины является немецкая машина Enigma, разработанная в 1917 г. Эдвардом Хеберном.

Целью курсовой работу является реализация криптографического алгоритма шифрования и дешифрования с использованием шифра Виженера.

1. Полиалфавитные шифры

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

Суть полиалфавитного шифра заключается в циклическом применении нескольких моноалфавитных шифров к определённому числу букв шифруемого текста. Например, пусть у нас имеется некоторое сообщение x1 , x2 , x3 , ….. xn , …… x2n , ….., которое надо зашифровать. При использовании полиалфавитного шифра имеется несколько моноалфавитных шифров (например, n штук). И в нашем случае к первой букве применяется первый моноалфавитный шифр, ко второй букве -- второй, к третьей -- третий….. к n-ой букве -- n-й, а к n+1 опять первый, ну и так далее. Таким образом, получаётся довольно-таки сложная последовательность, которую уже не так просто вскрыть, как один моноалфавитный шифр. Самым важным эффектом, достигаемым при использовании полиалфавитного шифра, является маскировка частот появления тех или иных букв в тексте, на основании которой обычно очень легко вскрываются моноалфавитные шифры.

2. Шифр Виженера

Шифр Виженера (фр. Chiffre de Vigenere) - метод полиалфавитного шифрования буквенного текста с использованием ключевого слова.

Этот метод является простой формой многоалфавитной замены. Шифр Виженера изобретался многократно. Впервые этот метод описал Джован Баттиста Беллазо (итал. Giovan Battista Bellaso) в книге La cifra del. Sig. Giovan Battista Bellaso в 1553 году, однако, в XIX веке получил имя Блеза Виженера, французского дипломата. Метод прост для понимания и реализации, он является недоступным для простых методов криптоанализа.

2.1 История

Первое точное документированное описание многоалфавитного шифра было сформулировано Леоном Баттиста Альберти в 1467 году, для переключения между алфавитами использовался металлический шифровальный диск. Система Альберти переключает алфавиты после нескольких зашифрованных слов. Позднее, в 1518 году, Иоганн Трисемус в своей работе «Полиграфия» изобрел tabula recta -- центральный компонент шифра Виженера.

Блез Виженер представил свое описание простого, но стойкого шифра перед комиссией Генриха III во Франции в 1586 году, и позднее изобретение шифра было присвоено именно ему. Давид Кан в своей книге «Взломщики кодов» отозвался об этом осуждающе, написав, что история «проигнорировала важный факт и назвала шифр именем Виженера, несмотря на то, что он ничего не сделал для его создания».

Шифр Виженера имел репутацию исключительно стойкого к «ручному» взлому. Известный писатель и математик Чарльз Лютвидж Доджсон (Льюис Кэрролл) назвал шифр Виженера не взламываемым в своей статье «Алфавитный шифр» англ. The Alphabet Cipher, опубликованной в детском журнале в 1868 году. В 1917 году Scientific American также отозвался о шифре Виженера, как о неподдающемся взлому. Это представление было опровергнуто после того, как Касиски полностью взломал шифр в XIX веке, хотя известны случаи взлома этого шифра некоторыми опытными криптоаналитиками еще в XVI веке.

Шифр Виженера достаточно прост для использования в полевых условиях, особенно если применяются шифровальные диски. Например, «конфедераты» использовали медный шифровальный диск для шифра Виженера в ходе Гражданской войны. Послания Конфедерации были далеки от секретных, и их противники регулярно взламывали сообщения. Во время войны командование Конфедерации полагалось на три ключевых словосочетания: «Manchester Bluff», «Complete Victory» и -- так как война подходила к концу -- «Come Retribution».

Гилберт Вернам попытался улучшить взломанный шифр (он получил название шифр Вернама-Виженера в 1918 году), но, несмотря на его усовершенствования, шифр так и остался уязвимым к криптоанализу. Однако работа Вернама в конечном итоге все же привела к получению шифра, который по-настоящему трудно взломать.

2.2 Описание

В шифре Цезаря каждая буква алфавита сдвигается на несколько строк; например в шифре Цезаря при сдвиге +3, A стало бы D, B стало бы E и так далее. Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для шифрования может использоваться таблица алфавитов, называемая tabula recta или квадрат (таблица) Виженера (Приложение В). Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причем каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На разных этапах кодировки шифр Виженера использует различные алфавиты из этой таблицы. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова. Например, предположим, что исходный текст имеет вид:

ATTACKATDAWN

Человек, посылающий сообщение, записывает ключевое слово («LEMON») циклически до тех пор, пока его длина не будет соответствовать длине исходного текста:

LEMONLEMONLE

Первый символ исходного текста A зашифрован последовательностью L, которая является первым символом ключа. Первый символ L шифрованного текста находится на пересечении строки L и столбца A в таблице Виженера. Точно так же для второго символа исходного текста используется второй символ ключа; то есть второй символ шифрованного текста X получается на пересечении строки E и столбца T. Остальная часть исходного текста

шифруется подобным способом.

Исходный текст: ATTACKATDAWN

Ключ: LEMONLEMONLE

Зашифрованный текст: LXFOPVEFRNHR

Расшифровывание производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.

Если буквы A-Z соответствуют числам 0-25, то шифрование Виженера можно записать в виде формулы:

Расшифровка:

Допустим, что нам надо зашифровать некий текст, первым словом которого является слово DANCE. Зашифруем первые две буквы, а все остальные делаются аналогично. В графе «ключ» многократно повторяем слово ABC, в графе «открытый текст» приводим открытый текст, в графе «шифрованный текст» приводим зашифрованный текст:

Берём первую букву и смотрим, какая буква ключа находится над ней, а затем полученную букву ключа находим в первом столбце квадрата Виженера, а шифруемую букву в первой строке, затем смотрим, какая буква находится на пересечении полученной строки и столбца -- она и будет зашифрованной буквой:

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

2.3 Криптоанализ

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

1. Поиск длины ключа. Можно анализировать распределение частот в зашифрованном тексте с различным прореживанием. То есть брать текст, включающий каждую 2-ю букву зашифрованного текста, потом каждую 3-ю и т. д. Как только распределение частот букв будет сильно отличаться от равномерного (например, по энтропии), то можно говорить о найденной длине ключа.

2. Криптоанализ. Совокупность l-шифров Цезаря (где l - найденная длина ключа), которые по отдельности легко взламываются.

Тесты Фридмана и Касиски могут помочь определить длину ключа.

2.3.1Метод Касиски

В 1863 году Фридрих Касиски был первым, кто опубликовал успешный алгоритм атаки на шифр Виженера, хотя Чарльз Беббидж разработал этот алгоритм уже в 1854 году. В то время когда Беббидж занимался взломом шифра Виженера, John Hall Brock Thwaites представил новый шифр в «Journal of the Society of the Arts»; когда Беббидж показал, что шифр Thwaites'а является лишь частным случаем шифра Виженера, Thwaites предложил ему его взломать.

Беббидж расшифровал текст, который оказался поэмой «The Vision of Sin» Альфреда Теннисона, зашифрованной ключевым словом Emily -- именем жены поэта.

Тест Касиски опирается на то, что некоторые слова, такие как «the» могут быть зашифрованы одинаковыми символами, что приводит к повторению групп символов в зашифрованном тексте. Например: сообщение, зашифрованное ключом ABCDEF , не всегда одинаково зашифрует слово «crypto»:

Ключ: ABCDEF AB CDEFA BCD EFABCDEFABCD

Исходный текст: CRYPTO IS SHORT FOR CRYPTOGRAPHY

Шифрованный текст: CSASXT IT UKSWT GQU GWYQVRKWAQJB

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

Ключ:

ABCDAB CD ABCDA BCD ABCDABCDABCD

Исходный текст:

CRYPTO IS SHORT FOR CRYPTOGRAPHY

Шифрованный текст:

CSASTP KV SIQUT GQU CSASTPIUAQJB

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

Шифрованный текст:

DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD

Расстояние между повторяющимися DYDUXRMH равно 18, это позволяет сделать вывод, что длина ключа равна одному из значений: 18,9,6,3 или 2. Расстояние между повторяющимися NQD равно 20. Из этого следует, что длина ключа равна 20 или 10, или 5, или 4 или 2. Сравнивая возможные длины ключей, можно сделать вывод, что длина ключа (почти наверняка) равна 2.

2.3.2 Тест Фридмана

Тест Фридмана (иногда называемый каппа-тест) был изобретен Вильямом Фридманом в 1920 году. Фридман использовал индекс совпадения, который измеряет частоты повторения символов, чтобы взломать шифр. Зная вероятность того, что два случайно выбранных символа текста совпадают (примерно 0,067 для англ. языка) и вероятность совпадения двух случайно выбранных символов алфавита (примерно 0,0385 для англ. языка), можно оценить длину ключа как:

Из наблюдения за частотой совпадения следует:

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

2.4 Частотный анализ

Как только длина ключа становится известной, зашифрованный текст можно записать во множество столбцов, каждый из которых соответствует одному символу ключа. Каждый столбец состоит из исходного текста, который зашифрован шифром Цезаря; ключ к шифру Цезаря является всего-навсего одним символом ключа для шифра Виженера, который используется в этом столбце. Используя методы, подобные методам взлома шифра Цезаря, можно расшифровать зашифрованный текст. Усовершенствование теста Касиски, известное как метод Кирхгофа, заключается в сравнении частоты появления символов в столбцах с частотой появления символов в исходном тексте для нахождения ключевого символа для этого столбца. Когда все символы ключа известны, криптоаналитик может легко расшифровать шифрованный текст, получив исходный текст. Метод Кирхгофа не применим, когда таблица Виженера скремблирована, вместо использования обычной алфавитной последовательности, хотя тест Касиски и тесты совпадения все еще могут использоваться для определения длины ключа для этого случая.

2.5 Варианты

Вариант running key (англ. - бегущий ключ) шифра Виженера когда-то был не взламываемым. Эта версия использует в качестве ключа блок текста, равный по длине исходному тексту. Так как ключ равен по длине сообщению, то методы предложенные Фридманом и Касиски не работают (так как ключ не повторяется). В 1920 году Фридман первым обнаружил недостатки этого варианта. Проблема с running key шифра Виженера состоит в том, что криптоаналитик имеет статистическую информацию о ключе (учитывая, что блок текста написан на известном языке) и эта информация будет отражаться в шифрованном тексте. Если ключ действительно случайный, его длина равна длине сообщения, и он использовался единожды, то шифр Виженера теоретически будет не взламываемым.

Виженер фактически изобрел более стойкий шифр -- шифр с автоключом. Несмотря на это, «шифр Виженера» ассоциируется с более простым многоалфавитным шифром. Фактически эти два шифра часто путали, называя их le chiffre indechiffrable. Беббидж фактически взломал более стойкий шифр с автоключом, в то время когда Касиски издал первое решение взлома многоалфавитного шифра с фиксированным ключом. Метод Виженера зашифровки и расшифровки сообщений иногда относится к «варианту Битфорда». Его отличие от шифра Битфорда, изобретенного сэром Френсисом Битфордом, который, тем не менее, подобен шифру Виженера, заключается в использовании немного измененного механизма шифрования и таблиц.

Несмотря на очевидную стойкость шифра Виженера, он широко не использовался в Европе. Большее распространение получил шифр Гронсфилда, созданный графом Гронсфилдом, идентичный шифру Виженера, за исключением того, что он использовал только 10 различных алфавитов (соответствующих цифрам от 0 до 9). Преимущество шифра Гронсфилда состоит в том, что в качестве ключа используется не слово, а недостаток -- в небольшом количестве алфавитов. Шифр Гронсфилда широко использовался по всей Германии и Европе, несмотря на его недостатки.

2.6 Экспериментальная проверка работы программы

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

После шифрования был получен следующий зашифрованный текст:

«СРМДЕЦУТЖКЕ»

Для проверки работы программы дешифрования по таблице Виженера возьмем этот же зашифрованный текст «СРМДЕЦУТЖКЕ». При этом ключевым символом должно являться слово «два». При расшифровке текста получим первоначальный текст «приветствие».

3. Взлом полиалфавитных шифров

Проще всего взломать полиалфавитный шифр, зная его период, то есть число используемых моноалфавитных шифров. Тогда, выбрав буквы, соответствующие каждому из моноалфавитных шифров, можно к каждому из них применить так называемый частотный анализ (или какой-нибудь другой метод взлома моноалфавитных шифров). Метод основан на том, что каждая буква в произвольном тексте появляется с вполне определенной частотой, а значит, посмотрев частоты появления тех или иных букв, можно узнать, как происходит замена. Одним из методов нахождения периода полиалфавитных шифров является метод, предложенный Фредериком Касиски в 1836 году. Он заключается в том, что в зашифрованном тексте находятся одинаковые сегменты длины не меньше, чем три буквы, затем вычисляются расстояния между первыми буквами соседних сегментов. Оказывается, предполагаемый период является кратным наибольшему общему делителю для этих расстояний.

Заключение

В результате выполнения курсовой работы была разработана программа, реализующая криптографический алгоритм шифрования и дешифрования с использованием шифра Виженера. Разработанная программа написана на языке Delphi ("Делфи").

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

С развитием ЭВМ полиалфавитные шифры перестали быть столь устойчивыми к криптоатакам, и, так же, как в свое время и моноалфавитные шифры, отошли на задний план, став частью истории.

Список используемой литературы

1. А.В. Яковлев, А.А. Безбогов, В.В. Родин, В.Н. Шамкин. Криптографическая защита информации. -- Тамбов: Издательство ТГТУ, 2006

2. David, Kahn. On the Origin of a Species. The Codebreakers: The Story of Secret Writing. Simon & Schuster, 1999

3. Henk C.A. van Tilborg, ed. Encyclopedia of Cryptography and Security (First ed.). Springer. pp. 115, 2005

4. Э. М. Габидулин. Курс лекций по Защите Информации. -- Москва: Издательство МФТИ, 2007

5. А. П. Алферов, А. Ю. Зубов, А. С. Кузьмин, А. В. Черемушкин. Основы криптографии. -- Москва: Издательство Гелиос АРВ, 2005

Приложение А

Шифр Виженера

unit TablVin;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus,hlp;

type

TForm1 = class(TForm)

PC1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

SG1: TStringGrid;

Panel1: TPanel;

SB1: TSpeedButton;

SB2: TSpeedButton;

SG2: TStringGrid;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

Edit1: TEdit;

Label1: TLabel;

REd1: TMemo;

REd2: TMemo;

SB3: TSpeedButton;

SB4: TSpeedButton;

SB5: TSpeedButton;

SB6: TSpeedButton;

SBar1: TStatusBar;

OD1: TOpenDialog;

SD1: TSaveDialog;

SB7: TSpeedButton;

MainMenu1: TMainMenu;

N2: TMenuItem;

N3: TMenuItem;

Timer1: TTimer;

SpeedButton1: TSpeedButton;

SpeedButton2: TSpeedButton;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Button1: TButton;

Button2: TButton;

N4: TMenuItem;

Label5: TLabel;

Button3: TButton;

Button4: TButton;

procedure FormCreate(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure REd1KeyPress(Sender: TObject; var Key: Char);

procedure SG2KeyPress(Sender: TObject; var Key: Char);

procedure SB1Click(Sender: TObject);

procedure SB2Click(Sender: TObject);

procedure REd2KeyPress(Sender: TObject; var Key: Char);

procedure SB7Click(Sender: TObject);

procedure SB3Click(Sender: TObject);

procedure SB5Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure SB4Click(Sender: TObject);

procedure SB6Click(Sender: TObject);

procedure LokBut(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Const

DopChr = ['a'..'z', '0'..'9'];

var Rez :TStrings; Old1, Old2 :String;

Cont :Set of Char; // Допустимые символы

Form1: TForm1;

Function Det0(Tb :TStringGrid):Boolean;

Function Invert(S :String; N :LongInt):String;

Function KeyR(Tb :TStringGrid; Zn :Char; N :Integer=0):Integer;

Function KeyS(Tb :TStringGrid; Zn :Char; N :Integer=0):Integer;

Function Znak(Tb :TStringGrid; C, R :LongInt):Char;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

Var ColL :LongInt; Lst :TStrings;

begin

Cont := [];

ColL := 0; // Ноль строк

Lst:=TStringList.Create;

Try

Lst.Clear;

IF FileExists( ExtractFilePath(ParamStr(0))+'Grid.cfg' ) Then

Lst.LoadFromFile( ExtractFilePath(ParamStr(0))+'Grid.cfg' );

ColL := Lst.Count;

Finally

SG2.RowCount := ColL;

Lst.Free;

End;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SG1.Visible:=False;

PC1.ActivePage:=TabSheet2;

IF FileExists(ExtractFilePath(ParamStr(0))+'Grid.cfg') Then

SG2.Cols[0].LoadFromFile(ExtractFilePath(ParamStr(0))+'Grid.cfg');

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Sg1.ColCount := ColL;

Sg1.RowCount := Sg1.ColCount;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

N1.Click;

IF(REd1.Lines.Count>0)OR(REd2.Lines.Count>0)Then SB7.Enabled:=True ELSE

SB7.Enabled:=False;

end;

Function Det0(Tb :TStringGrid):Boolean;

VAR R :LongInt; //Заполненость таблицы

begin

Det0:=True;

For R:=0 To Tb.RowCount-1 Do

IF Tb.Cells[0, R]='' Then

begin

Det0:=True;

ShowMessage('ЗАПОЛНИТЕ ВСЁ!'); Break;

end ELSE Det0:=False;

end;

procedure TForm1.N1Click(Sender: TObject);

Var R,I :LongInt; Ms, Sd :String;

begin

IF Det0(SG2) Then Exit;

//=============================================== Фильтр символов

Cont := [];

For I:=0 To Sg2.RowCount - 1 Do

begin

Cont := Cont + [ Znak(Sg2, 0, I) ];

end;

//===============================================

PC1.Enabled:=False;

Ms:='';

For I:=0 To Sg2.RowCount-1 Do

MS:=MS+SG2.Cells[0, I];

For R:=0 To SG1.RowCount-1 Do

begin

SG1.Rows[R].Clear;

Sd:=Invert(MS, R);

For I:=1 to Length(Sd) Do

SG1.Rows[R].Add( Sd[I] );

end;

PC1.Enabled:=True;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

IF Det0( Sg2 ) = False Then

SG2.Cols[0].SaveToFile(ExtractFilePath(ParamStr(0))+'Grid.cfg');

end;

Function Invert(S :String; N :LongInt):String;

Var S1,S2, Sum :String;

begin

IF(S='')OR(N>Length(S))Then Exit;

///////////////////////////

Try

IF N>0 Then

begin

S1:=''; S2:='';

S1:=Copy(S, 1, N);

S2:=Copy(S, N+1, Length(S)-N);

Sum:=S2+S1;

Invert:=Sum;

end ELSE

IF N<=0 Then

Begin

Invert:=S;

End;

Except

ShowMessage('ВНУТРЕНЯЯ ОШИБКА!'); Exit;

End;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

form2.showmodal;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

SG1.Visible:=Not SG1.Visible;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

PC1.ActivePage:=TabSheet1;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

PC1.ActivePage:=TabSheet2;

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

CASE Key OF

'А'..'Я',#8,#9: ;

'а'..'я', 'a'..'z': Key:=Chr(Ord(Key)-32);

'ё','Ё': Key:='Ё';

// ELSE Key:=#0;

End;

IF Not (Key in Cont) Then Key:=#0;

end;

procedure TForm1.REd1KeyPress(Sender: TObject; var Key: Char);

begin

CASE Key OF

'А'..'Я',#8,#9,#13,#10,' ': ;

'а'..'я', 'a'..'z': Key:=Chr(Ord(Key)-32);

'ё','Ё': Key:='Ё';

'0'..'9': ;

End;

end;

procedure TForm1.REd2KeyPress(Sender: TObject; var Key: Char);

begin

CASE Key OF

'А'..'Я',#8,#9,#13,#10,' ': ;

'а'..'я', 'a'..'z': Key:=Chr(Ord(Key)-32);

'ё','Ё': Key:='Ё';

'0'..'9': ;

// ELSE Key:=#0;

End;

end;

procedure TForm1.SG2KeyPress(Sender: TObject; var Key: Char);

begin

CASE Key OF

'А'..'Я',#8,#9,#13,#10,' ': ;

'а'..'я', 'a'..'z': Key:=Chr(Ord(Key)-32);

'ё','Ё': Key:='Ё';

'0'..'9': ;

// ELSE Key:=#0;

End;

end;

Function KeyR(Tb :TStringGrid; Zn :Char; N :Integer=0):Integer;

Var R :LongInt; // ОБЩЕЕ: сканер столбцов

begin // Определение номера строки ключа " 1-ый столбец "

Result:=0;

For R:=0 To Tb.RowCount-1 Do

begin

Application.ProcessMessages();

IF Tb.Cells[N, R]=Zn Then Begin Result:=R; Break; End;

end;

end;

Function KeyS(Tb :TStringGrid; Zn :Char; N :Integer=0):Integer;

Var C :LongInt; // ОБЩЕЕ: сканер строк

begin // Определение номера столбца

Result:=0;

For C:=0 To Tb.ColCount-1 Do

begin

Application.ProcessMessages();

IF Tb.Cells[C, N]=Zn Then Begin Result:=C; Break; End;

end;

end;

Function Znak(Tb :TStringGrid; C, R :LongInt):Char;

begin //

Result:=Tb.Cells[C, R][1];

end;

procedure TForm1.SB1Click(Sender: TObject);

Var I,J,K :LongInt; Key,Txt, Oyt :String; Ch :Char; A,B :Longint;

begin // ШИФРУЕТ

IF Edit1.Text='' Then Exit;

Timer1.Enabled:=False;

SB1.Enabled:=False;

SB2.Enabled:=False;

Edit1.Enabled:=False;

REd2.Enabled:=False;

REd1.Enabled:=False;

Key:=Edit1.Text;

J:=1;

REd2.Lines.Clear; //Чистка

FOR K:=0 To REd1.Lines.Count-1 Do

Begin Oyt:='';

Txt:=REd1.Lines.Strings[ K ]; //Грузим строку

For I:=1 To Length(Txt{REd1.Lines.Text})Do

begin

Application.ProcessMessages(); //

///////////////////////////////

IF {REd1.Lines.Text[I]}Txt[I] in Cont{['А'..'Я','Ё']} Then

Begin

Ch:=Key[J];

A:=KeyR(SG1, Ch, 0) ; // Ищем номер символа ключа в столбце

Ch:=Txt[I]; //REd1.text[I];

B:=KeyS(SG1, Ch, 0) ; // Ищем номер символа текста в строке

//REd2.Text:=REd2.Text+Znak(SG1, B, A);

Oyt:=Oyt+Znak(SG1, B, A);

IF J<=Length(Key)-1 Then J:=J+1 ELSE J:=1; //Перебор Ключа

End ELSE

Begin //

Ch:=Txt[ I ];

//REd2.Text:=REd2.Text+Ch;

Oyt:=Oyt+Ch;

End;

///////////////////////////////

end;

REd2.Lines.Add(Oyt);

End;

SB1.Enabled:=True;

SB2.Enabled:=True;

Edit1.Enabled:=True;

Timer1.Enabled:=True;

REd2.Enabled:=True;

REd1.Enabled:=True;

end;

procedure TForm1.SB2Click(Sender: TObject);

Var I,J,K :LongInt; Key,Txt, Oyt :String; Ch :Char; A,B :Longint;

begin // РАСШИФРОВЫВАЕМ

IF Edit1.Text='' Then Exit;

Timer1.Enabled:=False;

SB1.Enabled:=False;

Edit1.Enabled:=False;

REd2.Enabled:=False;

REd1.Enabled:=False;

REd1.Clear; //Чистим

Key:=Edit1.Text;

J:=1;

For K:=0 To REd2.Lines.Count-1 Do

Begin Oyt:='';

Txt:=REd2.Lines.Strings[K];

Application.ProcessMessages(); //

For I:=1 To Length( Txt ) DO

Begin

Application.ProcessMessages();

//////////////////////////////

IF Txt[I] IN Cont{['А'..'Я','Ё']} Then

Begin

Ch:=Key[J];

A:=KeyR(SG1, Ch, 0) ; // Ищем номер символа ключа в столбце

Ch:=Txt[I]; //REd2.text[I];

B:=KeyS(SG1, Ch, A) ; // Ищем номер символа текста в строке " Main "

//REd1.Text:=REd1.Text+Znak(SG1, B, 0);

Oyt:=Oyt+Znak(SG1, B, 0);

IF J<=Length(Key)-1 Then J:=J+1 ELSE J:=1; //Перебор Ключа

End ELSE

Begin

Ch:=Txt[ I ];

//REd1.Text:=REd1.Text+Ch;

Oyt:=Oyt+Ch;

End;

//////////////////////////////

End;

REd1.Lines.Add(Oyt);

End;

SB1.Enabled:=True;

SB2.Enabled:=True;

Edit1.Enabled:=True;

Timer1.Enabled:=True;

REd2.Enabled:=True;

REd1.Enabled:=True;

end;

procedure TForm1.SB7Click(Sender: TObject);

begin // Удалить всё

IF REd1.Lines.Count>0 Then REd1.Clear;

IF REd2.Lines.Count>0 Then REd2.Clear;

SB7.Enabled:=False; SB1.Enabled:=False;

SB2.Enabled:=False; SB4.Enabled:=False;

SB6.Enabled:=False;

SBar1.Panels[0].Text:='';

SBar1.Panels[1].Text:='';

end;

procedure TForm1.SB3Click(Sender: TObject);

begin

OD1.Title:='Открыть исходный текст ...';

IF OD1.Execute Then

Begin

SBar1.Panels[0].Text:=ExtractFileName( OD1.FileName );

Old1:=OD1.FileName;

Application.ProcessMessages(); //

Try

SD1.FileName:=Old1;

REd1.Lines.LoadFromFile( Old1 );

Except

BEEP; ShowMessage('Нет доступа к: '+Old1);

SBar1.Panels[0].Text:=''; SD1.FileName:='';

End;

OD1.FileName:='';

End;

end;

procedure TForm1.SB5Click(Sender: TObject);

begin

OD1.Title:='Открыть шифрованный текст ...';

IF OD1.Execute Then

Begin

SBar1.Panels[1].Text:=ExtractFileName( OD1.FileName );

Old2:=OD1.FileName;

Application.ProcessMessages(); //

Try

REd2.Lines.LoadFromFile( Old2 );

Except

BEEP; ShowMessage('Нет доступа к: '+Old2);

SBar1.Panels[1].Text:='';

End;

OD1.FileName:='';

End;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

SG1.Visible:=Not SG1.Visible;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

ShowMessage('Логвинов М.Ю 313ПИ Курсовая на тему:"Шифрование Вижинера" 2012');

end;

procedure TForm1.SB4Click(Sender: TObject);

Label 0;

begin

SD1.Title:='Сохранить Исходный текст как ...';

IF SBar1.Panels[0].Text='' Then

Begin

0 : IF SD1.Execute Then

begin

Old1:=SD1.FileName;

Application.ProcessMessages();

REd1.Lines.SaveToFile( Old1 );

SBar1.Panels[0].Text:=ExtractFileName( Old1 );

end;

End ELSE

IF MessageBox(Handle, PChar( 'Если хотите использовать имеющийся путь'+

#13+'"'+Old1+'"'+

#13' Нажмите " Да ".' ), 'Сохранение',

MB_YESNO+MB_ICONINFORMATION)=MrYes Then

REd1.Lines.SaveToFile(Old1) ELSE GoTo 0;

//SBar1.Panels[0].Text

SD1.FileName:='';

end;

procedure TForm1.SB6Click(Sender: TObject);

Label 1;

begin

SD1.Title:='Сохранить Зашифрованный текст как ...';

IF SBar1.Panels[1].Text='' Then

Begin

1: IF SD1.Execute Then

begin

Old2:=SD1.FileName;

Application.ProcessMessages();

REd2.Lines.SaveToFile( Old2 );

SBar1.Panels[1].Text:=ExtractFileName( Old2 );

end;

End ELSE

IF MessageBox(Handle, PChar( 'Если хотите использовать имеющийся путь'+

#13+'"'+Old2+'"'+

#13' Нажмите " Да ".' ), 'Сохранение',

MB_YESNO+MB_ICONINFORMATION)=MrYes Then

REd2.Lines.SaveToFile( Old2 ) ELSE GoTo 1;

//SBar1.Panels[0].Text

SD1.FileName:='';

end;

procedure TForm1.LokBut(Sender: TObject);

begin // Проверка текстовых полей

IF REd1.Lines.Count>0 Then

begin

SB1.Enabled:=True;

SB4.Enabled:=True;

end ELSE

IF REd1.Lines.Count<=0 Then

begin

SB1.Enabled:=False;

SB4.Enabled:=False;

end;

IF REd2.Lines.Count>0 Then

begin

SB2.Enabled:=True;

SB6.Enabled:=True;

end ELSE

IF REd2.Lines.Count<=0 Then

begin

SB2.Enabled:=False;

SB6.Enabled:=False;

end;

IF(REd1.Lines.Count>0)OR(REd2.Lines.Count>0)Then SB7.Enabled:=True ELSE

SB7.Enabled:=False;

label5.Caption:=Format('Таблица - [R=%d, C=%d]',

[SG1.RowCount, SG1.ColCount])

end;

// МЕТОДЫ ДЛЯ " STRINGGRID "

procedure DelCol(SG: TStringGrid);

Var I, J :LongInt;

begin // Удалить колонку

with SG do

begin

J := ColCount - 1;

Cols[ J ].Clear;

for I:=J to ColCount - 2 do

Cols[ I ].Assign( Cols[ I+1 ] );

ColCount := ColCount - 1;

end;

end;

procedure DelRow(SG: TStringGrid);

Var I, J :LongInt;

begin // Удалить строку

with SG do

begin

J := RowCount - 1; // Последняя строка

Rows[ J ].Clear;

for I:=J to RowCount - 2 do

Rows[I].Assign( Rows[ I+1 ] );

RowCount := RowCount - 1;

end;

end;

procedure InsRow(SG: TStringGrid);

begin // Вставка строки

With SG do

RowCount := RowCount + 1;

end;

procedure InsCol(StrGrid: TStringGrid);

begin // Вставка колонок

StrGrid.ColCount := StrGrid.ColCount + 1;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin // Добавить Строку для символов

IF SG2.RowCount<256 Then

begin

InsRow( Sg2 );

InsRow( Sg1 );

InsCol( SG1 );

end ELSE Beep;

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);

begin // Удалить Строку для символов

IF Sg2.RowCount>33 Then

Begin

DelRow( Sg2 );

DelRow( Sg1 );

DelCol( SG1 );

End ELSE Beep;

end;

end.

Приложение Б

криптографический шифрование виженер полиалфавитный

Скриншоты программы

Приложение В

Квадрат Виженера (tabula recta)

A

B

C

D

E

F

G

H

I

J

K

L

M N

O P

Q

R S

T

U V

W X

Y

Z

A

A

B

C

D

E

F

G

H

I

J

K

L

M N

O P

Q

R S

T

U V

W X

Y

Z

B

B

C

D

E

F

G

H

I

J

K

L

M N O P

Q

R

S

T

U

V W X Y

Z

A

C

C

D

E F

G

H

I

J

K

L

M N

O P

Q

R S

T

U V

W X

Y Z

A

B

D

D

E

F

G

H

I

J

K

L

M N O P

Q

R

S

T

U

V W X Y

Z

A

B

C

E

E

F

G

H

I

J

K

L

M N

O P

Q

R S

T

U

V

W X

Y Z

A

B

C

D

F

F

G

H I

J

K

L

M N O P

Q

R

S

T

U

V

W X Y

Z

A

B

C

D

E

G

G

H

I J

K

L

M N O P

Q

R

S

T

U V

W X

Y Z

A

B

C

D

E

F

H

H

I

J

K

L

M N O P

Q

R

S

T

U

V W X Y

Z

A

B

C

D

E

F

G

I

I

J

K

L

M N

O P

Q

R S

T

U

V

W X

Y

Z

A

B

C

D

E

F

G

H

J

J

K

L

M N

O P

Q

R

S

T

U

V

W X

Y

Z

A

B

C

D

E

F

G

H

I

K

K

L

M N O P

Q

R

S

T

U V

W X

Y

Z

A

B

C

D

E

F

G

H

I

J

L

L

M N

O P

Q

R

S

T

U

V W X Y

Z

A

B

C

D

E

F

G

H

I

J

K

M

M N O P

Q

R

S

T

U V W X Y Z

A

B

C

D

E

F

G

H

I

J

K

L

N

N O P

Q

R

S

T

U V W X Y

Z

A

B

C

D

E

F

G

H

I

J

K

L

M

O

O P

Q

R

S

T

U V W X

Y Z

A

B

C

D

E

F

G

H

I

J

K

L

M N

P

P

Q

R S

T

U

V W X Y

Z

A

B

C

D

E F

G

H

I

J

K

L

M N O

Q

Q

R

S

T

U V W X Y Z

A

B

C

D

E

F

G

H

I

J

K

L

M N

O P

R

R

S

T

U V W X Y Z

A

B

C

D

E F

G

H

I

J

K

L

M N O P

Q

S

S

T

U

V W X

Y Z

A

B

C

D

E

F

G

H I J

K

L

M N

O P

Q

R

T

T

U V

W X Y

Z

A

B

C

D

E

F

G

H

I J

K

L

M N O P

Q

R

S

U

U V W X Y Z

A

B

C

D

E

F

G

H I J

K

L

M N

O P

Q

R

S

T

V

V W X

Y Z

A

B

C

D

E F

G

H

I J

K

L

M N O P

Q

R

S

T

U

W

W X Y

Z

A

B

C

D

E

F

G

H

I

J

K

L

M N O P

Q

R

S

T

U V

X

X Y Z

A

B

C

D

E

F

G

H

I

J

K

L

M N O P

Q

R

S

T

U

V W

Y

Y Z

A

B

C

D

E

F

G

H I

J

K

L

M N

O P

Q

R

S

T

U

V

W X

Z

Z

A

B

C

D

E

F

G

H

I J

K

L

M N O P

Q

R

S

T

U

V

W X Y

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.