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

Методические указания по дисциплине Информационная безопасность

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
764 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования

Московский технический университет связи и информатики

Кафедра информационные технологии в экономике и управлении

Методические указания по дисциплине

ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ

Для 4 курса специальность 080502

Москва 2013

План УМД на 2013/14 уч.г.

Методические указания по дисциплине

ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ

Составитель А.Г.Ерохин, к.т.н., доцент

Издание утверждено советом ФЭУ. Протокол № 8 от 16.05.2013г.

Рецензент А.С.Ворожцов, к.т.н., профессор

2

Использование симметричного шифрования в Visual Studio .Net

Для реализации алгоритмов симметричного шифрования в Visual Studio .Net применяется пространство имен

System.Security.Cryptography,

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

DES – реализован объектом DESCryptoServiceProvider;

TrippleDes – реализован объектом TripleDESCryptoServiceProvider;

RC2 – реализован объектом RC2CryptoServiceProvider;

Rijndael – реализован объектом RijndaelManaged.

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

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

Основные свойства объектов симметричного шифрования:

Key – устанавливает свойства секретного ключа;

IV – устанавливает свойства вектора инициализации;

KeySize – возвращает размер секретного ключа в битах.

Первые два свойства являются объектами и, в свою очередь, имеют свойство Length, возвращающее длину ключа. Можно также обратиться к любому биту ключа:

key, 0

……………

Key,key.Length

Пример 1. Создать новый ключ для шифрования по алгоритму DES и сохранить его в файле «key1.bin»:

Visual Basic .Net:

Dim DES As New DESCryptoServiceProvider

Dim fs As New FileStream("C:\key1.bin", FileMode.OpenOrCreate) fs.Write(DES.Key, 0, DES.Key.Length)

fs.Close()

Visual C#:1

DESCryptoServiceProvider DES=new DESCryptoServiceProvider(); FileStream fs = new FileStream("C:\\key1.bin", FileMode.OpenOrCreate); fs.Write(DES.Key, 0, DES.Key.Length);

fs.Close();

1 В качестве разделителей для имен файлов в Visual Basic .Net используется обычный обратный слеш, т.е. имена файлов указываются обычным образом так же, как для Windows и MS DOS. В Visual C# в качестве разделителей для имен файлов используется двойной обратный слеш.

3

Переменную DES (имя может быть любым), лучше всего объявлять как переменную уровня формы, чтобы гарантировать, что один и тот же ключ будет использован во всѐ время работы программы:

Visual Basic .Net:

Private DES As New DESCryptoServiceProvider

Visual C#:

private DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

Пример 2. Прочитать информацию о ключе, содержащуюся в файле

«key1.bin»:

Visual Basic .Net:

Dim fs As New FileStream("C:\key1.bin", FileMode.Open) Dim key() As Byte

ReDim key(DES.Key.Length - 1) fs.Read(key, 0, key.Length) DES.Key = key

fs.Close()

Visual C#:

FileStream fs = new FileStream("C:\\key1.bin", FileMode.Open); byte[] key = new byte[DES.Key.Length];

fs.Read(key, 0, key.Length); DES.Key = key;

fs.Close();

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

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

StreamReader и StreamWriter, а не BinaryReader и BinaryWriter.

Файл для шифрования можно подготовить в блокноте (в кодировках Юникод, Юникод Big Endian и UTF-8).

При шифровании файл открывается и для него создается оболочка CryptoStream, которая использует объект шифрования (encryptor), создаваемый с помощью метода CreateEncryptor. Объект StreamWriter играет роль оболочки для CryptoStream, представляя лѐгкий способ преобразования строковых данных в последовательность байт. Вектор инициализации записывается в файл без шифрования. После записи зашифрованного текста необходимо очистить буфер памяти объекта StreamWriter с помощью метода Flush. Поскольку объект CryptoStream шифрует данные по одному блоку за раз, в конце всей операции необходимо дополнить заключительный частичный блок

4

нулями и записать его в файл с помощью метода FlushFinalBlock объекта

CryptoStream.

Пример 3. Пусть некоторый текст записан в файле с именем «Пример1.txt». Необходимо прочитать информацию из этого файла и зашифровать еѐ с помощью алгоритма DES на основе созданного ранее ключа. Записанную информацию сохранить в файле с именем «Шифр примера 1.txt».

Visual Basic .Net:

