Вход

Передача звуковых файлов с шифованием через Wi-Fi.

Рекомендуемая категория для самостоятельной подготовки:
Дипломная работа*
Код 156640
Дата создания 2007
Страниц 82
Источников 12
Мы сможем обработать ваш заказ (!) 25 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
1 800руб.
КУПИТЬ

Содержание

Введение.
Глава 1. Сведения о протоколах семейства 802.11
1.1 Общие сведения о протоколах семейства 802.11.
1.2 Технические характеристики протоколов семейства 802.11.
1.2.1. Физический уровень IEEE 802.11
1.2.2. Канальный уровень IEEE 802.11
1. Соединение Ad-Hoc (точка-точка).
2. Инфраструктурное соединение.
3. Точка доступа, с использованием роутера и модема.
4. Клиентская точка.
5. Соединение мост.
Глава2. Безопасность Wi-fi сетей
2.1 Проблема безопасности Wi-fi сетей и её решение на уровне промышленных стандартов и администрирования.
2.2 Оценка статистической эффективности генераторов случайных последовательностей и криптостойкости поточных шифров на основе регистров сдвига с обратной связью.
2.2.1. Общий подход к разработке и исследованию алгоритмов шифрования
2.2.2. Анализ генераторов псевдослучайных последовательностей
2.2.3. Поточные шифры на основе РСЛОС
2.2.4. Выводы
Глава 3. Программный комплекс для передачи и приём зашифрованных данных по протоколу 802.11. Исследование беспроводных соединений на основе различных адаптеров.
3.1 Постановка конструкторской задачи и обоснование выбранных путей решения
3.2 Сценарий обмена данными.
3.3 Описание программного комплекса.
3.3.1. Описание программы – сервера.
3.3.3. Выбор технология программирования и обоснование выбора.
3.3.4. Исследование скорости передачи данных по протоколу WiFi, с использованием разных адаптеров.
3.3.5. Выводы.
3.3.6. Предложения по усовершенствования программного комплекса.
3.3.7. Усовершенствование программного комплекса.
Приложение 1. Фрагмент исходного кода программы – сервер, реализующий шифрацию и отправку пакета данных по беспроводному соединению.
Приложение 2. Фрагмент исходного кода программы – клиента, реализующего получение зашифрованного пакета из сокета и дешифрацию пакета.
Глава 4. Заключение
Глава 5. Список используемых материалов

Фрагмент работы для ознакомления

