Лабораторна робота №6, Асиметричні системи шифрування
Код роботи: 1056
Вид роботи: Лабораторна робота
Предмет: Мережева безпека
Тема: №6, Асиметричні системи шифрування
Кількість сторінок: 7
Дата виконання: 2016
Мова написання: українська
Ціна: 150 грн
Мета: Ознайомитись з реалізацією деяких асиметричних алгоритмів шифрування даних. Розглянути можливості та особливості використання програмного інтерфейсу Crypto API для реалізації асиметричних алгоритмів шифрування даних.
Необхідне програмне забезпечення
Компілятор мови програмування (на вибір викладача C, Basic, Pascal та ін.) із підтримкою роботи з програмним інтерфейсом Crypto API.
Теоретичні відомості
1. Асиметричні алгоритми шифрування
У асиметричних алгоритмах шифрування (або криптографії з відкритим ключем) для шифрування інформації використовують один ключ (відкритий), а для розшифровки - інший (секретний). Ці ключі різні і не можуть бути отримані один з іншого.
Схема обміну інформацією така:
- одержувач обчислює відкритий і секретний ключі, секретний ключ зберігає в таємниці, відкритий же робить доступним (повідомляє відправника, групу користувачів мережі, публікує);
- відправник, використовуючи відкритий ключ одержувача, зашифровує повідомлення, яке пересилається одержувачеві;
- одержувач отримує повідомлення і розшифровує його, використовуючи свій секретний ключ.
Основи криптографії з відкритими ключами були висунуті Уїтфілдом Діффі (Whitfield Diffie) і Мартіном Хеллманом (Martin Hellman), і незалежно Ральфом Мерклом (Ralph Merkle). Їх внеском в криптографію було переконання, що ключі можна використовувати парами – ключ шифрування і ключ дешифрування - і що може бути неможливо отримати один ключ з іншого.
Діффі і Хеллман вперше представили цю ідею на Національній комп'ютерній конференції 1976г., через декілька місяців була опублікована їх основоположна робота "New Directions in Cryptography" ("Нові напрями в криптографії"). Перша робота Меркла вийшла в 1978г.
З 1976 року було запропоновано безліч криптографічних алгоритмів з відкритими ключами. Багато з них не є безпечними. З тих алгоритмів, які є безпечними, багато непридатні для практичної реалізації: або вони використовують дуже великий ключ, або розмір отриманого шифротексту набагато перевищує розмір відкритого тексту.
Більшість безпечних алгоритмів заснована на так званих необоротних функціях (під цим розуміється не теоретична необоротність, а неможливість набути оберненого значення використовуючи сучасну техніку за прийнятний інтервал часу). Всі діючі зараз системи спираються на один з наступних трьох типів необоротних перетворень:
- розкладання великих чисел на прості множники (RSA);
- обчислення логарифма в кінцевому полі (криптосистема Эль-Гамаля);
- обчислення коріння рівнянь алгебри (на основі еліптичних рівнянь).
Криптосистеми з відкритим ключем можна використовувати за трьома призначеннями:
- як самостійні засоби захисту даних, що передаються і зберігаються;
- як засоби для розподілу ключів;
- засоби аутентифікації користувачів.
Всі криптосистеми з відкритим ключем досить повільні і жодна з них не може зрівнятися по швидкодії з симетричними криптосистемами. Так швидкодія RSA в тисячі разів нижче чим у DES або ГОСТу 28147-89. Тому часто використовують гібридні криптосистеми.
На початковому етапі учасники інформаційного обміну, використовуючи протокол вироблення загального секретного ключа, формують загальну секретну інформацію (сеансовий ключ). На наступному етапі обміну використовується криптосистема з секретним ключем.
Відправник виробляє секретний ключ - випадкове число, використовуване тільки один раз і тому називається одноразовим або сеансовим ключем. Цей ключ використовується для шифрування повідомлення за допомогою симетричного алгоритму. Сеансовий ключ зашифровується на відкритому ключі одержувача і приєднується до раніше зашифрованого документу.
Сформоване таким чином повідомлення відсилається одержувачеві. Останній, отримавши повідомлення, повторює ті ж процедури, але в зворотному порядку - за допомогою свого секретного ключа він відновлює сеансовий ключ і розшифровує повідомлення.
Криптосистема RSA (захищена патентом США №4405829) була розроблена в 1977 році в Массачусетському технологічному інституті й отримала назву на честь її творців: Рона Рівеста (Ron Rivest), Аді Шаміра (Adi Shamir) і Леонарда Адлмана (Leonard Adleman). Вони скористалися тим фактом, що знаходження великих простих чисел в обчислювальному відношенні здійснюється легко, але розкладання на множники добутку двох таких чисел практично нездійсненно.
Доведено (теорема Рабіна), що розкриття шифру RSA еквівалентно такому розкладанню. Тому для будь-якої довжини ключа можна дати нижню оцінку числа операцій для розкриття шифру, а з урахуванням продуктивності сучасних комп'ютерів оцінити і необхідне на цей час. Можливість гарантовано оцінити захищеність алгоритму RSA стала однією з причин популярності цієї криптосистеми на тлі десятків інших схем. Тому алгоритм RSA використовується в банківських комп'ютерних мережах, особливо для роботи з віддаленими клієнтами (обслуговування кредитних карток).
На думку фахівців, RSA є одним з найбільш розвинених методів криптографічного захисту інформації з відкритим ключем, на основі якого організуються найефективніші і перспективні системи захисту даних. В таких системах для шифрування даних використовується один ключ, а для розшифрування - інший, тобто створюється ключова пара. Причому така пара формується одержувачем.
Перший ключ не є секретним і може бути опублікований для використання всіма користувачами системи, що шифрують дані, або ж може бути взятим з вже одержаного документу. Розшифрування даних за допомогою відомого ключа неможливе, тому що для цих цілей їх одержувач використовує інший ключ, який є секретним.
Природно, ключ розшифрування при цьому не може бути визначений з ключа шифрування. Криптостійкість алгоритму RSA базується на припущенні, що виключно важко визначити секретний ключ по відомому, оскільки для цього необхідно вирішити задачу про існування дільників цілого числа. Не вдаючись в тонкощі математики, зазначимо, що ця задача не допускає зараз ефективного рішення.
Ефективним програмно-технічним засобом для запровадження криптосистем є застосування електронних ключів. Одним з перших електронних ключів була розроблена в кінці 80-х років спеціалізована інтегральна схема IDS-P2 (MB8763). Пізніше програмна реалізація алгоритму RSA здійснена на інтегральній схемі CY1024.
З останніх можна відзначити розробки фірми MOTOROLA, яка випускає швидкодіючі криптографічні мікросхеми SC49A, що являють собою 8-бітний мікроконтролер з 1024-біт співпроцесором, 20-кбіт ROM, 4-кбіт EEPROM, 896-байт RAM і робочою напругою 3-5 вольт.
2. Огляд можливостей програмного інтерфейсу Crypto API
Швидкий розвиток електронної комерції різко підсилив потребу в надійних алгоритмах шифрування для захисту конфіденційної інформації. Для вирішення даного завдання Microsoft ще у 1996 р. ввела Cryptography API (Crypto API). Еволюція засобів захисту сприяє появі нових криптографічних сервісів, таких як простір імен System.Security.Cryptography спільного мовного операційного середовища (common language runtime, CLR) в Microsoft .NET.
Це простір імен відкриває програмний доступ до найрізноманітніших криптографічних сервісів, за допомогою яких додатки можуть шифрувати і дешифрувати дані, забезпечувати їх цілісність, а також обробляти цифрові підписи і сертифікати. Деякі з таких сервісів застосовуються безпосередньо в самій .NET Framework (наприклад для підтримки аутентифікації в ASP.NET).
2.1. Простір імен Cryptography
На найвищому рівні простір імен Cryptography можна розбити на чотири основні частини (таблиця 6.1). Головне призначення цього простору — надавати класи з алгоритмами таких операцій, як шифрування і створення хешів. Ці алгоритми реалізуються на основі розширюваного шаблону (pattern), що включає два рівні наслідування.
На вершині ієрархії розташовується абстрактний базовий клас (ніби AsymmetricAlgorithm або Hash Algorithm), ім'я якого відповідає типу алгоритму. Від такого класу успадковує абстрактний клас другого рівня, що надає відкритий інтерфейс для використання даного алгоритму. Наприклад, SHA1 (Secure Hash Algorithm) є похідним від HashAlgorithm клас і містить методи і властивості, специфічні для алгоритму SHA1. Нарешті, сама реалізація алгоритму є похідною від класу другого рівня; саме її екземпляр створюється і використовується клієнтським додатком. На цьому рівні реалізація може бути керованою, некерованою або і тій і іншій.
Таблиця 6.1
Основні елементи простору імен Cryptography
Елемент |
Опис |
Алгоритми шифрування |
Набір класів, вживаних для реалізації алгоритмів симетричного і асиметричного шифрування, а також хешування |
Допоміжні класи |
Класи, що забезпечують генерацію випадкових чисел, виконання перетворень, взаємодія із простором розміщення Crypto API й саме шифрування на основі потокової моделі |
Сертифікати Х.509 |
Класи, що визначені в просторі імен System.Security. Сгуptographу.Х509 Certificates і які надають цифрові сертифікати |
Цифрові підписи XML |
Класи, визначені в просторі імен System.Cryptography.Xml, які представляють цифрові підписи в XML-документах |
До імен некерованих реалізацій зазвичай додається суфікс «CryptoServiceProvider» (скажімо, SHA1CryptoServiceProvider), що вказує на те, що ця реалізація насправді надається провайдером криптографічного сервісу (Cryptographic Service Provider, CSP), який встановлений на рівні операційної системи і діє як оболонка Crypto API.
У імена керованих реалізацій включається суфікс «Managed» (наприклад SHA1Managed). Такі реалізації не спираються на Crypto API і містять виключно керований код.
Ще один важливий момент. При створенні екземпляра одного з конкретних класів початкові конструктори завжди записують в параметри об'єкту розумні і безпечні значення (якщо це можливо). Так, алгоритми асиметричного шифрування, що ґрунтуються на криптографії з відкритим ключем, генерують випадкову пару ключів, а алгоритми симетричного шифрування — випадковий ключ і вектор ініціалізації (initialization vector, IV); при цьому вони автоматично налаштовують такі властивості, як Mode і Padding. Окрім того, алгоритми другого типу за умовчанням прагнуть використовувати «стійкі» значення.
Другий основний набір класів в просторі імен System.Security.Cryptography включає як класи, реально вживані в процесі шифрування і розшифровки даних, так і різноманітні допоміжні класи. Це простір імен містить, наприклад, абстрактний клас RandomNumberGenerator, від якого успадковують класи RNGCryptoServiceProvider, ToBase64Transform і FromBase64Transform (використовуються при відповідних перетвореннях даних).
Простір імен Cryptography не тільки надає алгоритми шифрування, але і містить дочірній простір імен Х509Certificates.
Останнє об'єднує всього три класи, призначених для операцій з сертифікатами Authenticode X.509 v.3. Клас X509Certificate надає статичні методи CreateFromCertFile і CreateFromSignedFile для створення екземпляра сертифікату:
Dim c As X509Certificate c = X509Certificate.CreateFromCertFile("myCert.cer") Console.WriteLine(c.GetName) Console.WriteLine(c.GetPublicKeyString) Console.WriteLine(c.GetSerialNumberString) Console.WriteLine(c.GetExpirationDateString) |
Після цього сертифікат можна використовувати в декількох цілях, зокрема для перевірки на Web-сервері: ви пов'язуєте сертифікат з клієнтським запитом через властивість ClientCertificates об'єкту System.Net.HttpWebRequest (вона відкриває доступ до об'єкту X509CertificateCollection).
Простір імен Cryptography, зокрема, відкриває доступ до алгоритмів симетричного шифрування (далі — симетричні алгоритми).
Симетричні алгоритми називаються так тому, що для шифрування і дешифрування використовується один секретний ключ. Очевидно, що і відправник, і одержувач повинні тримати такий ключ в секреті, інакше шифрування стане безглуздим. Крім того, в режимі СВС симетричні алгоритми використовують IV — несекретне двійкове значення; воно ініціалізує алгоритм і вносить додаткові варіації до процесу шифрування. SymmetricAlgorithm є абстрактним базовим класом, від якого успадковують інші класи, специфічні для конкретних алгоритмів.
До підтримуваних симетричних алгоритмів належать Data Encryption Standard (DES), RC2, Rijndael і Triple Data Encryption Standard (TRIPLEDES). Кожен алгоритм включає який-небудь похідний від SymmetricAlgorithm абстрактний клас ніби DES і похідний від базового керований клас або клас провайдера сервісу, наприклад DESCryptoServiceProvider.
Другий тип — асиметричне шифрування або шифрування з відкритим ключем (далі — асиметричні алгоритми); відповідний клас є похідним від абстрактного класу AsymmetricAlgorithm.
До загальновідомих асиметричних алгоритмів відносяться Digital Signature Algorithm (DSA) і RSA. У асиметричних алгоритмах застосовується пара ключів: один — закритий, інший — відкритий. Як правило, відкритий ключ доступний кому завгодно і використовується відправником для шифрування даних, тоді як закритий ключ зберігається в захищеному місці і застосовується для розшифровки даних, зашифрованих за допомогою відкритого ключа. Найбільш поширений алгоритм RSA.
Ці алгоритми кінець кінцем є похідними від абстрактних класів DSA і RSA, у свою чергу похідних від AsymmetricAlgorithm. Оскільки ці алгоритми дуже складні, їм потрібні допоміжні класи, похідні, наприклад, від AsymmetricKeyExchangeFormatter і AsyrametricSignatureFormatter
2.2. Реалізація алгоритму RSA засобами програмного інтерфейсу Crypto API
Асиметричне шифрування дає можливість двом сторонам обмінюватися зашифрованими даними, не застосовуючи секретне значення. З асиметричним шифруванням тісно пов'язано поняття пари ключів. Суть асиметричного шифрування в тому, що кожен користувач має закритий і відкритий ключі, при цьому інформація, зашифрована відкритим ключем, може бути розшифрована тільки закритим ключем.
Відкритий ключ робиться доступним всьому світу, і його можна вільно передавати по незахищених з'єднаннях, скажімо, по Інтернету. Закритий ключ тримається в строгому секреті. Таким чином, зашифрувати повідомлення відкритим ключем одержувача даних може будь-який користувач, але єдиною людиною, яка зможе розшифрувати таке повідомлення, є згаданий цільовий одержувач повідомлення, у якого є відповідний закритий ключ.
Для асиметричного шифрування даних в .NET служить клас RSACryptoServiceProvider, що підтримує ключі розміром 384-16384 біт (із збільшенням по 8 біт). За умовчанням розмір ключа рівний 1024 бітам. Як правило, чим більше розмір ключа, тим надійніше шифрування, проте надійність асиметричних і симетричних ключів різна. За деякими оцінками надійність 1024-бітового ключа RSA приблизно еквівалентна надійності 75-бітового симетричного ключа.
Асиметричне шифрування менш зручне від симетричного. Воно не використовує потокову модель і змушує шифрувати дані невеликими блоками. Якщо спробувати зашифрувати дані, що перевищують за об'ємом один блок, без їх розбивки, то виникне помилка. Для вирішення цієї проблеми можна використовувати комбінацію асиметричне шифрування з симетричним.
Асиметричне шифрування зазвичай працює в 1000 разів повільніше, аніж симетричне; крім того, об'єм зашифрованих по асиметричному алгоритму даних у декілька разів перевищує об'єм даних, зашифрованих симетрично. Ви можете уникнути цих обмежень, згенерувавши випадковий симетричний ключ і зашифрувавши блок своїх даних з його допомогою. Хитрість в тому, що після цього необхідно асиметрично зашифрувати випадковий ключ, використовуючи відкритий ключ одержувача, і додати зашифрований симетричний ключ в зашифрований документ.
Одержувач зможе витягнути зашифрований симетричний ключ, розшифрувати його своїм закритим ключем і за допомогою симетричного ключа розшифрувати частину документа, що залишилася. Цей спосіб застосовується досить часто; як приклади можна привести протокол SSL (при використанні якого для кожної взаємодії передається симетричний ключ сеансу) і файлову систему Windows Encrypting File System (при цьому випадковий симетричний ключ генерується для кожного шифрованого файлу).
.......... Inherits System.Windows.Forms.Form Private RSA As New Security.Cryptography.RSACryptoServiceProvider()
Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Перевірка наявності файлу ключів. ' Цей файл міститиме і відкритий, і закритий ключі. If File.Exists("key.bin") Then Dim fs As New IO.FileStream("key.bin", FileMode.Open) Dim r As New IO.StreamReader(fs) RSA.FromXmlString(r.ReadToEnd()) fs.Close() Else Dim fs As New FileStream("key.bin", FileMode.CreateNew) Dim w As New StreamWriter(fs) w.Write(RSA.ToXmlString(True)) w.Flush() fs.Close() End If End Sub |
Шифрування
Private Sub Crypting() txtsource = “Some text source.”
' Відкриття файлу для запису. Dim fs As New FileStream("testfile.bin", FileMode.Create)
' Створення нового (випадкового) симетричного ключа. Dim Rijndael As New RijndaelManaged
' Шифрування симетричного ключа і вектора ініціалізації ' з використанням відкритого ключа RSA. Dim EncryptedKey() As Byte = RSA.Encrypt(Rijndael.Key, False) Dim ENCRYPTEDLV() As Byte = RSA.Encrypt(Rijndael.IV, False)
' Запис асиметрично зашифрованих ключа ' і вектора ініціалізації у файл. fs.Write(EncryptedKey, 0, EncryptedKey.Length) fs.Write(ENCRYPTEDIV, 0, ENCRYPTEDLV.Length)
' Запис частини файлу, що залишилася, з використанням симетричного ' шифрування. Dim Transform As ICryptoTransform = Rijndael.CreateEncryptor() Dim cs As New CryptoStream(fs, Transform, CryptoStreamMode.Write) Dim w As New StreamWriter(cs) w.Write(txtsource) w.Flush() cs.Close() w.Close() fs.Close() End Sub |
Дешифрування
Private Sub Decrypting() ' Відкриття файлу для читання. Dim fs As New FileStream("testfile.bin", FileMode.Open) ' Розмір ключа вимірюється в бітах. 8 біт рівні 1 байту. ' Число байт в зашифрованому блоці ' даних завжди дорівнює розміру ключа. Dim EncryptedBlockSize As Integer = CType(RSA.KeySize / 8, Integer)
' Отримання зашифрованого ключа і вектора ініціалізації. Dim Rijndael As New RijndaelManaged Dim EncryptedKey(EncryptedBlockSize - 1) As Byte Dim ENCRYPTEDIV(EncryptedBlockSize - 1) As Byte fs.Read(EncryptedKey, 0, EncryptedKey.Length) fs.Read(ENCRYPTEDIV, 0, ENCRYPTEDIV.Length) Rijndael.KeySize = EncryptedBlockSize Rijndael.Key = RSA.Decrypt(EncryptedKey, False) Rijndael.IV = RSA.Decrypt(ENCRYPTEDIV, False)
' Частина файлу, що залишилася, прочитується за допомогою симетричного ключа. Dim Transform As ICryptoTransform = Rijndael.CreateDecryptor() Dim cs As New CryptoStream(fs, Transform, CryptoStreamMode.Read) Dim r As New StreamReader(cs)
‘ Запис дешифрованих даних txtsource = r.ReadToEnd() r.Close() End Sub |
Практичне завдання
1. Розкласти 10-ти цифрове натуральне число на прості множники.
2. Отримати список всіх встановлених в системі криптопровайдерів.
3. Виконати асиметричне шифрування даних за допомогою класу RSACryptoServiceProvider та симетричного криптопровайдера RijndaelManaged.
Контрольні запитання
1. Що являє собою програмний інтерфейс Crypto API?
2. Які криптоалгоритми називаються асиметричними?
3. Які криптоалгоритми підтримуються у Crypto API?
4. Які переваги асиметричних криптоалгоритмів?
5. Які недоліки асиметричних криптоалгоритмів?
6. Що таке секретний ключ?
7. Що таке відкритий ключ?
8. Що таке закритий ключ?
9. Де найчастіше використовуються асиметричні алгоритми?
10. У якому вигляді найчастіше реалізуються асиметричні алгоритми і чому?