Создание интерфейса преобразования для шифрования по алгоритму DES Dim transform As ICryptoTransform = DES.CreateEncryptor

Dim text As String

Открытие исходного файла и чтение из него информации в переменную text Dim fs As New FileStream("C:\Пример1.txt", FileMode.OpenOrCreate) Dim fr As New StreamReader(fs)

Dim fw As New StreamWriter(fs) text = fr.ReadToEnd() fr.Close()

fs.Close()

Открытие файла с зашифрованной информацией

Dim fs1 As New FileStream("C:\Шифр примера 1.txt",

FileMode.OpenOrCreate)

Запись случайного вектора инициализации без его шифрования fs1.Write(DES.IV, 0, DES.IV.Length)

Создание криптографического потока в режиме записи

Dim cs As New CryptoStream(fs1, transform, CryptoStreamMode.Write)

Создание объекта записи текста, который будет преобразовывать текст в

двоичные данные

Dim fw1 As New StreamWriter(cs)

Запись зашифрованной информации и очистка буфера памяти fw1.Write(text)

fw1.Flush()

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

блок нулями и записать его в файл

cs.FlushFinalBlock()

’ Закрытие файла с зашифрованной информацией fw1.Close()

fs1.Close()

Visual C#:

//Создание интерфейса преобразования для шифрования по алгоритму DES ICryptoTransform transform = DES.CreateEncryptor();

string text;

//Открытие исходного файла и чтение из него информации в переменную text FileStream fs = new FileStream("C:\\Пример1.txt",

FileMode.OpenOrCreate);

StreamReader fr=new StreamReader(fs); StreamWriter fw = new StreamWriter(fs); text = fr.ReadToEnd();

fr.Close();

fs.Close();

// Открытие файла с зашифрованной информацией

5

FileStream fs1 = new FileStream("C:\\Шифр примера 1.txt", FileMode.OpenOrCreate);

//Запись случайного вектора инициализации без его шифрования fs1.Write(DES.IV, 0, DES.IV.Length);

//Создание криптографического потока в режиме записи

CryptoStream cs = new CryptoStream(fs1, transform,

CryptoStreamMode.Write);

//Создание объекта записи текста, который будет преобразовывать текст в

//двоичные данные

StreamWriter fw1 = new StreamWriter(cs);

//Запись зашифрованной информации и очистка буфера памяти fw1.Write(text);

fw1.Flush();

//В конце операции шифрования необходимо дополнить заключительный частичный

//блок нулями и записать его в файл

cs.FlushFinalBlock();

// Закрытие файла с зашифрованной информацией fw1.Close();

fs1.Close();

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

Пример 4. Просмотреть зашифрованную информацию, содержащуюся в файле «Шифр примера 1.txt», и отобразить еѐ в элементе RichTextBox:

Visual Basic .Net:

’ Открытие файла для чтения

Dim fs1 As New FileStream("C:\Шифр примера 1.txt", FileMode.Open)

Пропуск вектора инициализации fs1.Seek(DES.IV.Length, SeekOrigin.Begin)

Чтение зашифрованного текста

Dim sr As New StreamReader(fs1) RichTextBox1.Text = sr.ReadToEnd() sr.Close()

fs1.Close()

Visual C#:

// Открытие файла для чтения

FileStream fs1 = new FileStream("C:\\Шифр примера 1.txt", FileMode.Open);

//Пропуск вектора инициализации fs1.Seek(DES.IV.Length, SeekOrigin.Begin);

//Чтение зашифрованного текста

StreamReader sr = new StreamReader(fs1); richTextBox1.Text = sr.ReadToEnd(); sr.Close();

fs1.Close();

Процесс дешифровки является отражением процесса шифрования. Различие заключается в том, что оболочка CryptoStream использует объект

6

дешифрования, создаваемый с помощью метода CreateDecryptor, и работает в режиме чтения, а не записи.

Пример 5. Расшифровать информацию из файла «Шифр примера 1.txt» и отобразить еѐ в элементе RichTextBox.

Visual Basic .Net:

’ Открытие файла для чтения

Dim fs1 As New FileStream("C:\Шифр примера 1.txt", FileMode.Open)

Чтение вектора инициализации

Dim iv As Byte()

ReDim iv(DES.IV.Length - 1) fs1.Read(iv, 0, iv.Length) DES.IV = iv

