Лабораторна робота №6 на тему Асиметричні системи шифрування
« НазадЛабораторна робота № 6
|
Елемент |
Опис |
Алгоритми шифрування |
Набір класів, вживаних для реалізації алгоритмів симетричного і асиметричного шифрування, а також хешування |
Допоміжні класи |
Класи, що забезпечують генерацію випадкових чисел, виконання перетворень, взаємодія із простором розміщення 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. Оскільки ці алгоритми дуже складні, їм потрібні допоміжні класи, похідні, наприклад, від Asymmetric Key Exchange Formatter і Asyrametric Signature Formatter.
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 |
Практичне завдання
-
Розкласти 10-ти цифрове натуральне число на прості множники.
-
Отримати список всіх встановлених в системі криптопровайдерів.
-
Виконати асиметричне шифрування даних за допомогою класу RSACryptoServiceProvider та симетричного криптопровайдера RijndaelManaged.
Контрольні запитання
-
Що являє собою програмний інтерфейс Crypto API?
-
Які криптоалгоритми називаються асиметричними?
-
Які криптоалгоритми підтримуються у Crypto API?
-
Які переваги асиметричних криптоалгоритмів?
-
Які недоліки асиметричних криптоалгоритмів?
-
Що таке секретний ключ?
-
Що таке відкритий ключ?
-
Що таке закритий ключ?
-
Де найчастіше використовуються асиметричні алгоритми?
-
У якому вигляді найчастіше реалізуються асиметричні алгоритми і чому?
З повагою ІЦ "KURSOVIKS"!