Роздрукувати сторінку
Главная \ Методичні вказівки \ Методичні вказівки \ 392 Лабораторна робота 7 на тему Захист даних від модифікацій та підміни

Лабораторна робота №7 на тему Захист даних від модифікацій та підміни

« Назад

Лабораторна робота № 7
Захист даних від модифікацій та підміни

Мета: Ознайомитися із криптографічними методами захисту даних від модифікації та підміни

Необхідне програмне забезпечення

Компілятор мови програмування (C, Basic, Pascal або ін.) із підтримкою роботи з програмним інтерфейсом Crypto API

Теоретичні відомості

1. Електронний цифровий підпис

При обміні інформацією повинні бути забезпечені її :

1. Конфіденційність (privacy) - зловмисник не повинен мати можливості дізнатися зміст переданого повідомлення.

2. Достовірність (authenticity), яка включає два поняття

- цілісність (integrity) - повідомлення повинне бути захищене від випадкової або умисної зміни;

- ідентифікація відправника (перевірка авторства) - одержувач повинен мати можливість перевірити, ким відправлено повідомлення.

Шифрування може забезпечити конфіденційність, а в деяких системах і цілісність.

Цілісність повідомлення перевіряється обчисленням контрольної функції (check function) від повідомлення - якогось числа невеликої довжини. Ця контрольна функція повинна з високою вірогідністю змінюватися навіть при малих змінах повідомлення (видалення, включення, перестановки або переупорядкування інформації). Називають і обчислюють контрольну функцію по-різному:

- код достовірності повідомлення (Message Authentical Code, MAC);

- квадратичний конгруентний алгоритм (Quadratic Congruentical Manipulation Detection Code, QCMDС);

- Manipulation Detection Code (MDС);

- Message Digest Algorithm (MD5);

- контрольна сума;

- символ контролю блоку (Block Check Character, BCC);

- циклічний надмірний код (ЦНК, Cyclic Redundancy Check, CRC);

- хеш-функція (hash);

- імітовставка в ГОСТ 28147-89;

- алгоритм з усіканням до n бітів (n-bit Algorithm with Truncation).

При обчисленні контрольної функції може використовуватися який-небудь алгоритм шифрування. Можливе шифрування самої контрольної суми.

Окрім використання контрольної функції, широко застосовується електронний цифровий підпис – цифрове доповнення до інформації, що передається, яке гарантує цілісність останньої і дає можливість перевірити її авторство.

Відомі моделі цифрового підпису (digital signature) на основі алгоритмів симетричного шифрування, але при використанні систем з відкритими ключами цифровий підпис здійснюється зручніше.

Для використання алгоритму RSA повідомлення потрібно стиснути функцією хешування (алгоритм MD5 – Message Digest Algorithm) до 256-бітового хешу (H). Сигнатура повідомлення S обчислюється таким чином:

S = Hd mod n.

Сигнатура пересилається разом з повідомленням.