Создание интерфейса преобразования для дешифрования по алгоритму DES Dim transform As ICryptoTransform = DES.CreateDecryptor

Создание криптографического потока в режиме записи. Этот поток будет

декодировать двоичные данные сразу после их чтения из файла

Dim cs As New CryptoStream(fs1, transform, CryptoStreamMode.Read)

Создание объекта чтения текста. Он будет преобразовывать дешифрованные

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

Dim fr1 As New StreamReader(cs)

’ Чтение зашифрованных данных и их отображение на форме

RichTextBox2.Text = fr1.ReadToEnd() fr1.Close()

fs1.Close()

Visual C#:

// Открытие файла для чтения

FileStream fs1 = new FileStream("C:\\Шифр примера 1.txt", FileMode.Open);

// Чтение вектора инициализации

Byte[] iv=new byte[DES.IV.Length]; fs1.Read(iv,0,iv.Length);

DES.IV = iv;

//Создание интерфейса преобразования для дешифрования по алгоритму DES ICryptoTransform transform = DES.CreateDecryptor();

//Создание криптографического потока в режиме записи. Этот поток будет

//декодировать двоичные данные сразу после их чтения из файла

CryptoStream cs = new CryptoStream(fs1, transform, CryptoStreamMode.Read);

//Создание объекта чтения из текста. Он будет преобразовывать дешифрованные

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

StreamReader fr1 = new StreamReader(cs);

// Чтение зашифрованных данных и их отображение на форме richTextBox2.Text = fr1.ReadToEnd(); fr1.Close();

fs1.Close();

Шифровать можно не только информацию из текстовых файлов блокнота, а вообще любой текст, введенный, в частности, в элементы TextBox или RichTextBox, и вообще значения любых текстовых переменных.

7

Использование асимметричной (двухключевой) системы шифрования в

Visual Studio .Net

В Visual Studio .Net возможно использование алгоритма RSA для реализации асимметричного шифрования данных. Для этого используется класс

RSACryptoserviceProvider из пространства имѐн

System.Security.Cryptography.

При создании данного класса автоматически генерируется пара ключей, которые можно использовать в своѐм проекте, сохранять в бинарных файлах или в контейнерах ключей для последующего использования. Данный класс поддерживает ключи шифрования размером от 384 до 16384 бита с увеличением по 8 бит. По умолчанию длина ключа равна 1024 бита, другая длина ключа указывается при его инициализации:

Visual Basic .Net:

Dim RSA As New RSACryptoServiceProvider(длина ключа)

Visual C#:

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(длина ключа)

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

Основные методы класса асимметричного шифрования:

ToXmlString – создаѐт и возвращает строку XML, содержащую ключ текущего объекта RSA, в качестве аргумента используется логическое значение TRUE, если передаются данные об открытом и секретном ключах,

иFALSE, если передаются данные только об открытом ключе;

FromXmlString получает данные о ключе RSA из строки XML (при этом автоматически определяется, для какого ключа – открытого или секретного, получаются данные, в зависимости от того, с каким аргументом (TRUE или FALSE) данная строка была создана методом ToXmlString);

ExportParameters – создаѐт и возвращает структуру RSAParameters, с

помощью которой можно получить данные о ключах (числа e, d, n и другие, которые являются полями данной структуры). В качестве аргумента также используется логическое значение TRUE, если передаются данные об открытом и секретном ключах и FALSE – если только об открытом ключе. Эти данные можно просмотреть, в зависимости от аргумента (TRUE – все поля данной структуры, FALSE – только те поля, которые относятся к открытому ключу);

ImportParameters – получает данные о ключе RSA из структуры RSAParameters (при этом также автоматически определяется, для какого ключа получаются данные, в зависимости от того, с каким аргументом метода ExportParameters была создана данная структура);

Encrypt – шифрует данные по алгоритму RSA;

Decrypt – расшифровывает данные по алгоритму RSA.

8

Пример 1. Создать новую пару ключей RSA длиной 512 бит и сохранить в одном файле открытый и секретный ключ, а в другом – только открытый ключ:

Visual Basic .Net:

Dim RSA As New RSACryptoServiceProvider(512)

' Записать в файл информацию об открытом и секретном ключах

Dim fs As New FileStream("C:\key1.bin", FileMode.OpenOrCreate) Dim w As New StreamWriter(fs)

w.Write(RSA.ToXmlString(True))

