Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 209

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
595.39 Кб
Скачать

шифрования с открытым и закрытым ключом.

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

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

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

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

Некоторые алгоритмы шифрования с открытым ключом

(такие как RSA и DSA, но не Diffie-Hellman) могут быть использованы для создания цифровых подписей, служащих для подтверждения идентичности лица, от которого исходят данные.

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

9

закрытым ключом.

.NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с открытым ключом:

1.DSACryptoServiceProvider;

2.RSACryptoServiceProvider;

3.ECDiffieHellman (базовый класс);

4.ECDiffieHellmanCng;

5.ECDiffieHellmanCngPublicKey (базовый класс);

6.ECDiffieHellmanKeyDerivationFunction (базовый класс);

7.ECDsaCng.

RSA допускает как шифрование, так и подписывание, в

то время как DSA может использоваться только для подписывания, а Diffie-Hellman – только для генерации ключей. В целом, алгоритмы с открытым ключом имеют более ограниченную сферу применения, чем алгоритмы с закрытым ключом.

1.5. Цифровые подписи

Алгоритмы шифрования с открытым ключом могут также использоваться для создания цифровых подписей. Цифровые подписи удостоверяют подлинность источника данных (если вы доверяете открытому ключу источника) и защищают целостность данных. С помощью открытого ключа, созданного Алисой, получатель данных, отправленных Алисой, может проверить, что их источником действительно является Алиса, сравнив цифровую подпись полученных данных с открытым ключом Алисы.

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

10

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

.NET Framework предоставляет следующие классы, реализующие алгоритмы создания цифровой подписи:

1.DSACryptoServiceProvider;

2.RSACryptoServiceProvider;

3.ECDsa (базовый класс);

4.ECDsaCng.

11

2. ЦЕЛИ КУРСОВОГО ПРОЕКТИРОВАНИЯ

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

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

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

12

3. ПРИМЕР ИСПОЛЬЗОВАНИЯ АЛГОРИТМА СИММЕТРИЧНОГО ШИФРОВАНИЯ

Вследующем примере кода показано, как зашифровать

ирасшифровать данные, используя класс AesManaged:

using System; using System.IO;

using System.Security.Cryptography;

namespace Aes_Example

{

class AesExample

{

public static void Main()

{

try

{

string original = "Here is some data to encrypt!";

// Создание нового экземпляра класса

AesManaged

using (AesManaged myAes = new AesManaged())

{

// Зашифрование строки в массив байт byte[] encrypted =

EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);

// Дешифрование массива байт в строку. string roundtrip =

DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

//Отображение данных

Console.WriteLine("Original: {0}", original); Console.WriteLine("Round Trip: {0}",

roundtrip);

13

}

}

catch (Exception e)

{

Console.WriteLine("Error: {0}", e.Message);

}

}

static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)

{

// Проверка аргументов

if (plainText == null || plainText.Length <= 0) throw new ArgumentNullException("plainText");

if (Key == null || Key.Length <= 0)

throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0)

throw new ArgumentNullException("Key"); byte[] encrypted;

// Создание объекта класса AesManaged с заданным ключом и вектором инициализации

using (AesManaged aesAlg = new AesManaged())

{

aesAlg.Key = Key; aesAlg.IV = IV;

// Создание потока для зашифрования

ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

// Создание потока для зашифрования using (MemoryStream msEncrypt = new

MemoryStream())

{

using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))

14

{

using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))

{

//Запись всех данных в поток. swEncrypt.Write(plainText);

}

encrypted = msEncrypt.ToArray();

}

}

}

// Возвращение данных в качестве результата return encrypted;

}

static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)

{

// Проверка аргументов

if (cipherText == null || cipherText.Length <= 0) throw new

ArgumentNullException("cipherText");

if (Key == null || Key.Length <= 0)

throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0)

throw new ArgumentNullException("Key");

// Объявление строки для хранения расшифрованных данных

string plaintext = null;

// Создание объекта класса AesManaged с заданным ключом и вектором инициализации

15

using (AesManaged aesAlg = new AesManaged())

{

aesAlg.Key = Key; aesAlg.IV = IV;

// Create a decrytor to perform the stream

transform.

ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

// Создание потока для зашифрования using (MemoryStream msDecrypt = new

MemoryStream(cipherText))

{

using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))

{

using (StreamReader srDecrypt = new StreamReader(csDecrypt))

{

// Чтение зашифрованных данных из потока и запись их в строку

plaintext = srDecrypt.ReadToEnd();

}

}

}

}

return plaintext;

}

}

}

16

4. СОДЕРЖАНИЕ ПРОЕКТА

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

РПЗ объемом от 25 до 50 страниц содержит:

титульный лист;

задание на курсовую работу (проект);

лист «Замечания руководителя»;

содержание;

введение;

основную часть (конструкторскую, технологическую, расчетную, исследовательскую);

блок-схему разработанного программного обеспечения;

заключение;

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

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

17

5.ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ

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

Варианты исходных данных к заданию приведены в табл. 2.

 

 

Таблица 2

 

Варианты исходных данных

Вариант

Сетевое соединение

Алгоритм шифрования

 

 

 

1

Сокеты

RSA

 

 

 

2

Протокол TCP

RSA

 

 

 

3

Протокол UDP

RSA

 

 

 

4

Сокеты

AES

 

 

 

5

Протокол TCP

AES

 

 

 

6

Протокол UDP

AES

 

 

 

7

Сокеты

DES

 

 

 

8

Протокол TCP

DES

 

 

 

9

Протокол UDP

DES

 

 

 

10

Сокеты

RC2

 

 

 

11

Протокол TCP

RC2

 

 

 

12

Протокол UDP

RC2

 

 

 

13

Сокеты

Rijndael

 

 

 

14

Протокол TCP

Rijndael

 

 

 

15

Протокол UDP

Rijndael

 

 

 

16

Сокеты

TripleDES

 

 

 

17

Протокол TCP

TripleDES

 

 

 

18

Протокол UDP

TripleDES

 

 

 

18