Более того, оказалось, что при данной длине ПСП, при определении состояния самого первого регистра РСЛОС–2, порог 75% оказывается слишком высоким. Поэтому был экспериментально определен порог – 60% совпадений исходной ПСП и полученной. Для определения состояния второго регистра РСЛОС–3, необходим уже порог 75%.
2.2.4. Выводы
Поточные шифры на базе РСЛОС эффективно использовать с ключами длиной 112 бит и больше, шифры с ключами размеров порядка 80 бит являются предельно допустимыми, шифры с ключами меньшего размера легко взламываются современными системами. Наиболее криптостойкими являются алгоритмы, взломать которые можно не иначе как полным перебором всех вариантов ключей («грубой силой»). В качестве известных генераторов ПСП лучше всего использовать генератор Фибоначчи.
Глава 3. Программный комплекс для передачи и приём зашифрованных данных по протоколу 802.11. Исследование беспроводных соединений на основе различных адаптеров.
3.1 Постановка конструкторской задачи и обоснование выбранных путей решения
В некоторых случаях низкоуровневой поддержки алгоритмов шифрования, встроенной в протокол беспроводного соединения, оказывается недостаточно для защиты информации, передаваемой по беспроводному соединению, в связи с этим возникает вопрос о реализации защиты передаваемой информации на прикладном уровне беспроводного соединения. Правильно выбранный алгоритм шифрования для использования на прикладном уровне беспроводного соединения позволит избежать зависимости уровня защиты данных от настроек сети беспроводного соединения.
Для защиты прикладного уровня беспроводного соединения в работе предлагается использовать считающиеся традиционно криптостойкими алгоритмы шифрования, надёжность которых зависит лишь от размера переменной части алгоритма шифрования – ключа шифрования. Для достижения приемлемой скорости работы программного комплекса были выбраны алгоритмы с симметричным ключом шифрования. Ключевой набор символов, используемый программой, хэшируется и именно хэш-значение ключевого набора символов используется в качестве ключа для алгоритма шифрования, к которому примешивается случайным образом сгенерированное т.н. солт-значение. Данный подход усложняет задачу криптоанализа, т.к. делает один и тот же ключ, передаваемый в зашифрованном пакете, случайным. Задача для криптоаналитика будет тем сложнее, чем более хорошими статистическими свойствами будет обладать генератор псевдослучайных последовательностей, который используется для генерации солт-значения (см. Гл.2). Для простоты в качестве генератора случайных значений используется встроенная в язык программирования функция случайных значений. Данный подход не является хорошим решением для реальной защиты информации, но вполне подходит для иллюстрации методов шифрации данных.
3.2 Сценарий обмена данными.
Программный комплекс поддерживает рассылку конфиденциальной информации из одного доверенного источника множеству получателей.
3.3 Описание программного комплекса.
Программный комплекс состоит из программы – сервера, которая шифрует и передаёт по беспроводной сети пакеты данных, и программы – клиента, которые получает от программы - сервера зашифрованные пакеты в асинхронно режиме.
3.3.1. Описание программы – сервера.
Программа сервер позволяет установить факт наличия в сети клиентов, готовых к принятию зашифрованных данных. Список имён компьютеров или IP адресов отображается в поле «Подключенные клиенты». Для того чтобы зашифровать и послать файл подключенным клиентам, необходимо:
Выбрать алгоритм шифрования
Выбрать алгоритм хэширования, на основе которого будет сгененрирован ключ для алгоритма шифрования
(После этого на форме отобразится эффективный размер ключа, на основании которого сожно сделать вывод о эффективности применяемого алгоритма шифрования)
Выбрать файл для шифрации и отправления по сети; для этого необходимо использовать кнопку .
Если выбран файл с расширением .wav, его можно проиграть встроенным в программу плейером.
Нажать кнопку . После этого зашифрованный пакет данных транслируется по сети всем подключенным к серверу клиентам.
Для определения порта, через который будет использоваться передача данных, необходимо использовать пункт меню «Настройка порта».
Экранная форма программы – сервера 3.3.2 Описание программы – клиента.
Чтобы подключить программу – клиента к серверу, необходимо через пункты меню «соединение», затем «настроить» определить номер порта (который должен быть таким же, как и в настройках сервера) и IP – адрес либо сетевое имя компьютера, на котором запущена программа сервер, далее установить флаг «соединение», «установить». После этого, если соединение установлено, в «Протоколе событий» появится сообщение «Установлено соединение с сервером… (имя сервера)». Если соединение по каким-либо причинам установить не удаётся, в протоколе событий появится соответствующее сообщение. После установки сессии с сервером, программа в любой момент времени готова принять пакет шифрованных данных. Если поступила первая порция данных, инициирующая приём пакета, в «Протоколе событий» появляется соответствующее сообщение «>>>Начало приёма пакета», после которого в протокол добавляется информация о размере всех принятых данных. Когда пакет получен полностью, в «Протоколе событий» появляется сообщение «>>>Пакет получен», а в списке «Зашифрованные пакеты» появляется имя полученного пакета в формате rdYYYYMMDDHHNNSS.data. Большие пакеты могут поступать несколькими порциями. Размер каждой порции может быть произволен и определяется внутренней логикой работы сокетного соединения. Для извлечения файла из пакета достаточно выделить пакет в списке «Зашифрованные пакеты», далее нажать кнопку «>>». После этого, если файл извлечён успешно, в протоколе событий появятся следующие строки: «найден ключ шифрования …», «имя файла: …», «файл … извлечён». Исходный файл пакета будет удалён, а в списке «расшифрованные файлы» появится имя извлечённого файла. Если это будет файл с расширнием .wav, его можно будет проиграть при помощи встронного аудио-плейера. Любой другой файл можно открыть двойным щелчком мыши.
Экранная форма программы - клиента
3.3.3. Выбор технология программирования и обоснование выбора.
В качестве среды разработки программного комплекса был выбран продукт фирмы Borland интегрированная среда разработки Builder C++ 5.0. Отличительной особенностью данной среды разработки является удобство визуального программирования, полная поддержка стандарта языка C++, естественно, со специфичными для фирмы Borland расширениями и библиотеками. Продукт С++ Builder является, по сути, адаптированным Delphi под стандарт языка C++, реализуя тем самым удобство интегрированной среды разработки Delphi и мощь языка C++. Важное отличие данного продукта от MS Visual С++ является большая ориентированность на удобство объектного и визуального программирования, кроме того, компиляторы фирмы Borland традиционно считаются лучшими. Тем не менее, компиляторы языка C++, независимо от фирмы-изготовителя, работаю медленнее компилятора языка Pascal, Object Pascal. Причина кроется в специфике языка – Pascal код компилируется за один проход, этим и объясняется высокая скорость компилирования. Код С++ компилируется в несколько проходов, кроме того, для получения исполняемого файла необходимо отлинковать промежуточные т.н. объектные файлы. Это своеобразная плата за гибкость и расширяемость языка.
3.3.4. Исследование скорости передачи данных по протоколу WiFi, с использованием разных адаптеров.
Безопасность данных, конечно, очень важна, но основным критерием при выборе устройств остается скорость передачи данных, и не теоретическая, а практическая. Важно знать, как она изменяется с увеличением расстояния между устройствами. Также интересно было проверить, как влияют на скорость передачи такие естественные преграды, как стены в офисе. Для тестирования пропускной способности были выбраны три беспроводных PCI-адаптера от различных производителей - D-Link DWL-G520, Belkin 1133de и ASUS WL-138G.
Основные характеристики данных устройств - в таблице.
Таблица 3.3.4.1 Основные характеристики адаптеров D-Link DWL G520 Belkin 1133de ASUS WL-138G Интерфейс PCI PCI PCI Стандарт 802.11b/g 802.11b/g 802.11b/g Максимальная скорость передачи, мбит/с 108 54 54 Кодирование WEP/WPA WEP/WPA WEP/WPA Внешняя антенна RSMA RSMA RSMA Габариты мм 119x61x4 119x44x1 119x37x2 Возможность обновления пршивок есть есть есть WiFi - сертификация есть есть нет SNR - уведомление нет есть нет
 Испытания адаптеров WLAN проводились на следующей тестовой платформе:
материнская плата Intel на чипсете i865G;
процессор Intel Pentium 4 2,8 ГГц (HT);
оперативная память 512 Мб;
системный HDD - WD 120 Гб;
операционная система MS Windows XP Pro ENG (SP2).
     Связь осуществлялась со следующей тестовой платформой:
материнская плата Dell на чипсете i865G;
процессор Intel Celeron 2,4 ГГц (HT);
оперативная память 512 Мб;
системный HDD - Seagate 40 Гб;
операционная система MS Windows XP Pro ENG (SP2).
     К этому компьютеру присоединяются следующие две точки доступа: Netgear WG302 и D-Link Airplus Xtreme G. Тестирование проводилось на обеих точках доступа для каждого адаптера. В качестве тестового программного обеспечения мы использовали Network Throughput Benchmark версии 1.23.
     Испытания проводились в трех различных ситуациях:
Оптимальный вариант (близко), когда адаптер находится на расстоянии 2,5 м от точки доступа и между ними нет никаких препятствий;
Немного усложняем задачу (средне) - расстояние примерно 13 м и препятствия в виде двух стен из гипсокартона;
Самый тяжелый вариант (далеко) - адаптер удален от точки доступа на расстояние около 23 м, при этом радиоволны должны еще пройти сквозь несколько гипсокартонных и железобетонных стен.
     Проводились измерения как на прием, так и на передачу данных. При тестировании использованы пакеты данных разного размера - от 1 до 32 Кб.
Таблица 3.3.4.2 Основные характеристики адаптеров D-Link DWL G520 Belkin 1133de ASUS WL-138G Передача/приём (близко), мб/с 3,27/3,52 3,14/2,85 2,18/2,75 Передача/приём (средний вариант), мб/с 1,72/2,29 2,33/2,69 1,77/2,06 Передача/приём (далеко), мб/с 0,05/0,05 0,21/0,16 0,53/0,62 Среднее значение, мб/с 1,81 1,88 1,61
3.3.5. Выводы.
Исследование скорости передачи по протоколу WiFi
Адаптер D-Link показал лучшую скорость на близком расстоянии. Адаптер Belkin 1133de был самым быстрым на среднем удалении от точки доступа. В первых двух ситуациях результаты, показанные устройствами, довольно существенно отличались друг от друга. Но все же с этими показателями можно комфортно работать в сети. Но вот при необходимости преодолевать железобетонную стену у адаптеров начались проблемы. В этой ситуации хорошо себя проявил ASUS WL-138G- у этого адаптера вполне приличный результат.
     Итак, что можно сказать, глядя на результаты тестирования? Технологиям для беспроводных локальных сетей есть еще куда развиваться, есть что в них дорабатывать. Пока рано говорить о глобальной замене классических кабельных локальных сетей на Wireless LAN. Но в определенных ситуациях эта технология будет очень полезна.
Выбор наиболее эффективных способов шифрации данных
Алгоритмы шифрования, используемые в программном комплексе.
Name Patents Block Size Max Key Size* Blowfish None 64 bits 448 bits Cast-128 None 64 bits 128 bits Cast-256 Patented? 128 bits 256 bits DES None 64 bits** 64 bits 3DES None 64 bits 192 bits Ice None? 64 bits 64 bits Thin Ice None? 64 bits 64 bits Ice 2 None? 64 bits 128 bits IDEA Free for non-commercial use 64 bits 128 bits MARS Patented? 128 bits 1248 bits Misty1 Free for non-commercial use 64 bits 128 bits RC2 None 64 bits 1024 bits RC4 None N/A 2048 bits RC5 Patented 64 bits 2048 bits RC6 Patented 128 bits 2048 bits Rijndael (AES) None 128 bits 256 bits Serpent None 128 bits 256 bits TEA None 64 bits 128 bits Twofish None 128 bits 256 bits
Алгоритмы хэширования, используемые в программном комплексе:

Name Patents Digest Size Haval None 128, 160, 192, 224, 256 bits* MD4 None 128 bits MD5 None 128 bits RipeMD-128 None 128 bits RipeMD-160 None 160 bits SHA-1 None 160 bits SHA-256 None 256 bits SHA-384 None 384 bits SHA-512 None 512 bits Tiger None 192 bits
Эффективность алгоритмов шифрования и хэширования напрямую связано с максимальным эффективным размером ключа, который поддерживается тем или иным алгоритмом. Поскольку, в программном комплексе используются комбинированные методы шифрования, с использованием какого – либо алгоритма шифрования и алгоритма хэширования, эффективность данного подхода определяется, во-первых, максимальным размером ключа алгоритма шифрования, во-вторых, размером дайджеста, генерируемого алгоритмом хэширования, который и используется в качестве ключа для алгоритма шифрации данных. В этом случае эффективность метода определяется значением min (эффективный размер ключа алгоритма шифрации, размер дайджеста алгоритма хэширования). Из этой формулы следует, что алгоритмы типа RC* и MARS не эффективно использовать методом, реализованным в программе, т.к. хэш – значение не будет превышать 512 бит при использовании любого алгоритма хэширования, доступного в программе. Наиболее целесообразно использовать алгоритм шифрования Rijndael (AES) с хэш-функциями SHA-256, Haval, т.к. хэш-значение данных функци совпадает с максимально эффективным размером ключа данного алгоритма шифрования. Алгоритм blowfish эффетивно использовать с хэш-функциями SHA-384, SHA-512 и т.д.
3.3.6. Предложения по усовершенствования программного комплекса.
Наиболее уязвимой частью предложенного метода является генератор псевдослучайной последовательности, в роли которого выступает встроенная в языке программирования функция случайных чисел.
Для лучшей криптостойкости, пакет целесообразно шифровать весь, вместе с размерами передаваемых секций. Также, необходимо скрыть солт – значение где – нибудь в середине пакета, что ещё более усложнит задачу криптоанализа.
Для каждого из подключённых клиентов можно использовать сеансовые ключи, которые генерируются в момент подключения клиента. Правда, при передаче ключа возникает вероятность его перехвата. Значение исходной ключевой строки является названием алгоритма хэширования + название алгоритма шифрации, что тоже является уязвимым местом. Для решения данной проблемы можно испольовать, например, периодичексое обновление ключа шифрации, инициируемое на стороне сервера. После генерации очередного ключа, с новым паролем, зашифрованный ключ рассылается всем клиентам. После получения подтверждений от всех клиентов, что ключ получен и используется, становится возможным вести рассылку зашифрованных пакетов данных с использованием нового ключа шифрования.
Кроме того, электронный документ, посланный с сервера, можно снабдить электронной подписью, удостоверяющей его подлинность, добавив к пакету значение хэшфункции, являющееся дайджестом отправляемого файла. Для проверки подлинности полученного документа достаточно применить функцию хэширования к прикреплённому файлу и сравнить результат с цифровой подписью. Если он окажется идентичным, можно почти со 100% уверенностью утверждать, что документ подлинный.
3.3.7. Усовершенствование программного комплекса.
Реализована возможность передавать цифровые подписи. Цифровая подпись представляет собой дайджест документа, т.е. двоичную последовательность размером порядка 10-20 байт, которая пересылается вместе с зашифрованным документом, в одном двоичном пакете данных. Цифровая подпись генерируется т.н. хэш-функцией, входным параметром которой является весь документ (всё содержимое файла), а выходным параметром – цифровая подпись. Цифровая подпись, прикреплённая к документу, гарантирует его целостность следующим образом. Маловероятно произвести в документе такие изменения, что бы на выходе хэш-функции получить точно такую же цифровую подпись. Для проверки цифровой подписи достаточно сравнить полученную подпись вместе с документом, с подписью, которая сгенерирована на основе полученного документа. Равенство обеих подписей будет означать некоторую гарантию того, что документ не содержит несанкционированных изменений. Использование цифровых подписей регламентируется законодательной базой РФ [18].
Для прикрепления цифровой подписи к документу используется следующий программный код:
fs = new TFileStream(boxInputFile->Text,fmOpenRead);
//создать цифровую подпись файла
DigSign = DigitSubs(fs);
Где DigitSubs – функция, производящая цифровую подпись, на основе потока:
AnsiString TMainForm::DigitSubs(TStream *inStream)
{
TDCP_hash *Hash;
char *HashDigest;
inStream->Position = 0;
Hash = (TDCP_hash*)cbxHash->Items->Objects[cbxHash->ItemIndex];
HashDigest = (char*) malloc(Hash->HashSize / 8);
Hash->Init();
Hash->UpdateStream(inStream,inStream->Size); // hash the stream contents
Hash->Final(HashDigest); // produce the digest
AnsiString s = "";
for (int i= 0;i<Hash->HashSize / 8;i++)
s = s + IntToHex(HashDigest[i],2);
return s;
}
Аргументом функции может быть поток любого типа и размера, результатом работы функции является строка, размер которой определяется используемой хэш-функцией.
При использовании цифровой подписи несколько меняется структура передаваемого пакета: во-первых, необходимо передать саму подпись, во-вторых, желательно послать размер цифровой подписи и учесть размер цифровой подписи при вычислении размера всего пакета. Т.о. первоначальный код, ответственный за передачу пакета в сокет, несколько меняется:
// Вычислить размеры посылаемых блоков
key_size = ms_Key->Size;
name_size = ms_Name->Size;
file_size = ms_File->Size;
hash_size = DigSign.Length()+1;
all_size = sizeof(all_size) +
sizeof(key_size) +
sizeof(name_size) +
sizeof(file_size) +
sizeof(hash_size)+
key_size + name_size + file_size + hash_size;
// Послать размеры
iServerSocket->Socket->Connections[i]->SendBuf(&all_size,sizeof(all_size));
iServerSocket->Socket->Connections[i]->SendBuf(&key_size,sizeof(key_size));
iServerSocket->Socket->Connections[i]->SendBuf(&name_size,sizeof(name_size));
iServerSocket->Socket->Connections[i]->SendBuf(&file_size,sizeof(file_size));
iServerSocket->Socket->Connections[i]->SendBuf(&hash_size,sizeof(hash_size));
// Послать зашифрованные потоки
iServerSocket->Socket->Connections[i]->SendStream(ms_Key);
iServerSocket->Socket->Connections[i]->SendStream(ms_Name);
iServerSocket->Socket->Connections[i]->SendStream(ms_File);
iServerSocket->Socket->Connections[i]->SendText(DigSign+'\x0');
Особое внимание следует обратить на последнюю строчку, где после строки с цифровой подписью посылается нулевой байт – обязательное условие конца строки.
В клиентской программе, для корректной распаковки зашифрованного пакета, необходимо прочитать размер цифровой подписи или сместить указатель в потоке на 4 байта. Все остальные секции извлекутся правильно, т.к. известен их размер и смещение относительно начала пакета. Для проверки правильности полученной цифровой подписи достаточно прочитать цифровую подпись из пакета, и сравнить её с дайджестом извлечённого из пакета и расшифрованного файла. Равенство этих двух строк будет означать некоторую гарантию того, что информация в пакете не была подвергнута несанкционированным изменениям во время передачи или хранения. Данная возможность программы клиента находится в разработке.
Приложение 1. Фрагмент исходного кода программы – сервер, реализующий шифрацию и отправку пакета данных по беспроводному соединению.
void __fastcall TMainForm::SendEncrFileButtonClick(TObject *Sender)
{
TFileStream *fs; // Поток для исходного файла
TMemoryStream *ms_Key, // Поток для исходного ключа
*ms_Name, // Поток для исходного имени файла
*ms_File; // Поток для зашифрованного файла
TStringStream *ss_Key, // Поток для зашифрованного ключа
*ss_Name; // Поток для зашифрованного имени
AnsiString key; // Текущий ключ
AnsiString DigSign;
// Размеры
int all_size,
key_size,
name_size,
file_size,
hash_size;
if (boxInputFile->Text == "") return;
MediaPlayer1->Close();
// Прочитать ключ
key = ((TDCP_hash*)cbxHash->Items->Objects[cbxHash->ItemIndex])->Algorithm +
((TDCP_cipher*)cbxCipher->Items->Objects[cbxCipher->ItemIndex])->Algorithm;
// для всех соединений с клиентами
for (int i=0;i<iServerSocket->Socket->ActiveConnections;i++)
{
try
{
// Создать и зашифровать потоки
// ключ
ss_Key = new TStringStream(key);
ss_Key->Position=0;
ms_Key = new TMemoryStream();
EncryptStream(ss_Key, ms_Key);
ms_Key->Position = 0;
// имя файла
ss_Name = new TStringStream(ExtractFileName(boxInputFile->Text));
ss_Name->Position = 0;
ms_Name = new TMemoryStream();
EncryptStream(ss_Name, ms_Name);
ms_Name->Position = 0;
// файл
fs = new TFileStream(boxInputFile->Text,fmOpenRead);
//создать цифровую подпись файла
DigSign = DigitSubs(fs);
fs->Position = 0;
ms_File = new TMemoryStream();
EncryptStream(fs, ms_File);
ms_File->Position = 0;
// Вычислить размеры посылаемых блоков
key_size = ms_Key->Size;
name_size = ms_Name->Size;
file_size = ms_File->Size;
hash_size = DigSign.Length()+1;
all_size = sizeof(all_size) +
sizeof(key_size) +
sizeof(name_size) +
sizeof(file_size) +
sizeof(hash_size)+
key_size + name_size + file_size + hash_size;
// Послать размеры
iServerSocket->Socket->Connections[i]->SendBuf(&all_size,sizeof(all_size));
iServerSocket->Socket->Connections[i]->SendBuf(&key_size,sizeof(key_size));
iServerSocket->Socket->Connections[i]->SendBuf(&name_size,sizeof(name_size));
iServerSocket->Socket->Connections[i]->SendBuf(&file_size,sizeof(file_size));
iServerSocket->Socket->Connections[i]->SendBuf(&hash_size,sizeof(hash_size));
// Послать зашифрованные потоки
iServerSocket->Socket->Connections[i]->SendStream(ms_Key);
iServerSocket->Socket->Connections[i]->SendStream(ms_Name);
iServerSocket->Socket->Connections[i]->SendStream(ms_File);
iServerSocket->Socket->Connections[i]->SendText(DigSign+'\x0');
}
__finally
{
delete ss_Key;
delete ss_Name;
delete fs;
}
}
}
//---------------------------------------------------------------------------
void TMainForm::EncryptStream(TStream *inStream,TStream *outStream)
{
TDCP_cipher *Cipher; // используемый шифр
char *CipherIV; // вектор инициализации (для режима цепи)
TDCP_hash *Hash; // используемый хэш
char *HashDigest; // хэшированный пароль с солт-значением
char Salt[8]; // солт-значения, усложняющие атаку
AnsiString Passphrase;
Hash = (TDCP_hash*)cbxHash->Items->Objects[cbxHash->ItemIndex];
Cipher = (TDCP_cipher*)cbxCipher->Items->Objects[cbxCipher->ItemIndex];
Passphrase = Hash->Algorithm + Cipher->Algorithm;
HashDigest = (char*) malloc(Hash->HashSize / 8);
for (int i = 0;i<8;i++)
Salt[i] = random(256); // заполнить случайными солт-значениями (для реальной защиты метод генерации случайных чисел должен быть другим)
outStream->WriteBuffer(Salt,sizeof(Salt)); // записать солт-значение, чтобы использовать его при дешифрации
Hash->Init();
Hash->Update(Salt,sizeof(Salt)); // "подсолить" хэш
Hash->UpdateStr(Passphrase); // и пароль
Hash->Final(HashDigest); // сохранить HashDigest
if (dynamic_cast<TDCP_blockcipher*>(Cipher)) // если шифр блочный, создать инициализирующий вектор
{
int Ciplen = ((TDCP_blockcipher*)Cipher)->BlockSize / 8;
CipherIV = (char*)malloc(Ciplen);
for (int i = 0; i< Ciplen;i++)
CipherIV[i] = random(256); // случайные значения для ИВ
outStream->WriteBuffer(CipherIV,Ciplen); // сохранить ИВ для возможности расшифровать
Cipher->Init(HashDigest,min(Cipher->MaxKeySize,Hash->HashSize),CipherIV); // инициализовать шифр значением хэша как ключа
((TDCP_blockcipher*)Cipher)->CipherMode = cmCBC; // использовать CBC цепь для шифрации
}
else
Cipher->Init(HashDigest,min(Cipher->MaxKeySize,Hash->HashSize),NULL); // инициализовать шифр значением хэша как ключа
Cipher->EncryptStream(inStream,outStream,inStream->Size); // зашифровать поток
Cipher->Burn(); // важно! уничтожить информацию о ключе
free(HashDigest);
free(CipherIV);
}
void __fastcall TMainForm::iServerSocketAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
ClientsMemo->Clear();
for (int i=0;i<iServerSocket->Socket->ActiveConnections;i++)
ClientsMemo->Lines->Add(iServerSocket->Socket->Connections[i]->RemoteHost); //.RemoteAddress);
}
Приложение 2. Фрагмент исходного кода программы – клиента, реализующего получение зашифрованного пакета из сокета и дешифрацию пакета.
// Получение пакета из сети
void __fastcall TmainForm::iClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int bSize,
file_size1, // размер 1-ой порции файла
real_read_bytes; // реальный прочитанный размер
if (Socket->ReceiveLength() == 0) return; // Игнорировать пакеты с нулевым размером
Socket->Lock(); // Блокируем выполнение параллельных процессов
if (receive_counter == 0)
{
Memo1->Lines->Add(">>>Начало приёма пакета:");
// Длина первого блока
bSize = Socket->ReceiveLength();
// Получить размер пакета
real_read_bytes = Socket->ReceiveBuf( &all_size, sizeof(all_size) );
Memo1->Lines->Add("Весь размер: " + IntToStr(all_size));
Memo1->Lines->Add("Размер 1-ой секции: " + IntToStr(bSize) );
// Вычислить размер блока, который относится к файлу
file_size1 = bSize - sizeof(all_size);
// Создать файл для зашифрованного пакета
fs = new TFileStream( ExtractFilePath(Application->ExeName) +
"received\\rd" + FormatDateTime("yyyymmddhhnnss", Now()) +".data" ,
fmCreate);
// Начать запись файла
char *buffer = (char*)malloc(file_size1);
real_read_bytes = real_read_bytes + Socket->ReceiveBuf(buffer, file_size1);
if (real_read_bytes < sizeof(all_size)) real_read_bytes = sizeof(all_size);//
fs->Write(buffer, real_read_bytes - sizeof(all_size));
free(buffer);
all_read_bytes = real_read_bytes;
}
else
{
bSize = Socket->ReceiveLength(); // Предполагаемый размер блока
char *buffer = (char*)malloc(bSize); // Зарезервировать место в буфере
real_read_bytes = Socket->ReceiveBuf(buffer, bSize); // прочитать в буфер
fs->Write(buffer, real_read_bytes); // записать в поток реально прочитанный объём данных
free(buffer); // освободить буфер
if (real_read_bytes>-1)
all_read_bytes = all_read_bytes + real_read_bytes;
}
receive_counter++;
Memo1->Lines->Add( "Получено " + IntToStr(all_read_bytes) );
// Если получен весь файл,
if (all_read_bytes == all_size)
{
receive_counter = 0; // обнулить счётчик
delete fs; // сохранить файл
Memo1->Lines->Add(">>> Пакет получен");
RcFileListBox->Update(); // Обновить список
}
if (all_read_bytes > all_size)
Memo1->Lines->Add("!>> Размер пакета больше ожидаемого");
Socket->Unlock(); // Разблокировать выполнение параллельных процессов
}
//---------------------------------------------------------------------------
// Функция, производящая дешифрацию потока
#define Min(a,b) ((a)<(b)?(a):(b))
void TmainForm::DecryptStream(int idxHash, int idxCipher,TStream *inStream,TStream *outStream,AnsiString Passphrase)
{
TDCP_cipher *Cipher; // используемый шифр
char *CipherIV; // вектор инициализации (для режимов цепи)
int Ciplen;
TDCP_hash *Hash; // используемый хэш
char *HashDigest; // хэшированный пароль с солт-значением
unsigned char Salt[8]; // солт-значения, усложняющие атаку
Hash = (TDCP_hash*)(slHashes->Objects[idxHash]);
Cipher = (TDCP_cipher*)(slCiphers->Objects[idxCipher]);
HashDigest = (char*) malloc(Hash->HashSize / 8);
inStream->ReadBuffer(Salt,sizeof(Salt)); // прочитать солт-значение из файла
Hash->Init();
Hash->Update(Salt,sizeof(Salt)); // хэшировать солт-значение
Hash->UpdateStr(Passphrase); // и пароль
Hash->Final(HashDigest); // сохранить хэш в HashDigest
if (dynamic_cast<TDCP_blockcipher *>(Cipher)) // если шифр блочный, создать инициализирующий вектор
{
Ciplen = ((TDCP_blockcipher*)Cipher)->BlockSize / 8;
CipherIV = (char*)malloc(Ciplen);
inStream->ReadBuffer(CipherIV,Ciplen); // прочитать инициализирующй вектор из файла
Cipher->Init(HashDigest,Min(Cipher->MaxKeySize,Hash->HashSize),CipherIV); // инициализовать шифр
((TDCP_blockcipher*)Cipher)->CipherMode = cmCBC;
}
else
Cipher->Init(HashDigest,Min(Cipher->MaxKeySize,Hash->HashSize),NULL); // инициализовать шифр
Cipher->DecryptStream(inStream,outStream,inStream->Size - inStream->Position); // расшифровать
Cipher->Burn();
free(HashDigest);
free(CipherIV);
}
// Извлечение и дешифрация пакета
void __fastcall TmainForm::DecryptButtonClick(TObject *Sender)
{
TFileStream *fs_src, // исходный файл пакета
*fs_Dest; // расшифрованный файл
TStringStream *ss_Key,
*ss_Name;
TMemoryStream *ms_Key, *ms_Name, *ms_Dest;
int Key_Size, Name_Size, File_Size, Hash_Size;
AnsiString CurrKey, DecrKey;
bool DecryptedFlag;
int idxHash, idxCipher;
int counter;
TFileName FileName;
if (RcFileListBox->Items->Count == 0) return; // Если нет ни одного файла, выходим
// 1. Открыть файл и прочитать его секции
fs_src = new TFileStream(RcFileListBox->FileName, fmOpenRead);
fs_src->Position = 0;
fs_src->ReadBuffer(&Key_Size,sizeof(Key_Size));
fs_src->ReadBuffer(&Name_Size,sizeof(Name_Size));
fs_src->ReadBuffer(&File_Size,sizeof(File_Size));
fs_src->ReadBuffer(&Hash_Size,sizeof(Hash_Size));
ms_Key = new TMemoryStream();
ms_Key->CopyFrom(fs_src, Key_Size);
counter = 0;
// Декодирование:
DecryptedFlag = false;
for (int i = 0;i < slCiphers->Count;i++)
{
for (int j = 0;j < slHashes->Count; j++)
{
CurrKey = ((TDCP_hash*)slHashes->Objects[j])->Algorithm +
((TDCP_cipher*)slCiphers->Objects[i])->Algorithm;
ss_Key = new TStringStream("");
ms_Key->Position=0;
try
{
DecryptStream(j, i, ms_Key, ss_Key, CurrKey);
}
catch (...)
{
// возможно исключение
}
ss_Key->Position=0;
DecrKey = ss_Key->ReadString(ss_Key->Size);
delete ss_Key;
if (DecrKey == CurrKey) // Ключ найден
{
idxHash = j;
idxCipher = i;
DecryptedFlag = true;
break;
}
} // for j
if (DecryptedFlag) break;
}// for i
delete ms_Key;
//2. После расшифровки ключа выполнить расшифровку основного файла
if (DecryptedFlag)
{
Memo1->Lines->Add("Найден ключ шифрования: " + DecrKey);
// Извлечь имя файла
ms_Name = new TMemoryStream();
ms_Name->CopyFrom(fs_src, Name_Size);
ss_Name = new TStringStream("");
ms_Name->Position = 0;
DecryptStream(idxHash, idxCipher, ms_Name, ss_Name, DecrKey);
delete ms_Name;
ss_Name->Position=0;
FileName = ss_Name->ReadString(Name_Size);
delete ss_Name;
Memo1->Lines->Add("Имя файла: " + FileName);
// Извлечь сам файл
ms_Dest = new TMemoryStream();
ms_Dest->CopyFrom(fs_src, File_Size);
fs_Dest = new TFileStream(ExtractFilePath(Application->ExeName)+"outfiles\\"+FileName, fmCreate);
ms_Dest->Position = 0;
DecryptStream(idxHash, idxCipher, ms_Dest, fs_Dest, DecrKey);
delete ms_Dest;
delete fs_Dest;
// Удалить зашифрованный пакет
delete fs_src;
DeleteFile(RcFileListBox->FileName);
RcFileListBox->Update();
OutFileListBox->Update();
Memo1->Lines->Add(">>> Файл "+ FileName + " извлечён");
//ShowMessage('Файл расшифровн, ключ = ' + DecrKey);
}
else
{
delete fs_src;
Memo1->Lines->Add("Неизвестный алгоритм шифрования файла");
}
}
Глава 4. Заключение
В настоящей работе были исследованы практические и теоретические аспекты беспроводных соединений, в т.ч. вопросы безопасности беспроводных соединений, использование генераторов случайных последовательностей и поточных шифров на основе регистров сдвига с обратной связью для защиты передаваемых данных. Разработано программное обеспечение, позволяющее передавать зашифрованные пакеты данных по беспроводному соединению и снабжать их цифровой подписью. С помощью данного программного обеспечения было проведено тестирование беспроводных соединений на основе различных wi-fi адаптеров.
Глава 5. Список используемых материалов
1. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. – М.: Триумф, 2002.
2. Ященко В.В. Введение в криптографию. – СПб.: Питер, 2001.
3. Хоровиц П., Хилл У. Искусство Схемотехники. – М.: Мир, 1998.
4. Biryukov A., Shamir A., Wagner D. Real Time Cryptanalisys of the Alleged A5/1 on a PC. http://cryptome.org/a5.ps
5. Нечаев В.И. Элементы Криптографии. Основы теории защиты информации. – М.: Высшая Школа, 1999.
6. J.L. Massey, “Cryptography and System Theory,” Proceedings of 24th Allerton Conference on Communication, Control, and Computers, 1 – 3 Oct 1986, pp. 1–8.
7. J.L. Massey, “Shift-Register Synthesis and BCH Decoding,” IEEE Transaction on Information Theory, v. IT-15, n. 1 , Jan 1989, pp.122–127.
8. А. Винокуров. ГОСТ не прост, а … очень прост. – М.: Монитор, №1, 1995.
9. Щербаков А.Ю., Домашев А.В. Прикладная криптография. Использование и синтез криптографических интерфейсов. – М.: Русская редакция, 2003.
10. Иванов М.А. Криптографические методы защиты информации в компьютерных сетях. – М.: КУДИЦ–ОБРАЗ, 2001.
11. Иванов М.А., Чугунков И.В. Теория, применение и оценка качества генераторов псевдослучайных последовательностей. – М. КУДИЦ–ОБРАЗ, 2003.
12. R.A. Rueppel, Analysis and Design of Stream Ciphers, Springer–Verlag, 1986.
13. T. Siegenhaler, “Correlation-Immunity of Nonlinear Combining Functions for Cryptographic Applications,” IEEE Transaction on Information Theory, v. IT-30, n.5, Sep 1984, pp.776-780.
14. K.C. Zeng, C.-H. Yang, D.-Y.Wei, and T,R.N. Rao, “Pseudorandom Bit Generators in Stream Cipher Cryptography,” IEEE Computer, v.24, n.2, Feb 1991, pp.8–17.
15. А.В. Асосков, М.А. Иванов, А.А. Мирский, А.В. Рузин, А.В. Сланин, А.Н. Тюнин. Поточные шифры. – М. КУДИЦ – ОБРАЗ, 2003.
16. Golic J.D. Cryptanalysis of Alleged A5 Stream Cipher.
http://www.informatic.uni-mannheim.de/informatik/pi4/projects/Crypto/rgp/a5/ a5-hack.htm
17.D.W. Davies and W.L. Price. Security for Computer Networks: An Introduction to Data Security in Teleprocessing and Electronic Funds Transfer. “John Wiley & Sons”, New York, 1984.
18. Закон Российской Федерации об электронной цифровой подписи.
http://www.infotecstt.ru/~vipnet/law/zakon12.htm
3
ГПК
Kc
Открытый текст
шифртекст
Передатчик
Приемник
шифртекст
ГПК
Kc
Открытый текст
Канал связи
Зашифровывание
Ek
Абонент В
(получатель)
Противник
W
Абонент А
(отправитель)
Расшифровывание
Dk
Рис 2. Объекты изучения классической криптографии
Шифрование с открытым ключом
Комбинированные шифры
Синхронные
Самосинхронизирующиеся
Поточные шифры
Перестановка (транспозиция)
Композиционные
Замена (подстановка)
Блочные шифры
Шифрование с секретным ключом
Методы шифрования
Рис. 3. Классификация современных криптоалгоритмов
1 2 3 4 ………………..……. m
Регистр сдвига (тактируемый)
XOR
Выходная
ПСП
XOR
………..
Рис. 9. Регистр сдвига с линейной обратной связью
&
b(t)
a3(t)
a2(t)
a1(t)
XOR
&
Тактирование
РСЛОС–3
РСЛОС–2
РСЛОС–1
b(t)
a3(t)
a2(t)
a1(t)
XOR
&
Тактирование
РСЛОС–3
РСЛОС–2
РСЛОС–1
Выбор
РСЛОС – 2
РСЛОС – 3
РСЛОС – 1
b(t)
2-В-1
Мультиплексор