'Очистка буфера памяти w.Flush() fs.Close()

'Записать в другой файл информацию об открытом ключе

fs = New FileStream("C:\key2.bin", FileMode.OpenOrCreate) w = New StreamWriter(fs)

w.Write(RSA.ToXmlString(False))

' Очистка буфера памяти w.Flush() fs.Close()

Visual C#:

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(512);

// Записать в файл информацию об открытом и секретном ключах

FileStream fs = new FileStream("C:\\key1.bin", FileMode.OpenOrCreate); StreamWriter w = new StreamWriter(fs);

w.Write(RSA.ToXmlString(true));

//Очистка буфера памяти w.Flush(); fs.Close();

//Записать в другой файл информацию об открытом ключе

fs = new FileStream("C:\\key2.bin", FileMode.OpenOrCreate); w = new StreamWriter(fs);

w.Write(RSA.ToXmlString(false));

// Очистка буфера памяти w.Flush(); fs.Close();

Пример 2. Получить информацию об открытом ключе из файла, в котором он был сохранѐн:

Visual Basic .Net:

Dim fs As New FileStream("C:\key2.bin", FileMode.Open) Dim r As New StreamReader(fs) RSA.FromXmlString(r.ReadToEnd())

fs.Close()

Visual C#:

FileStream fs = new FileStream("C:\\key2.bin", FileMode.Open); StreamReader r = new StreamReader(fs); RSA.FromXmlString(r.ReadToEnd());

fs.Close();

9

Непосредственное шифрование данных методом RSA используется очень редко. Это связано в первую очередь с тем, что данное шифрование осуществляется гораздо более медленно, чем симметричное шифрование, но главным препятствием к его использованию является то, что зашифрован может быть только поток бит, который должен быть разбит на блоки строго определѐнной длины, соответствующей размеру ключа. Чем больше длина ключа, тем соответственно больше длина блока в битах, однако в любом случае необходимо в своей программе предусмотреть разбиение данных на блоки, а для потока бит это очень сложно и неудобно. Если длина блока превышает требуемую хотя бы на один бит, то возникнет ошибка.

Поэтому на практике обычно комбинируют симметричное и асимметричное шифрование. Для этого создают ключ симметричного шифрования и его вектор инициализации, например, DES, с его помощью шифруют данные, а сам ключ и вектор зашифровывают с помощью открытого ключа RSA и добавляют к сообщению. Пользователь, получивший сообщение, расшифровывает с помощью секретного ключа RSA ключ симметричного шифрования, выделяет его из сообщения и с его помощью расшифровывает само сообщение.

При этом важно правильно подобрать длину ключа RSA в соответствии с длиной ключа симметричного шифрования. Поскольку ключ симметричного шифрования и вектор инициализации должны быть зашифрованы каждый одним блоком (иначе их необходимо искусственно разбивать на блоки), то длина ключа RSA должна подбираться следующим образом: число байт в зашифрованном блоке RSA должно быть равно числу бит ключа симметричного шифрования. Так, для шифрования ключа DES (длина ключа 64 бит) необходимо использовать ключ RSA длиной 512 бит (512/8=64 байта – длина блока), для ключа Rijndael длиной 128 бит необходимо использовать ключ RSA длиной 1024 бит.

Пример 3. Создать новый ключ симметричного шифрования по алгоритму DES и зашифровать с его помощью текст, введѐнный в элемент TextBox. Сам ключ зашифровать с помощью алгоритма RSA, записать вместе с зашифрованной информацией в файл.

Visual Basic .Net:

Dim text As String text = TextBox1.Text

' Открытие шифрованного файла для записи

fs = New FileStream("C:\Шифр примера 2.txt", FileMode.Create)

'Создание нового симметричного ключа для шифрования по алгоритму DES

Dim DES As New DESCryptoServiceProvider

'Шифрование симметричного ключа и вектора инициализации

'с помощью октытого ключа RSA

Dim EncrypKey() As Byte = RSA.Encrypt(DES.Key, False)

Dim EncrypIV() As Byte = RSA.Encrypt(DES.IV, False)

'Запись асимметрично зашифрованных ключа и вектора инициализации

'в файл

fs.Write(EncrypKey, 0, EncrypKey.Length) fs.Write(EncrypIV, 0, EncrypIV.Length)

' Шифрование информации с помощью алгоритма DES и запись её в файл

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]