Процес ідентифікації полягає в отриманні хеш-функції повідомлення (H') і порівнянні з

H = Se mod n,

де H – хеш-повідомлення, S - його сигнатура, d - секретний ключ, e - відкритий ключ.

Перевірка достовірності регламентується стандартами:

- аутентифікація (authentication) – ISO 8730-90, ISO/IES 9594-90 та ITU X.509[1];

-  цілісність – ГОСТ 28147-89, ISO 8731-90;

- цифровий підпис – ISO/IEC 7498, P 34.10-94 (Росія), DSS (Digital Signature Standard, США).

При розробці механізму цифрового підпису виникають наступні задачі:

- створити підпис таким чином, щоб її неможливо було підробити;

- мати можливість перевірки того, що підпис дійсно належить вказаному власнику;

- мати можливість запобігти відмові від підпису.

 

1.1. Класична схема створення цифрового підпису

При створенні цифрового підпису за класичною схемою відправник

- застосовує до вихідного повідомлення хеш-функцію;

- обчислює цифровий підпис за хеш-образом повідомлення з використанням секретного ключа створення підпису;

-  формує нове повідомлення, яке складається з вихідного повідомлення та  доданого до нього  цифрового підпису.

Отримувач, після отримання підписаного повідомлення:

- відокремлює цифровий підпис від основного повідомлення;

- застосовує до основного повідомлення хеш-функцію;

- з використанням відкритого ключа перевірки підпису здобуває хеш-образ повідомлення з цифрового підпису;

- перевіряє відповідність обчисленого хеш-образу повідомлення та добутого з цифрового підпису. Якщо хеш-образи збігаються, то підпис визнається справжнім.

1.2. Схема цифового підпису на основі алгоритму RSA

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

Для створення підпису повідомлення M  відправник

- обчислює хеш-образ r = h(M)  повідомлення  M  за допомогою деякої хеш-функції;

- зашифровує отриманий хеш-образ r  на своєму секретному ключі (d,n), тобто обчислює значення s = rd mod n, що і є підписом.

Для перевірки підпису отримувач:

- розшифровує підпис s на відкритому ключі (e,n) відправника, тобто обчислює  r’ = se mod n і таким чином відновлює імовірний хеш-образ r’ повідомлення  M;

- обчислює хеш-образ  h(M) = r  повідомлення  M  за допомогою тієї ж самої хеш-функції, котру використовував відправник;

- порівнює отримані значення  r  і  r’ . Якщо вони збігаються, то підпис правильний, відправник дійсно є тим, за кого себе видає, і повідомлення не було змінено при передачі.

 

2. Хеш-функція

На відміну від рукописного тексту, електронний документ дуже легко може піддатися різним, непомітним для одержувача документа, змінам. Тому часто виявляється необхідним не зашифровувати вміст інформаційного повідомлення, а забезпечити гарантії достовірності авторства і визначити, чи не вносилися несанкціоновані автором зміни в інформацію. Для цих цілей використовується алгоритм цифрового підпису. При використанні цифрового підпису інформація не шифрується і залишається доступною будь-якому користувачеві, що має до неї доступ. Для визначення достовірності автора і вмісту використовується спеціальна функція, звана “дайджест” або хеш-функція.

Процес підпису документа виглядає таким чином. На першому кроці будується спеціальна функція, що нагадує контрольну суму, – хеш-функція, вона ідентифікує вміст документа. На другому кроці автор документа шифрує вміст хеш-функції своїм персональним закритим ключем. Зашифрована хеш-функція вставляється в те ж повідомлення, що і сам документ. Отримане повідомлення може зберігатися на будь-якому носієві або пересилатися по електронній пошті. Хеш-функція має невеликий розмір і збільшує розмір повідомлення ненабагато.

При прочитанні що скріпляє електронним підписом документа користувач може переконається в його достовірності. Алгоритм верифікації електронного підпису полягає в наступному. На першому етапі одержувач повідомлення будує власний варіант хеш-функції підписаного документа. На другому етапі відбувається розшифровка хеш-функції, що міститься в повідомленні. На третьому етапі відбувається порівняння двох хеш-функцій. Їх збіг гарантує одночасно достовірність вмісту документа і його авторства.

При пересилці документа по електронній пошті відкритий ключ автора може міститися в тому ж повідомленні, що і сам документ, це спрощує процес верифікації підпису.

Функцією хешування (хеш-функцією або вкорочуючою функцією) називається перетворення даних, що переводить рядок бітів M довільної довжини в рядок бітів h(M) деякої фіксованої довжини (кілька десятків чи сотень біт).

Хеш-функція h(M) повинна задовольняти наступним умовам:

- хеш-функція h(M) повинна бути чутливою до будь-яких змін вхідної послідовності M;

- для даного значення h(M) повинно бути неможливо знайти значення M;

- для даного значення h(M) повинно бути неможливо знайти значення M’ ¹ M  таке, що h(M‘) = h(M) .

Ситуація, за якої для різних вхідних послідовностей M, M‘  збігаються значення їх хеш-образів: h(M) = h(M‘), називається колізією.

При побудові хеш-образу, вхідна послідовність M розбивається на блоки Mi фіксованої довжини і оброблюється поблочно за формулою

Hi = f(Hi-1 , Mi).

Хеш-значення, що обчислюється при введенні останнього блоку повідомлення, стає хеш-значенням всього повідомлення.

В якості прикладу розглянемо спрощений варіант хеш-функції із рекомендацій МККТТ (ITU) Х.509:

Hi = (Hi-1  +  Mi )2 mod n ,    

де n = pqp і q – великі прості числа, H0 - довільний початковий вміст,  Mi  - i-тий блок повідомлення M = M1 M2 … Mk.

2.1. Використання хеш-функції для перевірки незмінності даних

Шифрування не дає зловмисникам можливості прочитати ваші дані, але воно не захищає дані від підміни. Для цього потрібний деякий спосіб перевірки даних на предмет того, що вони не були змінені. Цю роль і виконують хеш-коди.

Алгоритм обчислення хеш-коду генерує невеликий (зазвичай близько 20 байт) двійковий відбиток будь-яких даних, які можуть бути представлені у формі послідовності байт. Хеш-коди криптографічно-безпечні. Інакше кажучи, зловмисникові буде украй складно створити документ, якому відповідатиме конкретний хеш-код. Крім того, навіть дізнавшись хеш-код, зловмисник не отримає інформації про початкові дані. І хоча різним даним можуть відповідати однакові хеш-коди, статистично це малоймовірно. Фактично навіть при щонайменшій зміні даних (наприклад, при зміні 1 бита) є 50%-а вірогідність незалежної зміни кожного біта хеш-коду.

У таблиці 6.1 наведений список алгоритмів обчислення хеш-коду, представлених класами з простору імен System.Security.Cryptography. Всі ці класи проведені від класу HashAlgorithm і включають метод ComputeHash, який приймає масив байт або потік і повертає масив байт, що містить хеш-код. Як і у разі алгоритмів шифрування, чим менше розмір хешу, тим слабкіше забезпечуваний ним захист (і тим легше зломщикові знайти інший набір даних, якому відповідає той же хеш-код).

Таблиця 6.1

Класи алгоритмів генерування хешу

Алгоритм

Клас реалізації за умовчанням

Розмір хешу (у бітах)

MD5

MD5CryptoServiceProvider

128

SHA-1

SHA1СryptoServiceProvider

160

SHA-256

SHA256Managed

256

SHA-384

SHA384Managed

384

SHA-512

SHA512Managed

512

Наступний фрагмент підраховує хеш-коди для тестового файлу до і після невеликої зміни і порівнює їх. Він включає допоміжну функцію, що перевіряє масиви байт на рівність шляхом перебору всіх байт:

Private Function CompareByteArray(ByVal BYTESA() As Byte, ByVal BYTESB()

            As Byte) As Boolean

 

        If Not BYTESA.Length = BYTESB.Length Then Return False

        Dim i As Integer

        For i = 0 To BYTESA.Length - 1

            If Not BYTESA(i) = BYTESB(i) Then Return False

        Next

        Return True

End Function

 

    Private Sub Hashing()

 

    ' Створення нового файлу.

        Dim fs As New FileStream("testfile.bin", FileMode.Create)

 

    ' Запис деяких даних.

        Dim w As New StreamWriter(fs)

        w.WriteLine("This is the first line.")

        w.WriteLine("This is the second line.")

        w.Flush()

 

    ' Обчислення 512-бітового (64-байтового) хеш-коду для файлу.

        Dim SHA As New SHA512Managed()

        fs.Position = 0

        Dim HASHA() As Byte = SHA.ComputeHash(fs)

 

    ' Відображення хеш-коду.

        TextSource1 = BitConverter.ToString(HASHA)

 

    ' Додавання символу у файл і повторне обчислення хеш-коду.

        w.Write("!")

        w.Flush()

        fs.Position = 0

        Dim HASHB() As Byte = SHA.ComputeHash(fs)

 

        If CompareByteArray(HASHA, HASHB) Then

            MessageText = "Хеш-коди ідентичні!"

        Else

            MessageText = "Невідповідність хеш-кодів!"

        End If

 

       TextSource2 = BitConverter.ToString(HASHB)

 

      fs.Close()

 

End Sub

Для гарантії цілісності даних зберігайте хеш-код в безпечному місці (такому, наприклад, як захищена БД), інакше зловмисник зможе підробити  документ, згенерувати новий хеш-код і замінити ним оригінальний хеш-код.

2.2. Створення хеш-коду, захищеного від підміни

Якщо хеш-код потрібно зберігати в небезпечному місці або разом з самими даними, можна створити хеш-код, захищений від підміни. Хеш-коди мають одне очевидне обмеження: якщо не зберігати їх в безпечному місці, ніщо не перешкодить зловмисникові підмінити ваші дані і згенерувати новий хеш-код, відповідний зміненим даним. Таку зміну даних визначити неможливо. Ця проблема часто зустрічається при розробці розподілених додатків, що використовують хеш-коди для перевірки повідомлень отримуваних по мережі.

Вирішенням даної проблеми є створення хеш-коду, що не допускає відтворення зловмисником. Наприклад, ви можете зашифрувати хеш-код з використанням секретного ключа, недоступного зломщикові. Цей підхід називається алгоритмом генерування зашифрованого хеш-коду. Microsoft .NET Framework підтримує два таких алгоритму (таблиця 6.2); відповідні ним класи проведені від класу KeyedHashAlgorithm з простору імен System.Security.Cryptography. Їх головна відмінність від звичайних класів алгоритмів генерування хешу в тому, що вони включають властивість Key, що служить для зберігання секретного ключа (послідовності байт), який знадобиться при генерації хешу.

Таблиця 6.2

Класи алгоритмів генерування зашифрованого хеш-коду

Алгоритм

Клас реалізації за умовчанням

Розмір хешу

(у бітах)

Розмір ключа

HMAC-SHA1

MAC-3DES-CBC

160

64 (рекомендується)

HHACSHA1

HACTripleDES

64

8, 16 або 24

Наступний фрагмент генерує зашифровані хеш-коди для одних і тих же даних, використовуючи два різних ключа. Зверніть увагу: підсумкові хеш-коди будуть різними.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    ' Створення нового файлу.

        Dim fs As New FileStream("testfile.bin", FileMode.Create)

 

    ' Запис даних.

        Dim w As New StreamWriter(fs)

        w.WriteLine("This is the first line.")

        w.WriteLine("This is the second line.")

        w.Flush()

 

    ' Обчислення зашифрованого хеш-коду для файлу.

        Dim HMACSHA As New HMACSHA1()

        fs.Position = 0

        Dim HASHA() As Byte = HMACSHA.ComputeHash(fs)

 

    ' Відображення хеша.

        TextSource1 = BitConverter.ToString(HASHA)

       

    'Обчислення зашифрованого хеша по тому ж алгоритму

    'для тих же даних, але з використанням іншого ключа,

        fs.Position = 0

        HMACSHA = New HMACSHA1()

        Dim HASHB() As Byte = HMACSHA.ComputeHash(fs)

 

    ' Відображення хешу.

        TextSource2= BitConverter.ToString(HASHB)

 

        fs.Close()

 

    ' Порівняння хеш-кодів.

        If CompareByteArray(HASHA, HASHB) Then

            MessageText = "Хеш-коди ідентичні!"

        Else

            MessageText = "Невідповідність хеш-кодів!"

        End If

 

    End Sub

 

3. Створення цифрового підпису для ХМL-документу

Для шифрування XML-вмісту файлу або масиву байт можна використовувати способи хешування і підписання даних, розглянуті в п. 3, так само, як і при генерації хешу для даних будь-якого іншого типу. Проте з цим підходом пов'язані перераховані далі обмеження.

Немає простого способу створити хеш-код і потім перетворити підсумковий документ (початковий код XML і хеш-код) в коректний XML-документ.

Незначні відмінності XML-документів (такі як додаткові порожні місця) приводитимуть до зміни хеш-коду, не впливаючи на синтаксичний аналіз XML-даних. Це може стати особливо серйозною проблемою, якщо створений в одній системі хеш-код вам потрібно перевіряти в додатку, написаному на іншій мові програмування, або за допомогою інших інструментів XML.

Немає простого способу підписання тільки частини XML-документа (або підписання різних його частин підписами різних користувачів).

Вирішення цих проблем описані в рекомендації XML Signatures консорціуму W3C (http://www.wЗс.org/xmldsig-core). Рекомендація XML Signatures визначає стандартний спосіб підписання XML-документів і канонічну репрезентацію XML, яка потрібна для того, щоб ідентичні документи завжди генерували однакові підписи. Проте стандарт XML Signatures визначає ті ж алгоритми підписання, що використовуються для даних будь-яких інших типів.

У .NET Framework стандарт XML Signatures реалізований у вигляді типів з простору імен System.Security.Cryptography.Xml. Для доступу до цих типів ви повинні додати посилання на збірку System.Security.dll.

Існують три типи підписів XML-документів:

- відокремлений (detached) зберігається як окремий XML-фрагмент, що посилається на підписаний документ за допомогою URI (Uniform Resource Identifier);

- огортаючий (enveloping) грає роль оболонки для XML-документа;

- вставлений (enveloped) вставляється в початковий XML-документ, що містить підписувану інформацію.

Технологія .NET дає можливість створювати підписи всіх цих типів. Нижче наведений код Windows-додатку, який створює і верифікує вставлені підписи. Ось код початкового XML-документа:

<0rders>

  <0rder>

         <Name>Toaster Oven</Name>

         <Price>400.99</Price>

  </0rder>

</0rders>

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

Private Sub Signing()

   ' Завантаження XML-даних,   які потрібно підписати.

        Dim Doc As New XmlDocument

        Doc.Load("doc.xml")

 

   ' Створення підпису XML.

        Dim SignedXml As New SignedXml(Doc)

 

   ' Підписання даних всього документа.  Можна скласти цей вираз XPath

   ' так, щоб він указував на один елемент.

        Dim Reference As New Reference()

        Reference.Uri = "#xpointer(/)~"

        SignedXml.AddReference(Reference)

 

   ' Використовується перетворення,  потрібне для обернутих підписів.

        Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())

 

   ' Для створення підпису використовується алгоритм RSA.

        Dim Rsa As New RSACryptoServiceProvider()

 

   ' Додавання інформації про ключ в підпис.

        SignedXml.SigningKey = Rsa

        Dim KeyInfo1 As New KeyInfo

        KeyInfo1.AddClause(New RSAKeyValue(Rsa))

        SignedXml.KeyInfo = KeyInfo1

 

   ' Обчислення підпису.

        SignedXml.ComputeSignature()

 

   ' Отримання XML-репрезентації підпису.

        Dim XmlSignature As XmlElement = SignedXml.GetXml()

 

   ' Вставка XML-підпису в документ.

        Dim Node As XmlNode = Doc.ImportNode(XmlSignature, True)

        Dim Root As XmlNode = Doc.DocumentElement

        Root.InsertAfter(Node, Root.FirstChild)

 

   ' Збереження XML-документа, що містить обернутий підпис.

        Doc.Save("SignedDoc.xml")

 

   ' Відображення повного документа разом з підписом.

        TextSource = Doc.OuterXml

End Sub

Верифікація підписаних даних

Private Sub Verifying()

 

   ' Завантаження підписаного XML-документа.

        Dim Doc As New XmlDocument()

        Doc.Load("SignedDoc.xml")

 

   ' Створення об'єкту SignedXml для верифікації підпису.

        Dim SignedXml As New SignedXml(Doc)

 

   ' Знаходження першого підпису.

        Dim Node As XmlNode = Doc.GetElementsByTagName("Signature",       

           "http://www.w3.org/2000/09/xmldsig#")(0)

        SignedXml.LoadXml(Node)

 

   ' Верифікація підпису.

        If SignedXml.CheckSignature() Then

            MessageBox.Show("Signature authenticated.")

        Else

            MessageBox.Show("Invalid signature.")

        End If

End Sub

 

Практичне завдання

1. Обчислити значення хеш-функції для довільного документу MS Word.

Варіант 1 — хеш-функція MD5

Варіант 2 — хеш-функція SHA-1

Варіант 3 — хеш-функція SHA-256

Варіант 4 — хеш-функція SHA-512

2. Створити захищений від підміни хеш-код для одного документу до і після його модифікації. Перевірити відповідність хеш-кодів.

3. Створити XML-документ, який містить дані про студентів групи (Прізвище, Ім’я, Вік, Стать…) та підписати його цифровим підписом.

4. Перевірити правдивість отриманих XML-даних.

 

Контрольні запитання

  1. Що таке електронний цифровий підпис?

  2. Для чого призначений електронний цифровий підпис?

  3. Які умови повинні виконуватися при передачі даних?

  4. Яка послідовність формування цифрового підпису?

  5. Що таке хеш-функція?

  6. Яким умовам повинна відповідати хеш-функція?

  7. Які відомі класи алгоритмів генерування хешу?

  8. Які існують типи підписів XML-документів?

[1] ISO - Міжнародна організація по стандартизації (МОС), ITU - Міжнародний союз електрозв'язку (МСЕ).

З повагою ІЦ "KURSOVIKS"!