Системи криптографічного захисту інформації

Інформація про навчальний заклад

ВУЗ:
Національний авіаційний університет
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2010
Тип роботи:
Курсова робота
Предмет:
Криптологія

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ Курсова робота з навчальної дисципліни «Прикладна криптологія» на тему «Системи криптографічного захисту інформації» Прийняв: Челишкіна О.Г. Тема курсової роботи – системи криптографічного захисту інформації Мета курсової роботи – застосування на практиці теоретичних знань з принципів побудови та використання криптографічних систем для захисту інформації в комп’ютерних мережах. Захист курсової роботи складається з демонстрації програмної частини та відповіді на запитання викладача за змістом пояснювальної записки. Програмний модуль криптографічного захисту електронних документів з використанням шифрування даних і ЕЦП для створення системи захищеної передачі інформації в комп'ютерних мережах. Програмний модуль повинен забезпечувати наступну функціональність: Симетричне шифрування даних з використанням пароля згідно варіанту (передостання цифра номеру залікової книжки); Направлене шифрування даних для певного одержувача (або декількох одержувачів) з використанням асиметричного алгоритму шифрування RSA; Контроль цілісності й правильності розшифрування зашифрованих даних згідно варіанту (остання цифра номеру залікової книжки); Формування файлу-контейнера (цифрового конверта), в якому б містилися зашифровані або підписана дані, а також інформація, необхідна для їх наступного розшифрування (перевірки) – ідентифікатори алгоритмів, параметри алгоритмів. 1. Вступ Сущность проблемы защиты информации - это постоянная борьба специалистов по защите информации с потенциальными злоумышленниками. Как известно, защита информации - это совокупность мероприятий, методов и средств, обеспечивающих: • исключение несанкционированного доступа (НСД) к информационным ресурсам, программам и данным; • проверку целостности информации; • исключение несанкционированного использования программ (защита программ от копирования). Переход на цифровые методы передачи и хранения информации позволяет применять унифицированные методы и алгоритмы для защиты дискретной (текст, факс, телекс) и непрерывной (речь) информации. Испытанный метод защиты информации от НСД - шифрование (криптография). Шифрованием (encryption) называют процесс преобразования открытых данных (plaintext) в зашифрованные (шифр-текст, ciphertext) или зашифрованных данных в открытые по определенным правилам с применением ключей. (В англоязычной литературе зашифрование/расшифрование - enciphering/deciphering.) Ведущие страны мира, например Япония, считают криптографию национальным экономическим приоритетом. Появление криптографии восходит к египетским иероглифам. С тех пор, вот уже около 4 тысяч лет, не прекращается соревнование между теми, кто придумывает все более хитроумные шифры, и теми, кто пытается разгадать их. В наш век создание шифра превратилось в сложнейшую математическую задачу, на решение которой уходят десятки лет. Математический аппарат современного шифрования по сложности превосходит математический, используемый для разработки ядерного оружия и космических систем. С помощью криптографических методов возможно: шифрование информации; реализация электронной подписи; распределение ключей шифрования; защита от случайного или умышленного изменения информации. К алгоритмам шифрования предъявляются определенные требования: • высокий уровень защиты данных против дешифрования и возможной модификации; • защищенность информации, основанная только на знании ключа и не зависящая от того, известен алгоритм или нет (правило Кирхгофа); • малое изменение исходного текста или ключа, приводящее к значительному изменению шифрованного текста (эффект «обвала»); • область значений ключа, исключающая возможность дешифрования данных путем перебора значений ключа; • экономичность реализации алгоритма при достаточном быстродействии; • стоимость деш. По характеру использования ключа известные криптосистемы можно разделить на два типа: симметричные (одноключевые, с секретным ключом) и несимметричные (с открытым ключом). В шифраторе отправителя и дешифраторе получателя используется один и тот же ключ. Шифратор образует шифртекст, который является функцией открытого текста, конкретный вид функции шифрования определяется секретным ключом. Дешифратор получателя сообщения выполняет обратное преобразование аналогичным образом. Секретный ключ хранится в тайне и передается отправителем сообщения получателя по каналу, исключающему перехват ключа криптоаналитиком противника. Обычно предполагается правило Кирхгофа: стойкость шифра определяется только секретностью ключа, т. е. криптоаналитику известны все детали процесса шифрования и дешифрования, кроме секретного ключа. Открытый текст обычно имеет произвольную длину: если его размер велик и он не может быть обработан вычислительным устройством шифратора целиком, то он разбивается на блоки фиксированной длины, и каждый блок шифруется в отдельности, независимо от его положения во входной последовательности. Такие криптосистемы называются системами блочного шифрования. На практике обычно используют два общих принципа шифрования: рассеивание и перемешивание. Рассеивание заключается в распространении влияния одного символа открытого текста на много символов шифртекста: это позволяет скрыть статистические свойства открытого текста. Развитием этого принципа является распространение влияния одного символа ключа на много символов шифрограммы, что позволяет исключить восстановление ключа по частям. Перемешивание состоит в использовании таких шифрующих преобразований, которые исключают восстановление взаимосвязи статистических свойств открытого и шифрованного текста. Распространенный способ достижения хорошего рассеивания состоит в использовании составного шифра, который может быть реализован в виде некоторой последовательности простых шифров, каждый из которых вносит небольшой вклад в значительное суммарное рассеивание и перемешивание. В качестве простых шифров чаще всего используют простые подстановки и перестановки. Известны также методы аналитического преобразования, гаммирования, а также метод комбинированного шифрования. 2.1 Алгоритм шифрування даних RC5 RC5 (Ron’s Code 5 или Rivest’s Cipher 5) — это блочный шифр, разработанный Роном Ривестом из компании RSA Security Inc. с переменным количеством раундов, длинной блока и длинной ключа. Это расширяет сферу использования и упрощает переход на более сильный вариант алгоритма. Описание Существует несколько различных вариантов алгоритма, в которых преобразования в "пол-раундах" классического RC5 несколько изменены. В классическом алгоритме используются три примитивных операции и их инверсии: сложение по модулю 2w побитовое исключающее ИЛИ (XOR) операции циклического сдвига на переменное число бит (). Основным нововведением является использование операции сдвига на переменное число бит, не использовавшиеся в более ранних алгоритмах шифрования. Эти операции одинаково быстро выполняются на большинстве процессоров, но в то же время значительно усложняют дифференциальный и линейный криптоанализ алгоритма. Шифрование по алгоритму RC5 состоит из двух этапов. Процедура расширения ключа и непосредственно шифрование. Для расшифровки выполняется сначала процедура расширения ключа, а затем операции, обратные процедуре шифрования. Параметры Т.к. алгоритм RC5 имеет переменные параметры, то для спецификации алгоритма с конкретными параметрами принято обозначение RC5-W/R/b, где W — половина длины блока в битах, возможные значения 16, 32 и 64. Для эффективной реализации величину W рекомендуют брать равным машинному слову. Например, для 32-битных платформ оптимальным будет выбор W=32, что соответствует размеру блока 64 бита. R — число раундов, возможные значения от 0 до 255. Увеличение числа раундов обеспечивает увеличение уровня безопасности шифра. Так, при R=0 информация шифроваться не будет. Также алгоритм RC5 использует таблицу расширенных ключей размера 2(R + 1) слов, которая получается из ключа заданного пользователем. b — длина ключа в байтах, возможные значения от 0 до 255. Расширение ключа Перед непосредственно шифрованием или расшифровкой данных выполняется процедура расширения ключа. Процедура генерации ключа состоит из четырех этапов: Генерация констант Разбиение ключа на слова Построение таблицы расширенных ключей Перемешивание Генерация констант Для заданного параметра W генерируются две псевдослучайные величины используя две математические константы: e (экспонента) и f (Золотое сечение).   где Odd() — это округление до ближайшего нечетного целого. Для w = 16,32,64 получатся следующие константы:       Разбиение ключа на слова На этом этапе происходит копирование ключа  в массив слов L0…Lc − 1, где . Если c не кратен W / 8, то Li дополняется нулевыми битами до ближайшего большего размера c, кратного W / 8. В случае если b = c = 0, то мы устанавливаем значение c = 1, а L0 = 0. Построение таблицы расширенных ключей На этом этапе происходит построение таблицы расширенных ключей  , которая выполняется следующим образом: S0 = Pw Si + 1 = Si + Qw Перемешивание Циклически N раз выполняются следующие действия:     причем G,H,i,j — временные переменные, начальные значения которых равны 0. Количество итераций цикла N — это максимальное из двух значений c и . Шифрование Перед первым раундом выполняются операции наложения расширенного ключа на шифруемые данные:   В каждом раунде выполняются следующие действия:   Расшифровка Для расшифровки выполняются обратные операции, т.е. в каждом раунде выполняются следующие операции:   Свойства Алгоритм RC5 обладает следующими свойствами: Пригодный как для аппаратной, так и для программной реализации (алгоритм использует операции выполняющиеся одинаково быстро на всех процессорах). Каждый раунд обрабатывает весь блок целиком (типичный раунд сети Фейстеля обрабатывает только «подблок»). Одинаково хорош для машин с разной длинной машинного слова (т.е. работает также хорошо и на 64-битных машинах). Имеет повторяющуюся структуру с переменным числом раундов, что позволяет пользователю самому выбирать между более высокой скоростью шифрования или большей защищенностью шифра. Имеет переменную длину ключа, что позволяет пользователю самому выбирать уровень безопасности соответствующий специфике его приложения. Достаточно простой в реализации и анализе. Не требователен к памяти, что позволяет использовать его даже в мобильных и переносных устройствах. 2.2 Асиметричний алгоритм шифрування даних RSA RSA (буквенная аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом. RSA стал первым алгоритмом такого типа, пригодным и для шифрования, и для цифровой подписи. Алгоритм используется в большом числе криптографических приложений. Алгоритм создания открытого и секретного ключей RSA-ключи генерируются следующим образом:[4] Выбираются два случайных простых числа p и q заданного размера (например, 1024 бита каждое). Вычисляется их произведение n = pq, которое называется модулем. Вычисляется значение функции Эйлера от числа n:  Выбирается целое число e (), взаимно простое со значением функции . Обычно в качестве e берут простые числа, содержащие небольшое количество единичных битов в двоичной записи, например, простые числа Ферма 17, 257, или 65537. Число e называется открытой экспонентой (англ. public exponent) Время, необходимое для шифрования с использованием быстрого возведения в степень, пропорционально числу единичных бит в e. Слишком малые значения e, например 3, потенциально могут ослабить безопасность схемы RSA.[5] Вычисляется число d, мультипликативно обратное к числу e по модулю , то есть число, удовлетворяющее условию:  или: , где k — некоторое целое число. Число d называется секретной экспонентой. Обычно, оно вычисляется при помощи расширенного алгоритма Евклида. Пара P = (e,n) публикуется в качестве открытого ключа RSA (англ. RSA public key). Пара S = (d,n) играет роль секретного ключа RSA (англ. RSA private key) и держится в секрете. Цифровая подпись Система RSA может использоваться не только для шифрования, но и для цифровой подписи. Предположим, что стороне  нужно отправить стороне  ответ , подтверждённый цифровой подписью.  Алгоритм: Взять открытый текст  Создать цифровую подпись  с помощью своего секретного ключа  Передать пару , состоящую из сообщения и подписи. Алгоритм: Принять пару  Взять открытый ключ  стороны  Проверить подлинность подписи:  подпись верная  Поскольку цифровая подпись обеспечивает как аутентификацию автора сообщения, так и подтверждение целостности содержимого подписанного сообщения, она служит аналогом подписи, сделанной от руки в конце рукописного документа. Важное свойство цифровой подписи заключается в том, что её может проверить каждый, кто имеет доступ к открытому ключу ее автора. Один из участников обмена сообщениями после проверки подлинности цифровой подписи может передать подписанное сообщение ещё кому-то, кто тоже в состоянии проверить эту подпись. Например, сторона  может переслать стороне  электронный чек. После того как сторона  проверит подпись стороны  на чеке, она может передать его в свой банк, служащие которого также имеют возможность проверить подпись и осуществить соответствующую денежную операцию. Заметим, что подписанное сообщение  не зашифровано. Оно пересылается в исходном виде и его содержимое не защищено. Путём совместного применения представленных выше схем шифрования и цифровой подписи в системе RSA можно создавать сообщения, которые будут и зашифрованы, и содержать цифровую подпись. Для этого автор сначала должен добавить к сообщению свою цифровую подпись, а затем — зашифровать получившуюся в результате пару (состоящую из самого сообщения и подписи к нему) с помощью открытого ключа принадлежащего получателю. Получатель расшифровывает полученное сообщение с помощью своего секретного ключа. Если проводить аналогию с пересылкой обычных бумажных документов, то этот процесс похож на то, как если бы автор документа поставил под ним свою печать, а затем положил его в бумажный конверт и запечатал, с тем чтобы конверт был распечатан только тем человеком, кому адресовано сообщение. Скорость работы алгоритма RSA Поскольку генерация ключей происходит значительно реже операций, реализующих шифрование, расшифрование, а также создание и проверку цифровой подписи, задача вычисления  представляет основную вычислительную сложность. Эта задача может быть разрешена с помощью алгоритма быстрого возведения в степень. Таким образом для вычисления  требуется  операций умножения по модулю. Доказательство  [показать] Чтобы проанализировать время выполнения операций с открытым и секретным ключами, предположим, что открытый ключ  и секретный ключ  удовлетворяют соотношениям . Тогда в процессах их применения выполняется соответственно  и  умножений по модулю. Таким образом время выполнения операций растёт с увеличением количества ненулевых битов в двоичном представлении открытой экспоненты e. Чтобы увеличить скорость шифрования, значение e часто выбирают равным 17, 257 или 65537 — простым числам, двоичное представление которых содержит лишь две единицы: 17 = 0x11, 257 = 0x101, 65537 = 0x10001 (простые числа Ферма). По эвристическим оценкам длина секретной экспоненты d, нетривиальным образом зависящей от открытой экспоненты e и модуля n, с большой вероятностью близка к длине n. Поэтому расшифрование данных идёт медленнее чем шифрование, а проверка подписи быстрее чем подписание. Алгоритм RSA намного медленнее чем DES и другие алгоритмы блочного шифрования. Программная реализация DES работает быстрее, по крайней мере, в 100 раз и от 1000 до 10 000 — в аппаратной реализации (в зависимости от конкретного устройства).[источник не указан 567 дней] Криптоанализ RSA На 2009 год система шифрования на основе RSA считается надёжной, начиная с размера  в 1024 бита. Группе учёных из Швейцарии, Японии, Франции, Нидерландов, Германии и США удалось успешно вычислить данные, зашифрованные при помощи криптографического ключа стандарта RSA длиной 768 бит.[6] По словам исследователей, после их работы в качестве надежной системы шифрования можно рассматривать только RSA-ключи длиной 1024 бита и более. Причём от шифрования ключом длиной в 1024 бит стоит отказаться в ближайшие три-четыре года. [7] Как следует из описания работы, вычисление значений ключа осуществлялось общим методом решета числового поля. На первый шаг (выбор пары полиномов степени 6 и 1) было потрачено около полугода вычислений на 80 процессорах, что составило около 3 % времени, потраченного на главный этап алгоритма (просеивание), который выполнялся на сотнях компьютеров в течение почти двух лет. Если интерполировать это время на работу одного процессора AMD Opteron 2.2ГГц с 2Гб памяти, то получилось бы порядка 1500 лет. Обработка данных после просеивания для следующего ресурсоёмкого шага (линейной алгебры) потребовалось несколько недель на малом количестве процессоров. Заключительный шаг после нахождения нетривиальных решений ОСЛУ занял не более 12 часов. Решение ОСЛУ проводилось с помощью метода Видемана на нескольких раздельных кластерах и длилось чуть менее 4 месяцев. При этом размер разреженной матрицы составил 192 796 550х192 795 550 при наличии 27 795 115 920 ненулевых элементов (то есть в среднем 144 ненулевых элементов на строку). Для хранения матрицы на жёстком диске понадобилось около 105 гигабайт. В то же время понадобилось около 5 терабайт сжатых данных для построения данной матрицы. В итоге группе удалось вычислить 232-цифровой ключ, открывающий доступ к зашифрованным данным. Исследователи уверены, что используя их метод факторизации, взломать 1024-битный RSA-ключ будет возможно в течение следующей декады. Зная разложение модуля  на произведение двух простых чисел, противник может легко найти секретную экспоненту  и тем самым взломать RSA. Однако на сегодняшний день самый быстрый алгоритм факторизации — решето обобщённого числового поля (General Number Field Sieve), скорость которого для k-битного целого числа составляет  для некоторого , не позволяет разложить большое целое за приемлемое время. Будем рассматривать возможные атаки на RSA, которые позволяют взломать эту систему, не используя прямого разложения модуля n на произведение двух простых чисел. 2.3 Контроль цілісності за використанням алгоритму MD5  MD5 (англ. Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом изМассачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или «дайджестов» сообщений произвольной длины. Является улучшенной в плане безопасности версией MD4.[1] Зная MD5-образ (называемый также MD5-хеш или MD5-дайджест), невозможно восстановить входное сообщение, так как одному MD5-образу могут соответствовать разные сообщения. Используется для проверки подлинности опубликованных сообщений путём сравнения дайджеста сообщения с опубликованным. Эту операцию называют «проверка хеша» (hashcheck). Описан в RFC 1321. MD5 — один из серии алгоритмов по построению дайджеста сообщения, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института. Разработан в 1991 году, как более надёжный вариант предыдущего алгоритма MD4.[1] Позже Гансом Доббертином были найдены недостатки алгоритма MD4. В 1993 году Берт ден Боер (Bert den Boer) и Антон Босселарис (Antoon Bosselaers) показали, что в алгоритме возможны псевдоколлизии, когда разным инициализирующим векторам соответствуют одинаковые дайджесты для входного сообщения. В 1996 году Ганс Доббертин (Hans Dobbertin) объявил о коллизии в алгоритме и уже в то время было предложено использовать другие алгоритмы хеширования, такие как Whirlpool, SHA-1 или RIPEMD-160. Из-за небольшого размера хеша в 128 бит, можно рассматривать birthday атаки. В марте 2004 года был запущен проект MD5CRK с целью обнаружения уязвимостей алгоритма, используя birthday атаки. Проект MD5CRK закончился после 17 августа 2004, когда Ван Сяоюнь (Wang Xiaoyun), Фен Дэнгуо (Feng Dengguo), Лай Сюэцзя (Lai Xuejia) и Юй Хунбо (Yu Hongbo) обнаружили уязвимости в алгоритме. 1 марта 2005, Arjen Lenstra, Xiaoyun Wang, и Benne de Weger продемонстрировали построение двух X.509 документов с различными открытыми ключами и одинаковым хешем MD5. 18 марта 2006 исследователь Властимил Клима (Vlastimil Klima) опубликовал алгоритм, который может найти коллизии за одну минуту на обычном компьютере, метод получил название «туннелирование». Алгоритм MD5 На вход алгоритма поступает входной поток данных, хеш которого необходимо найти. Длина сообщения может быть любой (в том числе нулевой). Запишем длину сообщения в L. Это число целое и неотрицательное. Кратность каким-либо числам необязательна. После поступления данных идёт процесс подготовки потока к вычислениям. Ниже приведены 5 шагов алгоритма: Шаг 1. Выравнивание потока Сначала дописывают единичный бит в конец потока(байт 0x80), затем необходимое число нулевых бит. Входные данные выравниваются так, чтобы их новый размер L' был сравним с 448 по модулю 512 (L’ = 512 × N + 448). Выравнивание происходит, даже если длина уже сравнима с 448. Шаг 2. Добавление длины сообщения В оставшиеся 64 бита дописывают 64-битное представление длины данных (количество бит в сообщении) до выравнивания. Сначала записывают младшие 4 байта. Если длина превосходит 264 − 1, то дописывают только младшие биты. После этого длина потока станет кратной 512. Вычисления будут основываться на представлении этого потока данных в виде массива слов по 512 бит. Шаг 3. Инициализация буфера Для вычислений инициализируются 4 переменных размером по 32 бита и задаются начальные значения шестнадцатеричными числами (шестнадцатеричное представление, сначала младший байт):  Как работает MD5 Теперь посмотрим, как именно работает MD5. Для обработки MD5 получает некоторую строку. Эта строка преобразуется в последовательность из нулей и единиц. Как это делается? У каждого символа есть свой номер. Эти номера можно записать в двоичной системе счисления. Получается, каждый символ можно записать как последовательность нулей и единиц. Если этим воспользоваться, получим из строки последовательность из нулей и единиц. Пусть q будет длина получившейся последовательности (ровно 64 бита, возможно, с незначащими нулями). К получившейся последовательности приписывается 1. В результате длина последовательности увеличивается на 1. Затем к последовательности приписываются нули, пока длина не станет по модулю 512 равна 448 (length mod 512=448). Далее к последовательности дописываются младшие 32 бита числа q, а затем — старшие. Длина последовательности становится кратной 512. Полученную последовательность назовем S. Для подсчета результата используются четыре двойных слова (32 бита). Эти двойные слова инициализируются следующими шестнадцатеричными значениями, где первым следует самый младший байт: A: 01 23 45 67 B: 89 ab cd ef C: fe dc ba 98 D: 76 54 32 10 Также для подсчета результата используются следующие функции: F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z)) X,Y,Z — это двойные слова. Результаты функций, также двойные слова. Для подсчета используется еще одна функция (назовем ее W). Она хитро обрабатывает данные и возвращает результат (подробно ее описывать не буду, т.к. она выполняет серию простых преобразований). Обработка данных происходит с использованием функций F, G, H, I.   На рисунке схематически изображена функция. Слева — входные данные, справа — выходные.  Все необходимые функции и обозначения рассмотрены. Теперь рассмотрим, как происходит просчет результата: 1. Запоминаем первые 512 бит последовательности S. 2. Удаляем первые 512 бит последовательности S (можно обойтись и без удаления, но тогда на первом шаге надо брать не первые 512, а следующие 512 бит). 3. Вызываем функцию W. Параметры A,B,C,D — это текущие значения соответствующих двойных слов. Параметр T — это запомненные 512 бит.  4. Прибавляем к A A0. 5. B=B+B0. 6. C=C+C0. 7. D=D+D0. 8. Если длина последовательности 0, выходим. 9. Переходим к шагу 1. После выполнения этого алгоритма A,B,C,D — это результат (его длина будет 128 бит). Часто можно видеть результат MD5 как последовательность из 32 символов 0..f. Это то же самое, только результат записан не в двоичной системе счисления, а в шестнадцатеричной. Взлом MD5 В Интернете можно найти много программ, которые обещают найти строку, для которой алгоритм MD5 выдаст заданный результат. Эти программы действительно работают. Ранее отмечалось, что восстановить параметр невозможно. Как же работают эти программы? Они перебирают все возможные строки, применяют к ним алгоритм MD5, а затем сравнивают с образцом. Если значения совпали, это означает, что программа нашла необходимую строку. Но у этих программ есть маленький недостаток. Предположим, известно, что программе придется перебрать все слова длиной в 8 символов, состоящих из маленьких и больших латинских букв. Сколько времени это займет? Сколько всего таких слов? На первом месте может стоять любой из 26*2=52 символов. На 2, 3, 4, 5, 6, 7 и 8 — тоже 52. Значит, всего таких слов будет: 52*52*52*52*52*52*52*52=528=53*1012. А если используются не только латинские буквы? То это еще больше. Перебор всех вариантов на обычном персональном компьютере займет очень много времени. В Интернете можно найти сайты, которые по введенному хэшу выдают строку, для которой будет точно такой же хэш. Эти сайты используют базу данных с заранее просчитанными хэшами. Но в базах хранятся не все хэшы, а только самые используемые. Вот один из таких сайтов: сайт Так что советую использовать в качестве пароля абсолютно случайную последовательность символов. 3. Практична частина using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Security.Cryptography; namespace WindowsFormsApplication1 { publicpartialclassForm1 : Form { public Form1() { InitializeComponent(); } privatevoidRC5HMACMD5ToolStripMenuItem_Click(object sender, EventArgs e) { try { //выводформывводаключа Form2 form = newForm2(); form.ShowDialog(); //текст переводим в массив данных byte[] message_data = ASCIIEncoding.ASCII.GetBytes(Text.Text.ToString()); //создаемкриптопровайдерRC5 RC5CryptoServiceProviderRC5 = newRC5CryptoServiceProvider(); //установкаключаивекторашифрования RC5.Key = ASCIIEncoding.ASCII.GetBytes(form.ReturnKey()); RC5.IV = newbyte[] { 23, 10, 99, 73, 44, 69, 35, 80 }; //шифрованиеRC5 byte[] encrypted_data = RC5.CreateEncryptor().TransformFinalBlock(message_data, 0, message_data.Length); log.Items.Add("Encrypt_data " + Convert.ToBase64String(encrypted_data)); //вычисление HMAC-SHA1 с ключемKey от открытого текста; HMACMD5HMACMD5 = newHMACMD5(ASCIIEncoding.ASCII.GetBytes(form.ReturnKey())); byte[] hash_message = HMACMD5.ComputeHash(message_data); log.Items.Add("Шифрование RC5 + MD5"); log.Items.Add("MD5: " + Convert.ToBase64String(hash_message)); //создаём массив данных для последующий записи в файл byte[] file_data = newbyte[encrypted_data.Length + hash_message.Length]; //добавляем сигнатуру //file_data[]={}; //вносим зашифрованные данные for (int i = 0; i < encrypted_data.Length; i++) { file_data[i] = encrypted_data[i]; } //последние 20 байтхеш for (int i = 0; i < hash_message.Length; i++) { file_data[i + encrypted_data.Length] = hash_message[i]; } //выводимзашифрованныйтекст Text.Text = Convert.ToBase64String(file_data); //сохраняемвфайл if (saveFileDialog1.ShowDialog() == DialogResult.OK) { FileStream fs = newFileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.Write); fs.Write(file_data, 0, file_data.Length); fs.Dispose(); log.Items.Add("Save to File: " + saveFileDialog1.FileName); } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } } privatevoidRC5HMACMD5ToolStripMenuItem1_Click(object sender, EventArgs e) { try { log.Items.Add("Дешифрование RC5 + MD5"); //открываемфайл if (openFileDialog1.ShowDialog() == DialogResult.OK) { //выводформывводаключа Form2 form = newForm2(); form.ShowDialog(); //текстпереводимвмассивданных byte[] message_data = ASCIIEncoding.ASCII.GetBytes(Text.Text.ToString()); //создаемкриптопровайдерRC5 RC5CryptoServiceProviderRC5 = newRC5CryptoServiceProvider(); //установка ключа и вектора шифрования RC5.Key = ASCIIEncoding.ASCII.GetBytes(form.ReturnKey()); RC5.IV = newbyte[] { 23, 10, 99, 73, 44, 69, 35, 80 }; //данные для чтения файлов FileStream fs = newFileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read); byte[] file_data = newbyte[fs.Length]; int numBytesToRead = (int)fs.Length; int numBytesRead = 0; while (numBytesToRead > 0) { int n = fs.Read(file_data, numBytesRead, numBytesToRead); if (n == 0) break; numBytesRead += n; numBytesToRead -= n; } numBytesToRead = file_data.Length; log.Items.Add("Open file: " + openFileDialog1.FileName); fs.Dispose(); byte[] encrypted_data = newbyte[numBytesToRead-20]; byte[] hash_message = newbyte [20]; for (int i = 0; i < numBytesToRead - 20; i++) { encrypted_data[i] = file_data[i]; } for (int i = 0; i < 20; i++) { hash_message[i] = file_data[i + encrypted_data.Length]; } log.Items.Add("MD5: " + Convert.ToBase64String(hash_message)); byte[] decrypted_data = RC5.CreateDecryptor().TransformFinalBlock(encrypted_data, 0, encrypted_data.Length); Text.Text = ASCIIEncoding.ASCII.GetString(decrypted_data); HMACMD5HMACMD5 = newHMACMD5(ASCIIEncoding.ASCII.GetBytes(form.ReturnKey())); byte[] hash_message2 = HMACMD5.ComputeHash(decrypted_data); if (hash_message.Length == hash_message2.Length) { for (int i = 0; i < hash_message.Length; i++) { if (hash_message[i] != hash_message2[i]) { MessageBox.Show("ФАЙЛ БЫЛ ИЗМЕНЕН!!!!"); break; } } } else { MessageBox.Show("ФАЙЛ БЫЛ ИЗМЕНЕН!!!!"); } } } catch (Exceptionex) { MessageBox.Show("Error: " + ex.Message); } } privatevoidвыходToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } privatevoid rSAToolStripMenuItem_Click(object sender, EventArgs e) { Form3 form = newForm3(); form.ShowDialog(); BigInteger n, E; n = newBigInteger(form.ReturnN(), 10); E = newBigInteger(form.ReturnKey(), 10); byte[] data = newUTF8Encoding().GetBytes(Text.Text.ToString()); BigInteger msg = newBigInteger(data); msg = msg.modPow(E, n); Text.Text = msg.ToString(); } privatevoid rSAToolStripMenuItem1_Click(object sender, EventArgs e) { Form3 form = newForm3(); form.ShowDialog(); BigInteger n, d; n = newBigInteger(form.ReturnN(), 10); d = newBigInteger(form.ReturnKey(), 10); BigInteger msg = newBigInteger(Text.Text.ToString(), 10); msg = msg.modPow(d, n); Text.Text = newUTF8Encoding().GetString(msg.getBytes()); } privatevoidrSAГенерироватьКлючиToolStripMenuItem_Click(object sender, EventArgs e) { BigInteger P, Q, fi, n, E, d; int length = 128; Random rand = newRandom(); do { P = BigInteger.genPseudoPrime(length, 5, rand); Q = BigInteger.genPseudoPrime(length, 5, rand); } while (P == Q); n = P * Q; fi = (P - 1) * (Q - 1); E = fi.genCoPrime(length, rand); d = E.modInverse(fi); Text.Text = ("N: " + n.ToString()); Text.Text += Environment.NewLine; Text.Text += ("Public: " + E.ToString()); Text.Text += Environment.NewLine; Text.Text += ("Private: " + d.ToString()); log.Items.Add("Генерируемключи RSA"); } } }      Выводы: Полученный мною программный модуль реализует все поставленные задачи с файлами неограниченного размера (или ограниченного возможностью файловой системы) и произвольного формата с достаточно высокой производительностью, не перегружая при этом систему. Были реализованы следующие функции: Шифрование и расшифрование с помощью алгоритма RC5. Ассиметрическое шифрование, расшифрование, цифровую подпись, верификацию подписи, а так же генерацию ключей с использованием алгоритма RSA и произвольной длиной ключа (128/256/512/1024/2048 бит) Проверку целостности данных с использованием алгоритма MD5. Создание и проверку цифрового конверта с помощью вышеуказанных алгоритмов ЛИТЕРАТУРА http://ru.wikipedia.org Венбо Мао «Современная криптография. Теория и практика» Брюс Шнайер Протоколы, алгоритмы и исходные тексты на языке С С.А. Кулешов «Введение в теорию чисел Алгоритм RSA» 4. Ж.Брассар «Современная криптография»
Антиботан аватар за замовчуванням

08.02.2013 00:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!