Список литературы [ всего 12]

1. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. – М.: Триумф, 2002.
2. Ященко В.В. Введение в криптографию. – СПб.: Питер, 2001.
3. Хоровиц П., Хилл У. Искусство Схемотехники. – М.: Мир, 1998.
4. Biryukov A., Shamir A., Wagner D. Real Time Cryptanalisys of the Alleged A5/1 on a PC. http://cryptome.org/a5.ps
5. Нечаев В.И. Элементы Криптографии. Основы теории защиты информации. – М.: Высшая Школа, 1999.
6. J.L. Massey, “Cryptography and System Theory,” Proceedings of 24th Allerton Conference on Communication, Control, and Computers, 1 – 3 Oct 1986, pp. 1–8.
7. J.L. Massey, “Shift-Register Synthesis and BCH Decoding,” IEEE Transaction on Information Theory, v. IT-15, n. 1 , Jan 1989, pp.122–127.
8. А. Винокуров. ГОСТ не прост, а … очень прост. – М.: Монитор, №1, 1995.
9. Щербаков А.Ю., Домашев А.В. Прикладная криптография. Использование и синтез криптографических интерфейсов. – М.: Русская редакция, 2003.
10. Иванов М.А. Криптографические методы защиты информации в компьютерных сетях. – М.: КУДИЦ–ОБРАЗ, 2001.
11. Иванов М.А., Чугунков И.В. Теория, применение и оценка качества генераторов псевдослучайных последовательностей. – М. КУДИЦ–ОБРАЗ, 2003.
12. R.A. Rueppel, Analysis and Design of Stream Ciphers, Springer–Verlag, 1986.
13. T. Siegenhaler, “Correlation-Immunity of Nonlinear Combining Functions for Cryptographic Applications,” IEEE Transaction on Information Theory, v. IT-30, n.5, Sep 1984, pp.776-780.
14. K.C. Zeng, C.-H. Yang, D.-Y.Wei, and T,R.N. Rao, “Pseudorandom Bit Generators in Stream Cipher Cryptography,” IEEE Computer, v.24, n.2, Feb 1991, pp.8–17.
15. А.В. Асосков, М.А. Иванов, А.А. Мирский, А.В. Рузин, А.В. Сланин, А.Н. Тюнин. Поточные шифры. – М. КУДИЦ – ОБРАЗ, 2003.
16. Golic J.D. Cryptanalysis of Alleged A5 Stream Cipher.
http://www.informatic.uni-mannheim.de/informatik/pi4/projects/Crypto/rgp/a5/ a5-hack.htm
17.D.W. Davies and W.L. Price. Security for Computer Networks: An Introduction to Data Security in Teleprocessing and Electronic Funds Transfer. “John Wiley & Sons”, New York, 1984.
18. Закон Российской Федерации об электронной цифровой подписи.
http://www.infotecstt.ru/~vipnet/law/zakon12.htm
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00662
© Рефератбанк, 2002 - 2024