Захист персональних даних за допомогою алгоритмів шифрування

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Зміст
Введення
Глава I. Криптологія
1.1 Шифрування - метод захисту інформації
1.2 Історія розвитку криптології
1.3 Криптологія в наші дні
1.4 Класифікація алгоритмів шифрування
Глава II. Розгляд алгоритмів
2.1 Симетричні алгоритми шифрування
2.1.1 Потокові шифри
2.1.2 Блокові шифри
2.2 Асиметричні алгоритми шифрування
2.2.1 Алгоритм Діффі-Хелмана
2.2.2 Агорітм RSA
2.2.3 ElGamal
2.3 Порівняння симетричних і асиметричних алгоритмів шифрування
2.4 Використання інструментів криптографії в Delphi-додатках
2.4.1 CryptoAPI
2.4.2 Підключення до криптопровайдери. Контейнери ключів
2.4.3 Шифрування на основі призначених для користувача даних або пароль
2.5 Постановка завдання
2.6 Реалізація завдання
2.6.1 Коротка характеристика середовища Delphi7
2.6.2 Алгоритм рішення задачі
2.6.3 Таблиця повідомлень
Висновок
Література

Введення
Багатьом з нас доводилося бачити особисту інформацію в різних вільно продаються базах даних. Більшість людей це справедливо обурювало, і вони вимагали припинити вільне розповсюдження особистих даних. Але проблема полягала в тому, що особисті дані не були чітко класифіковані, і не зрозуміло було, що можна поширювати, а що не можна.
Крапки над i нарешті розставили у законі Російської Федерації № 152-ФЗ від 27 липня 2006 року. І тепер ми знаємо, що персональні дані це будь-яка інформація, що відноситься до певного або визначається на підставі такої інформації фізичній особі (суб'єкту персональних даних), у тому числі його прізвище, ім'я, по батькові, рік, місяць, дата і місце народження, адресу, сімейне, соціальне, майнове становище, освіта, професія, доходи, інша інформація.
Але закон накладає певні зобов'язання на операторів персональних даних - ті компанії і організації, які оперують такими даними. Відповідно до закону, з 1 січня 2010 року всі оператори персональних даних повинні забезпечити захист персональних даних відповідно до вимог закону 152-ФЗ. А «особи, винні у порушенні вимог цього Закону, несуть цивільну, кримінальну, адміністративну, дисциплінарну та іншу передбачену законодавством Російської Федерації відповідальність».
У своїй роботі я хочу розглянути алгоритми, за допомогою яких ми можемо захистити свої персональні дані.

Глава I. Криптологія
1.1 Шифрування - метод захисту інформації
Споконвіку не було цінності більшої, ніж інформація. ХХ століття - століття інформатики та інформатизації. Технологія дає можливість передавати й зберігати все більші обсяги інформації. Це благо має й зворотний бік. Інформація стає все більш вразливою з різних причин:
· Зростаючі обсяги збережених і переданих даних;
· Розширення кола користувачів, що мають доступ до ресурсів ЕОМ, програмам і даним;
· Ускладнення режимів експлуатації обчислювальних систем.
Тому все більшої важливості набуває проблема захисту інформації від несанкціонованого доступу (НСД) при передачі і зберіганні. Сутність цієї проблеми - постійна боротьба фахівців із захисту інформації зі своїми "опонентами".
Захист інформації - сукупність заходів, методів і засобів, що забезпечують:
· Виключення НСД до ресурсів ЕОМ, програмам і даним;
· Перевірку цілісності інформації;
· Виключення несанкціонованого використання програм (захист програм від копіювання).
Очевидна тенденція до переходу на цифрові методи передачі й зберігання інформації дозволяє застосовувати уніфіковані методи й алгоритми для захисту дискретної (текст, факс, телекс) і безперервної (мова) інформації.
Випробуваний метод захисту інформації від НСД - шифрування (криптографія). Шифруванням (encryption) називають процес перетворення відкритих даних (plaintext) в зашифровані (шифртекст, ciphertext) або зашифрованих даних у відкриті за певними правилами із застосуванням ключів. В англомовній літературі зашифрування / розшифрування - enciphering / deciphering.
За допомогою криптографічних методів можливо:
· Шифрування інформації;
· Реалізація електронного підпису;
· Розподіл ключів шифрування;
· Захист від випадкового або навмисного зміни інформації.
До алгоритмів шифрування пред'являються певні вимоги:
· Високий рівень захисту даних проти дешифрування і можливої ​​модифікації;
· Захищеність інформації повинна грунтуватися тільки на знанні ключа й не залежати від того, відомий алгоритм чи ні (правило Киркхофф);
· Мале зміна вихідного тексту або ключа повинна призводити до значної зміни шифрованого тексту (ефект "обвалу");
· Область значень ключа повинна виключати можливість дешифрування даних шляхом перебору значень ключа;
· Економічність реалізації алгоритму при достатній швидкодії;
· Вартість дешифрування даних без знання ключа повинна перевищувати вартість даних.
1.2 Історія розвитку криптології
Криптологія - древня наука і звичайно це підкреслюють розповіддю про Юлія Цезаря (100 - 44 рр.. До н. Е..), Листування якого з Цицероном (106 - 43 рр.. До н. Е..) Та іншими "абонентами" в Стародавньому Римі шифрувалася . Шифр Цезаря, інакше шифр циклічних підстановок, полягає в заміні кожної букви в повідомленні буквою алфавіту, віддаленої від неї на фіксоване число букв. Алфавіт вважається циклічним, тобто після Z слід A. Цезар заміняв букву буквою, відстояти від вихідної на три.
Сьогодні в криптології прийнято оперувати символами не у вигляді букв, а у вигляді чисел, їм відповідають. Так, в латинському алфавіті можемо використовувати числа від 0 (відповідного A) до 25 (Z). Позначаючи число, відповідне вихідному символу, x, а закодованого - y, можемо записати правило застосування шаблона шифру:
y = x + z (mod N), (1)
де z - секретний ключ, N - кількість символів в алфавіті, а додавання по модулю N - операція, аналогічна звичайному додаванню, з тією лише відмінністю, що якщо звичайне підсумовування дає результат, більший або рівний N, то значенням суми вважається залишок від ділення його на N.
Шифр Цезаря в прийнятих позначеннях відповідає значенню секретного ключа z = 3 (а у Цезаря Августа z = 4). Такі шифри розкриваються надзвичайно просто навіть без знання значення ключа: досить знати лише алгоритм шифрування, а ключ можна підібрати простим перебором (так званої силовий атакою). Криптологія і складається з двох частин - криптографії, що вивчає способи шифрування та / або перевірки справжності повідомлень, і криптоаналізу, що розглядає шляхи розшифровки і підміни криптограм. Нестійкість перший шифрів на багато століть породила атмосферу секретності навколо роботи криптографа, загальмувала розвиток криптології як науки.
Так звана "донаукова" криптографія більш ніж за дві тисячі років полуінтуітівно "намацала" досить багато цікавих рішень. Найпростіше дію - виконати підстановку не в алфавітному порядку. Непогано також переставити символи в повідомленні місцями (шифри перестановок).
Першим систематичним працею по криптографії прийнято вважати роботу великого архітектора Леона Баттіста Альберті (1404 - 1472 рр..). Період до середини XVII століття вже насичений роботами по криптографії та криптоаналізу. Інтриги навколо шифрограму в Європі того часу дивно цікаві. Франсуа Вієт (1540 - 1603 рр..), Який при дворі короля Франції Генріха IV так успішно займався криптоаналізу (тоді ще не носив цього гордого назви), що іспанський король Філіп II скаржився Папі Римському на застосування французами чорної магії. Але все обійшлося без кровопролиття - при дворі Папи в цей час вже служили радники з сімейства Ардженто, яких ми сьогодні назвали б криптоаналитики.
Можна стверджувати, що протягом століть дешифруванню криптограм допомагає частотний аналіз появи окремих символів і їх поєднань. Ймовірності появи окремих букв в тексті сильно відрізняються (для російської мови, наприклад, буква "о" з'являється в 45 разів частіше літери "ф"). Це, з одного боку, є основою як для розкриття ключів, так і для аналізу алгоритмів шифрування, а з іншого - є причиною значної надлишковості (в інформаційному сенсі) тексту на природній мові. Будь-яка проста підстановка не дозволяє заховати частоту появи символу - як шило з мішка стирчать в російській тексті символи, що відповідають буквам "о", "е", "а", "і", "т", "н". Але теорія інформації та міра надмірності ще не створені, і для боротьби з ворогом криптографа - частотним аналізом - пропонується рандомізації. Її автор Карл Фрідріх Гаус (1777 - 1855 рр..) Помилково вважав, що створив нераскриваемий шифр.
Наступна помітна постать в історії криптології, яку ми не повинні пропустити, - голландець Огюст Керкхофф (1835 - 1903 рр..). Йому належить чудове "правило Керкхоффа": стійкість шифру повинна визначатися ТІЛЬКИ секретністю ключа. З огляду на час, коли це правило було сформульовано, його можна визнати найбільшим відкриттям (до створення систематичної теорії ще понад півстоліття!). Це правило вважає, що АЛГОРИТМ шифрування не є секретною, а значить, можна вести відкрите обговорення переваг та недоліків алгоритму. Таким чином, це правило переводить роботи з криптології в розряд ВІДКРИТИХ наукових робіт, що допускають дискусії, публікації і т. п.
1.3 Криптологія в наші дні
Останнє ім'я, яке ми назвемо в донаучной криптології, - інженер Жільбер Вернам (GS Vernam). У 1926 році він запропонував дійсно нераскриваемий шифр. Ідея шифру полягає в тому, щоб в рівнянні (1) для кожного наступного символу вибирати нове значення z. Іншими словами, секретний ключ повинен використовуватися тільки один раз. Якщо такий ключ вибирається випадковим чином, то, як було строго доведено Шенноном через 23 роки, шифр є нераскриваемим. Цей шифр є теоретичним обгрунтуванням для використання так званих "шифроблокнотів", широке застосування яких почалося в роки другої світової війни. Шифроблокнота містить безліч ключів одноразового використання, послідовно обирають при шифруванні повідомлень. Пропозиція Вернама, однак, не вирішує завдання секретного зв'язку: замість способу передачі таємного повідомлення тепер необхідно знайти спосіб передачі особистого ключа, рівний йому за довжину, тобто містить стільки ж символів, скільки є у відкритому тексті.
У 1949 році стаття Клода Шеннона "Теорія зв'язку в секретних системах" поклала початок наукової криптології. Шеннон показав, що для деякого "випадкового шифру" кількість знаків шіфротекста, отримавши які криптоаналітик при необмежених ресурсах може відновити ключ (і розкрити шифр),

H (Z) / (rlog N), (2)
де H (Z) - ентропія ключа, r - надмірність відкритого тексту, а N - обсяг алфавіту. За ефективністю, з якою архіватори стискають текстові файли, нам добре відомо, як велика надмірність звичайного тексту - адже їх робота і полягає в зниженні надмірності (причому тільки на найбільш легко усувається її частини). При надмірності звичайного тексту порядку 0,75 і використанні 56-бітового ключа (такого, як припускає DES), досить 11 символів шіфротекста для відновлення ключа при необмежених ресурсах криптоаналітик.
Строго кажучи, співвідношення (2) не доведено для довільного шифру, але вірно для відомих приватних випадків. З (2) слід чудовий висновок: роботу криптоаналітик можна ускладнити не тільки вдосконаленням криптосистеми, але й зниженням надмірності відкритого тексту. Більш того, якщо надмірність відкритого тексту знизити до нуля, то навіть короткий ключ дасть шифр, який криптоаналітик не зможе розкрити.
Перед шифруванням інформацію слід піддати статистичному кодуванню (стиску, архівації). При цьому зменшиться обсяг інформації та її надмірність, підвищиться ентропія (середня кількість інформації, що припадає на один символ). Так як в стислому тексті будуть відсутні повторювані букви і слова, дешифрування (криптоаналіз) ускладниться.
1.4 Класифікація алгоритмів шифрування
1. Симетричні (з секретним, єдиним ключем, одноключевой, single-key).
1.1. Потокові (шифрування потоку даних):
· З одноразовим або нескінченним ключем (infinite-key cipher);
· З кінцевим ключем (система Вернама - Vernam);
· На основі генератора псевдовипадкових чисел (ПСЧ).
1.2. Блокові (шифрування даних поблочно):
1.2.1. Шифри перестановки (permutation, P-блоки);
1.2.2. Шифри заміни (підстановки, substitution, S-блоки):
· Моноалфавитной (код Цезаря);
· Поліалфавітні (шифр Відженера, циліндр Джефферсона, диск Уетстоуна, Enigma);
2. Асиметричні (з відкритим ключем, public-key):
· Діффі-Хеллман DH (Diffie, Hellman);
· Райвест-Шамір-Адлeман RSA (Rivest, Shamir, Adleman);
· Ель-Гамаль (ElGamal).
Крім того, є поділ алгоритмів шифрування на власне шифри (ciphers) і коди (codes). Шифри працюють з окремими бітами, буквами, символами. Коди оперують лінгвістичними елементами (склади, слова, фрази).

Глава II. Розгляд алгоритмів
2.1 Симетричні алгоритми шифрування
Симетричні алгоритми шифрування (або криптографія з секретними ключами) засновані на тому, що відправник і одержувач інформації використовують один і той самий ключ. Цей ключ повинен зберігатися в таємниці і передаватися способом, що виключає його перехоплення.
Обмін інформацією здійснюється в 3 етапи:
· Відправник передає одержувачу ключ (у випадку мережі з декількома абонентами у кожної пари абонентів повинен бути свій ключ, відмінний від ключів інших пар);
· Відправник, використовуючи ключ, зашифровує повідомлення, яке пересилається одержувачу;
· Одержувач отримує повідомлення і розшифровує його.
Якщо для кожного дня і для кожного сеансу зв'язку буде використовуватися унікальний ключ, це підвищить захищеність системи.
2.1.1 Потокові шифри
У потокових шифрах, тобто при шифруванні потоку даних, кожен біт вихідної інформації шифрується незалежно від інших за допомогою гамування.
Гаммирование - накладення на відкриті дані гами шифру (випадкової або псевдовипадковою послідовності одиниць і нулів) за певним правилом. Зазвичай використовується "виключне АБО", зване також складанням за модулем 2 і реалізоване в ассемблерних програмах командою XOR. Для розшифрування та ж гамма накладається на зашифровані дані.
При одноразовому використанні випадкової гами однакового розміру з зашифровує даними злом коду неможливий (так звані криптосистеми з одноразовим або нескінченним ключем). У даному випадку "нескінченний" означає, що гамма не повторюється.
У деяких потокових шифрах ключ коротше повідомлення. Так, у системі Вернама для телеграфу використовується паперове кільце, що містить гаму. Звичайно, стійкість такого шифру не ідеальна.
Зрозуміло, що обмін ключами розміром з шіфруемих інформацію не завжди доречний. Тому частіше використовують гаму, що отримується за допомогою генератора псевдовипадкових чисел (ПСЧ). У цьому випадку ключ - породжує число (початкове значення, вектор ініціалізації, initializing value, IV) для запуску генератора ПСЧ. Кожен генератор ПСЧ має період, після якого генерується послідовність повторюється. Очевидно, що період псевдовипадковою гами повинен перевищувати довжину шіфруемий інформації.
Генератор ПСЧ вважається коректним, якщо спостереження фрагментів його виходу не дозволяє відновити пропущені частини або всю послідовність при відомому алгоритмі, але невідомому початковому значенні.
При використанні генератора ПСЧ можливі кілька варіантів
1. Побітове шифрування потоку даних. Цифровий ключ використовується як початкове значення генератора ПСЧ, а вихідний потік бітів підсумовується по модулю 2 з вихідною інформацією. У таких системах відсутня властивість поширення помилок.
2. Побітове шифрування потоку даних зі зворотним зв'язком (ОС) за шифртекст. Така система аналогічна попередньої, за винятком того, що шифртекст повертається в якості параметра в генератор ПСЧ. Характерно властивість поширення помилок. Область поширення помилки залежить від структури генератора ПСЧ.
3. Побітове шифрування потоку даних з ОС по вихідного тексту. Базою генератора ПСЧ є вихідна інформація. Характерно властивість необмеженого поширення помилки.
4. Побітове шифрування потоку даних з ОС по шифртекст і по вихідному тексту.
2.1.2 Блокові шифри
При блоковому шифруванні інформація розбивається на блоки фіксованої довжини і шифрується поблочно. Блокові шифри бувають двох основних видів:
· Шифри перестановки (transposition, permutation, P-блоки);
· Шифри заміни (підстановки, substitution, S-блоки).
Шифри перестановок переставляють елементи відкритих даних (біти, літери, символи) в деякому новому порядку. Розрізняють шифри горизонтальній, вертикальній, подвійний перестановки, решітки, лабіринти, лозунгові та ін
Шифри заміни замінюють елементи відкритих даних на інші елементи за певним правилом. Paзлічают шифри простий, складною, парної заміни, буквено-складове шифрування і шифри колоною заміни. Шифри заміни діляться на дві групи:
· Моноалфавитной (код Цезаря);
· Поліалфавітні (шифр Відженера, циліндр Джефферсона, диск Уетстоуна, Enigma).
У моноалфавитной шифри заміни літера в повідомленні замінюється на іншу, заздалегідь певну букву. Наприклад в коді Цезаря буква замінюється на літеру, віддалену від неї в латинському алфавіті на деяке число позицій. Очевидно, що такий шифр зламується зовсім просто. Потрібно підрахувати, як часто зустрічаються букви в зашифрованому тексті, і порівняти результат з відомою для кожної мови частотою зустрічальності букв.
У поліалфавітного підстановки для заміни деякого символу вихідного повідомлення в кожному випадку його появи послідовно використовуються різні символи з деякого набору. Зрозуміло, що цей набір не нескінченний, через якусь кількість символів його потрібно використовувати знову. У цьому слабкість суто поліалфавітного шифрів.
У сучасних криптографічних системах, як правило, використовують обидва способи шифрування (заміни та перестановки). Такий шифратор називають складеним (product cipher). Oн більш стійкий, ніж шифратор, що використовує тільки заміни або перестановки.
2.2 Асиметричні алгоритми шифрування
В асиметричних алгоритмах шифрування (або криптографії з відкритим ключем) для зашифровування інформації використовують один ключ (відкритий), а для розшифрування - інший (секретний). Ці ключі різні і не можуть бути отримані один з іншого.
Схема обміну інформацією така:
· Одержувач обчислює відкритий і секретний ключі, секретний ключ зберігає в таємниці, відкритий ж робить доступним (повідомляє відправнику, групі користувачів мережі, публікує);
· Відправник, використовуючи відкритий ключ отримувача, зашифровує повідомлення, яке пересилається одержувачу;
· Одержувач отримує повідомлення і розшифровує його, використовуючи свій секретний ключ.
2.2.1 Алгоритм Діффі-Хелмана
Алгоритм Діффі-Хелмана (Whitfield Diffie і Martin Hellman, 1976 рік) використовує функцію дискретного піднесення до степеня і схожий на метод Ель-Гамаля.
Спочатку генеруються два великих простих числа n і q. Ці два числа не обов'язково зберігати в секреті. Далі один з партнерів P1 генерує випадкове число x і посилає іншому учаснику майбутніх обмінів P2 значення A = q x mod n
Після отримання А партнер P2 генерує випадкове число в і посилає P2 обчислене значення B = q y mod n
Партнер P1, отримавши В, обчислює K x = B x mod n, а партнер P2 обчислює K y = A y mod n. Алгоритм гарантує, що числа K y і K x рівні і можуть бути використані в якості секретного ключа для шифрування. Адже навіть перехопивши числа А і В, важко вирахувати K x або K y.
Алгоритм Діффі-Хелмана, забезпечуючи конфіденційність передачі ключа, не може гарантувати того, що він присланий саме тим партнером, який передбачається. Для вирішення цієї проблеми було запропоновано протокол STS (station-to-station). Цей протокол для ідентифікації відправника використовує техніку електронного підпису. Підпис шифрується загальним секретним ключем, після того як він сформований. Підпис включає в себе ідентифікатори як P1, так і P2.
2.2.2 RSA
Захищений патентом США N 4405829. Розроблений в 1977 році в Массачусетському технологічному інституті (США). Отримав назву за першими літерами прізвищ авторів (Rivest, Shamir, Adleman). Крипостійкість заснована на обчислювальній складності завдання розкладання великого числа на прості множники.
Алгоритм RSA припускає, що послане закодоване повідомлення може бути прочитаний адресатом і тільки їм. У цьому алгоритмі використовується два ключі - відкритий і секретний. Даний алгоритм привабливий також у разі, коли велика кількість суб'єктів (N) повинне спілкуватися за схемою все-зі-всіма. У випадку симетричної схеми шифрування кожен із суб'єктів якимось чином має доставити свої ключі всім іншим учасникам обміну, при цьому сумарна кількість використовуваних ключів буде досить велике при великому значенні N. Застосування асиметричного алгоритму вимагає лише розсилки відкритих ключів усіма учасниками, сумарне число ключів одно N.
Повідомлення представляється у вигляді числа M. Шифрування здійснюється за допомогою загальнодоступної функції f (M), і тільки адресату відомо, як виконати операцію f -1. Адресат вибирає два великих простих (prime) числа p і q, які робить секретними. Він оголошує n = pq і число d, c (d, p-1) = (d, q-1) = 1 (один з можливих способів виконати цю умову, вибрати d більше ніж p / 2 і q / 2). Шифрування здійснюється за формулою:
f (M) ≡ M d mod n,
де M і f (M) обидва ≤ n-1. Як було показано, може бути обчислено за розумний час, навіть якщо M, d і n містить дуже великий число знаків. Адресат обчислює M на основі M d, використовуючи своє знання p і q. У відповідність зі слідством, якщо
dc ≡ (p-1) 1, тоді (M d) ep 1.
Оригінальний текст M виходить адресатом із зашифрованого F (M) шляхом перетворення: M = (F (M)) e (mod pq). Тут як вихідний текст, так і зашифрований розглядаються як довгі двійкові числа.
Аналогічно (M d) eq M, якщо dc ≡ (q-1) 1. E задовольняє цим двом умовам, якщо cd ≡ (p-1) (q-1) 1. Теорема 1 говорить, що ми можемо дозволити e = x, коли x є рішенням рівняння dx + (p-1) (q-1) y = 1.
Так як (M d) e - M ділимо на p і q, воно ділимо і на pq, отже, ми можемо визначити M, знаючи M d, обчисливши його значення в ступені e і визначивши залишок від ділення на pq. Для дотримання секретності важливо, щоб, знаючи n, було не можна обчислити p і q. Якщо n містить 100 цифр, підбір шифру пов'язаний з перебором ~ жовтня 1950 комбінацій. Дана проблема вивчається вже близько 100 років. RSA-алгоритм запатентований (20 вересня 1983, діє до 2000 року).
Теоретично можна припустити, що можливе виконання операції f -1, не вважаючи p і q. Але в будь-якому випадку завдання це не проста і розробники вважають її важко факторізуемой.
Припустимо, що ми маємо зашифрований текст f (M) і початковий текст M, і ми хочемо знайти значення p і q. Неважко показати, що таких вихідних даних для вирішення завдання недостатньо - треба знати всі можливі значення M i.
Прояснимо використання алгоритму RSA на конкретному прикладі. Вибираємо два прості числа p = 7; q = 17 (на практиці ці числа у багато разів довше). У цьому випадку n = p * q дорівнюватиме 119. Тепер необхідно вибрати e, вибираємо e = 5. Наступний крок пов'язаний з формуванням числа d так, щоб d * e = 1 mod [(p-1) (q-1)]. d = 77 (використаний розширений алгоритм Евкліда). d - секретний ключ, а e і n характеризують відкритий ключ. Нехай текст, який нам потрібно зашифрувати представляється M = 19. С = M e mod n. Отримуємо зашифрований текст C = 66. Цей "текст" може бути посланий відповідному адресату. Одержувач дешифрує отримане повідомлення, використовуючи М = C d mod n і C = 66. У результаті виходить M = 19.
На практиці загальнодоступні ключі можуть поміщатися в спеціальну базу даних. При необхідності послати партнерові зашифроване повідомлення можна зробити спочатку запит його відкритого ключа. Отримавши його, можна запустити програму шифрации, а результат її роботи послати адресату. На використанні загальнодоступних ключів базується і так звана електронна підпис, що дозволяє однозначно ідентифікувати відправника. Подібні засоби можуть застосовуватися для запобігання внесення будь-яких коректив в повідомлення на шляху від відправника до одержувача. Швидкодіючі апаратні 512-бітові модулі можуть забезпечити швидкість шифрування на рівні 64 кбіт за сек. Готуються ІС, здатні виконувати такі операції зі швидкістю 1 Мбайт / сек. Розумний вибір параметра e дозволяє помітно прискорити реалізацію алгоритму.
2.2.3 ElGamal
Розроблений в 1985 році. Названий на прізвище автора - Ель-Гамаль. Алгоритм Ель-Гамаля може використовуватися для формування електронного підпису або для шифрування даних. Він базується на труднощі обчислення дискретного логарифма. Для генерації пари ключів спочатку береться просте число p і два випадкових числа g і x, кожне з яких менше p. Потім обчислюється:
y = g x mod p
Загальнодоступними ключами є y, g і p, а секретним ключем є х. Для підпису повідомлення M вибирається випадкове число k, яке є простим по відношенню до p-1. Після цього обчислюється a = g k mod p. Далі з рівняння M = (xa + kb) mod (p-1) знаходимо b. Електронної підписом для повідомлення M буде служити пара a і b. Випадкове число k слід зберігати в секреті. Для верифікації підпису необхідно перевірити рівність:
y a a b mod p = g M mod p.
Пара a і b представляють собою зашифрований текст. Слід зауважити, що зашифрований текст має розмір у два рази більше вихідного. Для дешифрування виробляється обчислення:
M = b / a x mod p
2.3 Порівняння cімметрічних і аcімметрічних алгоритмів шифрування
В асиметричних системах необхідно застосовувати довгі ключі (512 бітів і більше). Довгий ключ різко збільшує час шифрування. Крім того, генерація ключів дуже тривала. Зате розподіляти ключі можна по незахищених каналах.
У симетричних алгоритмах використовують більш короткі ключі, тобто шифрування відбувається швидше. Але в таких системах складно розподіл ключів.
Тому при проектуванні захищеної системи часто застосовують і cімметрічние, і аcімметрічние алгоритми. Так як система з відкритими ключами дозволяє розподіляти ключі і в симетричних системах, можна об'єднати в системі передачі захищеної інформації асиметричний і симетричний алгоритми шифрування. За допомогою першого розсилати ключі, другим же - власне шифрувати передану інформацію
Обмін інформацією можна здійснювати наступним чином:
· Одержувач обчислює відкритий і секретний ключі, секретний ключ зберігає в таємниці, відкритий ж робить доступним;
· Відправник, використовуючи відкритий ключ отримувача, зашифровує сеансовий ключ, який пересилається одержувачу по незахищеному каналу;
· Одержувач отримує сеансовий ключ і розшифровує його, використовуючи свій секретний ключ;
· Відправник зашифровує повідомлення сеансовим ключем і пересилає одержувачу;
· Одержувач отримує повідомлення і розшифровує його.
Треба зауважити, що в урядових і військових системах зв'язку використовують лише симетричні алгоритми, так як немає строго математичного обгрунтування стійкості систем з відкритими ключами, як, втім, не доведено і зворотне.
2.4 Використання інструментів криптографії в Delphi-додатках
2.4.1 CryptoAPI
Криптографічні функції є частиною операційної системи Windows, і звернеться до них можна за допомогою інтерфейсу CryptoAPI. Основні можливості доступні ще з Windows 95, але з часом вони розширювалися. Опис функцій CryptoAPI можна знайти в MSDN, або в довідковому файлі до Delphi. Функції міститися в бібліотеках advapi32.dll і crypt32.dll.
2.4.2 Підключення до криптопровайдери. Контейнери ключів
Перша функція, яку ми розглянемо, буде
function CryptAcquireContext (phProv: PHCRYPTPROV;
pszContainer: LPAWSTR;
pszProvider: LPAWSTR;
dwProvType: DWORD;
dwFlags: DWORD): BOOL; stdcall;


У більшості випадків, робота з криптографічними можливостями Windows починається з виклику саме цієї функції, що виконує підключення до криптопровайдери і повертає його дескриптор в параметрі phProv. Криптопровайдер представляє собою dll, незалежний програмний модуль, який фактично виконує криптографічні алгоритми. Криптопровайдери бувають різні і відрізняються складом функцій (наприклад, деякі криптопровайдери обмежуються лише цифровими підписами), використовуваними алгоритмами (деякі шифрують алгоритмом RC2, інші - DES) та іншими можливостями. У кожній операційній системі свій склад криптопровайдерів, проте в кожній присутній Microsoft Base Cryptographic Provider v1.0. При виконанні функції CryptAcquireContext, необхідно вказати ім'я провайдера і його тип (відповідно в параметрах pszProvider і dwProvType). Тип провайдера визначає склад функцій і підтримувані криптоалгоритми, наприклад:
Тип PROV_RSA_FULL
· Обмін ключами - алгоритм RSA
· Цифровий підпис - алгоритм RSA
· Шифрування - алгоритм RC2 і RC4
· Хешування - алгоритми MD5 і SHA
Тип PROV_RSA_SIG
· Обмін ключами - не підтримується
· Цифровий підпис - алгоритм RSA
· Шифрування - не підтримується
· Хешування - алгоритми MD5 і SHA
Microsoft Base Cryptographic Provider v1.0 відноситься до типу PROV_RSA_FULL і для цього типу використовується за умовчанням (якщо в параметрі pszProvider вказати nil). У пункті pszContainer необхідно вказати ім'я контейнера ключів, який ми збираємося використовувати. Справа в тому, що кожен криптопровайдер містить базу даних, в якій зберігаються ключі користувачів. Ці ключі групуються в контейнерах. Зберігаються тільки ключові пари для асиметричних алгоритмів, сеансові ключі не зберігаються, тому що їх не рекомендують використовувати повторно. Таким чином, кожен контейнер має ім'я і містить по одному ключу (точніше парі відкритий-закритий ключ) для цифрового підпису та обміну ключами. У залежності від криптопровайдера, база даних може зберігатися у файлах, реєстрі або в будь-яких апаратних засобах, але це не впливає на роботу програміста з контейнерами ключів. Якщо в якості параметра pszContainer вказати nil, то буде використовуватися контейнер ключів, назва якого збігається ім'ям користувача, під яким було здійснено вхід в систему. Але так робити не рекомендується: справа в тому, що якщо два додатки використовує один і той же контейнер, одне з них може змінити або знищити ключі, необхідні для коректної роботи іншої програми. Тому рекомендують використовувати контейнери, імена яких збігається з ім'ям програми.
Параметр dwFlags може бути нульовим або приймати одне з наступних значень:
CRYPT_VERIFYCONTEXT - цей прапор призначений для додатків, які не повинні мати доступ до закритих ключів контейнера. Такі програми можуть звертатися тільки до функцій хешування, перевірки цифрового підпису або симетричного шифрування. У цьому випадку параметр pszContainer повинен бути рівний nil.
CRYPT_NEWKEYSET - створює новий контейнер ключів, але самі ключі не створюються.
CRYPT_DELETEKEYSET - видаляє контейнер разом з зберігаються там ключами. Якщо задано цей прапор, то підключення до криптопровайдери не відбувається і параметр phProv невизначений.
CRYPT_MACHINE_KEYSET - за замовчуванням контейнери ключів зберігаються як користувацькі. Для основних криптопровайдерів це означає, що контейнери ключів зберігаються в призначених для користувача профілях. Цей прапор можна встановлювати в комбінації з іншими, щоб вказати, що контейнер є машинним, тобто зберігається в профілі All Users.
У разі успіху, функція повертає true, у противному випадку - false. GetLastError поверне код помилки.
function CryptReleaseContext (hProv: HCRYPTPROV;
dwFlags: DWORD): BOOL; stdcall;


Звільняє контекст криптопровайдера і контейнера ключів. hProv - дескриптор криптопровайдера, отриманий при виклику CryptAcquireContext. dwFlags - зарезервований і має дорівнювати нулю.
У разі успіху, функція повертає true, у противному випадку - false. GetLastError поверне код помилки.
Наведемо приклад роботи з цими функціями:
uses Wcrypt2;
...
procedure CryptProc;
var
Prov: HCRYPTPROV;
begin
CryptAcquireContext (@ Prov, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
/ / Працюємо з функціями CryptoAPI
...
CryptReleaseContext (Prov, 0);
end;


2.4.3 Шифрування на основі призначених для користувача даних або пароль
Для шифрування в CryptoAPI використовуються симетричні алгоритми, ключ для яких може бути отриманий двома шляхами: випадковим чином або на основі яких-небудь даних користувача, наприклад, пароль. Причому до останнього варіанту генерації ключа є одна важлива вимога: при використанні одних і тих же паролів повинні виходити ідентичні ключі. Така можливість передбачена в CryptoAPI.
function CryptDeriveKey (hProv: HCRYPTPROV;
Algid: ALG_ID;
hBaseData: HCRYPTHASH;
dwFlags: DWORD;
phKey: PHCRYPTKEY): BOOL; stdcall;


У пункті hProv потрібно вказати дескриптор провайдера, отриманий за допомогою CryptAcquireContext. Algid - ідентифікатор алгоритму, для якого генерується ключ. Для Microsoft Base Cryptographic Provider може приймати такі значення: CALG_RC2 і CALG_RC4. Дані користувача (пароль) попередньо хешіруются і дескриптор хеш-об'єкта передається у функцію як параметр hBaseData. Старші 16 біт параметра dwFlags можуть містити розмір ключа в бітах або бути нульовими (у цьому випадку буде створено ключ з розміром за умовчанням). Молодші 16 біт можуть бути нульовими або приймати такі значення або їх комбінації: CRYPT_EXPORTABLE, CRYPT_CREATE_SALT, CRYPT_USER_PROTECTED, CRYPT_UPDATE_KEY. До перших двох ми ще повернемося, а зі змістом інших ви можете ознайомитися самостійно. У пункті phKey повертається дескриптор створеного ключа.
У разі успіху, функція повертає true, у противному випадку - false. GetLastError поверне код помилки.
Коли ключ є, можна приступати безпосередньо до шифрування. Для цього нам знадобляться функції CryptEncrypt і CryptDecrypt.
function CryptEncrypt (hKey: HCRYPTKEY;
hHash: HCRYPTHASH;
Final: BOOL;
dwFlags: DWORD;
pbData: PBYTE;
pdwDataLen: PDWORD;
dwBufLen: DWORD): BOOL; stdcall;


У пункті hKey передається дескриптор ключа, необхідний для шифрування. Цей ключ також визначає алгоритм шифрування. Параметр hHash використовується, якщо дані одночасно шифруються і хешіруются (шифруватися і хешіроваться будуть вихідні дані). У цьому випадку в параметрі hHash передається дескриптор заздалегідь створеного хеш-об'єкта. Цю можливість зручно використовувати, якщо необхідно одночасно зашифрувати і підписати повідомлення. Інакше цей параметр слід встановити в нуль. Параметр Final слід встановити в true, якщо переданий у функцію блок даних є єдиним або останнім. У цьому випадку він буде доповнений до необхідного розміру. Параметр dwFlags не використовується в Microsoft Base Cryptographic Provider і на його місці слід указати нуль. pbData - покажчик на буфер, в якому міститися дані для зашифрування. Зашіфрованиие дані містяться в той же буфер. pdwDataLen - розмір даних, які будуть зашифровані. dwBufLen - розмір вихідного буфера, для блокових шифрів може бути більше, ніж pdwDataLen. Дізнатися необхідний розмір, можна передавши в параметрі pbData nil, в параметрі pdwDataLen - розмір даних, які необхідно зашифрувати, а в параметрі dwBufLen - що завгодно, наприклад нуль. Після такого виклику, необхідний розмір буфера буде міститися в параметрі pdwDataLen (саме pdwDataLen, а не dwBufLen, трохи нелогічно, ну да ладно). Щоб не було плутанини, наведемо приклад:
var
Message: String;
BufLen, DataLen: DWORD;
...
begin
...
Message: = 'Hello World!';
BufLen: = Length (Message);
DataLen: = Length (Message);
/ / Обчислюємо необхідний розмір вихідної буфера
CryptEncrypt (Key, 0, true, 0, nil, @ BufLen, 0);
/ / Виділяємо пам'ять для буфера і шифруємо
SetLength (Message, BufLen);
CryptEncrypt (Key, 0, true, 0, PByte (Message), @ DataLen, BufLen);


Тепер, розглянемо функцію, яка дозволяє розшифрувати повідомлення.

function CryptDecrypt (hKey: HCRYPTKEY;
hHash: HCRYPTHASH;
Final: BOOL;
dwFlags: DWORD;
pbData: PBYTE;
pdwDataLen: PDWORD): BOOL; stdcall;


У параметр pdwDataLen потрібно передати число байт шіфротекста, а після виклику в нього буде поміщена довжина відкритого повідомлення. Якщо використовується параметр hHash, то дані після розшифровки хешіруются. Це зручно використовувати, якщо потрібно одночасно розшифрувати повідомлення і перевірити підпис.
Після того, як робота з ключем закінчена, необхідно звільнити дескриптор:
function CryptDestroyKey (hKey: HCRYPTKEY): BOOL; stdcall;


Якщо hKey відноситься до сеансовому ключу або імпортованого відкритого ключа (про це нижче), то дескриптор звільняється, а ключ знищується. Якщо hKey відноситься до пари відкритий / закритий ключ, то дескриптор звільняється, а ключова пара зберігається в контейнері ключів.
Тільки що ми розглянули випадок, коли для зашифровки і розшифровки повідомлення відправник та одержувач використовували пароль, відомий тільки їм. Зараз розглянемо інший: відправник генерує ключ випадково і передає його одержувачеві у зашифрованому вигляді разом із повідомленням. При цьому для шифрування сеансового ключа використовується відкритий ключ одержувача. А де відправник його візьме?
Як вже було сказано, при створенні ключового контейнера за допомогою функції CryptAcquireContext, ключі в контейнері не створюються, їх потрібно згенерувати окремо. Розглянемо функцію:
function CryptGenKey (hProv: HCRYPTPROV;
Algid: ALG_ID;
dwFlags: DWORD;
phKey: PHCRYPTKEY): BOOL; stdcall;


Функція призначена для генерації випадкових сеансових ключів і ключових пар. Параметри цієї функції аналогічні однойменним параметрами функції CryptDeriveKey, за винятком того, що Algid може також приймати значення AT_KEYEXCHANGE і AT_SIGNATURE. У цьому випадку будуть згенеровані ключові пари відповідно для обміну ключами та цифрового підпису. Створення нового ключового контейнера повинен виглядати приблизно так:
uses Wcrypt2;
...
var
Prov: HCRYPTPROV;
ExchangeKey, SignKey: HCRYPTKEY;
begin
CryptAcquireContext (@ Prov, 'My_Container', nil, PROV_RSA_FULL, CRYPT_NEWKEYSET);
/ / Створюємо ключові пари
CryptGenKey (Prov, AT_KEYEXCHANGE, 0, @ ExchangeKey);
CryptGenKey (Prov, AT_SIGNATURE, 0, @ SignKey);
/ / Працюємо з функціями CryptoAPI
...
/ / Звільняємо дескриптори ключових пар. Самі ключі зберігаються в контейнері
CryptDestroyKey (SignKey);
CryptDestroyKey (ExchangeKey);
CryptReleaseContext (Prov, 0);
end;


Створені таким чином ключові пари, згодом можна витягти з контейнера, скориставшись функцією

function CryptGetUserKey (hProv: HCRYPTPROV;
dwKeySpec: DWORD;
phUserKey: PHCRYPTKEY): BOOL; stdcall;
 

Параметр dwKeySpec може приймати два значення: AT_KEYEXCHANGE і AT_SIGNATURE, значення яких очевидні. Дескриптор ключа повертається в параметрі phUserKey.
Тепер відповімо на запитання, як відправник зможе передати одержувачу свою відкриту частину ключа.
function CryptExportKey (hKey: HCRYPTKEY;
hExpKey: HCRYPTKEY;
dwBlobType: DWORD;
dwFlags: DWORD;
pbData: PBYTE;
pdwDataLen: PDWORD): BOOL; stdcall;


Функція дозволяє експортувати ключ в двійковий буфер, який згодом можна буде зберегти у файл і передати кому-небудь. У пункті hKey повинен міститися дескриптор експортованого ключа. Експортувати можна не тільки відкриті ключі, а також ключові пари цілком і сеансові ключі. В останніх двох випадках, ключі і ключові пари повинні бути створені функціями CryptGenKey або CryptDeriveKey з параметрами dwFlags рівними CRYPT_EXPORTABLE. Відкриті ж ключі завжди експортується. Сеансові ключі і ключові пари експортуються тільки в зашифрованому вигляді. Параметр hExpKey визначає ключ, яким вони будуть зашифровані. Якщо експортується відкрита частина ключа, то цей параметр слід встановити в нуль, якщо експортується ключова пара цілком, то тут зазвичай передають дескриптор сеансового ключа (зазвичай отриманий за допомогою CryptDeriveKey), яким пара буде зашифрована, якщо експортується сеансовий ключ, то зазвичай він шифрується відкритим ключем одержувача (зазвичай використовується ключ обміну, але ніхто не забороняє використовувати ключ підпису). Параметр dwBlobType визначає тип експортованого ключа і може приймати такі значення: SIMPLEBLOB - сеансовий ключ, PUBLICKEYBLOB - відкритий ключ, PRIVATEKEYBLOB - ключова пара цілком. Існують і інші значення, але вони не підтримуються стандартним криптопровайдером. Параметр dwFlags для Microsoft Base Cryptographic Provider повинен бути рівний нулю. pbData - буфер, куди будуть скопійовані дані, pdwDataLen - розмір цього буфера. Якщо він заздалегідь не відомий, то можна вказати як параметр pbData nil, і в pdwDataLen буде отриманий необхідний розмір.
Ось приклад експорту відкритого ключа:
procedure ExportPublicKey (FileName: TFileName);
var
Prov: HCRYPTPROV;
SignKey: HCRYPTKEY;
Stream: TMemoryStream;
BufSize: DWORD;
begin
CryptAcquireContext (@ Prov, 'My_Container', nil, PROV_RSA_FULL, 0);
CryptGetUserKey (Prov, AT_SIGNATURE, @ SignKey);
Stream: = TMemoryStream.Create;
CryptExportKey (SignKey, 0, PUBLICKEYBLOB, 0, nil, @ BufSize);
Stream.SetSize (BufSize);
CryptExportKey (SignKey, 0, PUBLICKEYBLOB, 0, PByte (Stream.Memory), @ BufSize);
Stream.SaveToFile (FileName);
Stream.Free;
CryptDestroyKey (SignKey);
CryptReleaseContext (Prov, 0);
end;


Імпорт ключа здійснюється за допомогою функції
function CryptImportKey (hProv: HCRYPTPROV;
pbData: PBYTE;
dwDataLen: DWORD;
hPubKey: HCRYPTKEY;
dwFlags: DWORD;
phKey: PHCRYPTKEY): BOOL; stdcall;
 

У пункті hPubKey необхідно передати дескриптор ключа, яким буде розшифровано імпортований ключ. Якщо імпортується ключова пара цілком, то параметр dwFlags можна встановити в CRYPT_EXPORTABLE, тоді імпортована пара може бути згодом також експортована. У пункті phKey повернеться дескриптор отриманого ключа. Якщо це ключова пара, то вона буде збережена в контейнері.
Ось приклад імпорту відкритого ключа:
function ImportPublicKey (FileName: TFileName): HCRYPTKEY;
var
Prov: HCRYPTPROV;
Stream: TMemoryStream;
begin
Stream: = TMemoryStream.Create;
Stream.LoadFromFile (FileName);
CryptImportKey (Prov, PByte (Stream.Memory), Stream.Size, 0,0, @ Result);
Stream.Free;
end;


Тепер, скориставшись цією інформацією, ми легко зможемо відновити пропущені фрагменти у функції перевірки цифрового підпису, описаної раніше.
Отже, як же передати співрозмовнику зашифроване повідомлення:
· Одержувач експортує свій відкритий ключ обміну в файл і передає його відправнику повідомлення.
· Відправник генерує випадковий сеансовий ключ і шифрує їм повідомлення.
· Відправник імпортує відкритий ключ обміну одержувача, експортує сеансовий ключ, шифруючи його отриманим ключем обміну (ключ обміну в параметрі hExpKey).
· Зашифроване повідомлення передається разом із зашифрованим сеансовим ключем - так званий цифровий конверт.
· Одержувач імпортує сеансовий ключ, розшифровуючи його своїм закритим ключем обміну (його можна отримати, викликавши CryptGetUserKey) і за допомогою сеансового ключа розшифровує повідомлення.
Говорячи про сеансових ключах, що використовуються в Microsoft Base Cryptographic Provider потрібно згадати про одну неприємності: до початку 2000 року діяла заборона на експорт програмного забезпечення, що використовує засоби "сильної криптографії" за межами США і Канади. З цієї причини в базовому криптопровайдери не підтримуються ключі для симетричних алгоритмів довжиною більше 40 біт. Ключі довжиною 56 біт дозволялося використовувати тільки закордонним відділенням американських компаній. Для алгоритмів RC2 і RC4 рекомендована довжина ключа повинна становити 128 біт, тому відсутню кількість біт заповнюється нулями або випадковими значеннями, які повинні передаватися відкрито. Надійність захисту через це, зрозуміло, сильно страждає. До складу Windows XP входить Microsoft Enhanced Cryptographic Provider, в якому цієї проблеми немає, але при використанні базового криптопровайдера, необхідно доповнювати ключ до потрібної довжини, використовуючи т.зв. Солт-значення (salt-values). Згенерувати salt-value і внести його в ключ можна кількома способами, але самий простий і очевидний - при виклику CryptGenKey або CryptDeriveKey передати в параметрі dwFlags значення CRYPT_CREATE_SALT, приблизно так:
CryptGenKey (Prov, CALG_RC2, CRYPT_EXPORTABLE or CRYPT_CREATE_SALT, @ Key);


При експорті ключа Солт-значення не зберігається, про нього повинен подбати сам програміст.

var
SaltLen: DWORD;
Stream: TMemoryStream;
...
begin
...
/ / Визначаємо розмір буфера для Солт-значення
CryptGetKeyParam (Key, KP_SALT, nil, @ SaltLen, 0);
/ / Зберігаємо його в файл
Stream: = TMemoryStream.Create;
Stream.SetSize (SaltLen);
CryptGetKeyParam (Key, KP_SALT, PByte (Stream.Memory), @ SaltLen, 0);
Stream.SaveToFile ('Salt.dat');
Stream.Free;
...
 

Збережене таким чином Солт-значення необхідно передати разом з сеансовим ключем, а на приймальній стороні "вживити" його туди знову.
var
Stream: TMemoryStream;
...
begin
...
Stream: = TMemoryStream.Create;
Stream.LoadFromFile ('Salt.dat');
CryptSetKeyParam (Key, KP_SALT, PByte (Stream.Memory), Stream.Size);
Stream.Free;
...


2.5 Постановка завдання
Розробити програму шифруючу і дешифрує введений користувачем текст. Забезпечити введення і виведення інформації за допомогою файлів. Забезпечити достатню кріптоустойчівость шифру.

2.6 Реалізація завдання

2.6.1 Коротка характеристика середовища Delphi 7

Середовище програмування Delphi 7 дозволяє реалізувати поставлене завдання з усіма необхідними вимогами. У середовищі використовується мова Object Pascal. Delphi 7 є об'єктно-орієнтованої середовищем, що спрощує створення однакового інтерфейсу і введення-виведення інформації з файлу.

2.6.2 Алгоритм рішення задачі

Програма являє собою шіфровщікі і дешифрувальник одночасно.
Використовується метод симметрического кодування, тобто кодування і декодування здійснюється за допомогою одного ключа. Для забезпечення кріптоустойчівості необхідний довгий ключ. Користувач вводить 30-символьний код. Блоками по 10 цифр. З них генерується код наступним чином:
Беруться перші цифри з 1-го, 2-го ,3-го блоків, і залежно від 3-го блоку над ними проводяться операції складання або множення. Потім береться наступна цифра 3-го блоку, після повного завершення циклу по 3-му блоку береться наступна цифра з другого блоку і т.д. Гаммирование завершується після проходження по циклу останньої цифри 1-го блоку. Результатом є код складається з 1000 незалежних, неповторюваних і Незакономірні цифр. Шифр можливо розкрити тільки повним перебором, що забезпечує достатню кріптоустойчівость.

Модулі програми

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

Модуль шифрування / дешифрування

Взяття кодових цифр з блоків
Читання окремого символу вих. тексту
Кодування
символу
Кінець вих. тексту
Зберегти. результату


s1: = memo1.Text;
k: = length (s);
k1: = length (s1);
k3: = length (s3);
k5: = length (s5);
m: = 1;
m3: = 1; m5: = 1;
for i: = 1 to k1 do
begin
q: = false;
i5: = strtoint (s [m]);
i2: = strtoint (s3 [m3]);
i3: = strtoint (s5 [m5]);
i1: = kod (i5, i2, i3);
if i1 = 0 then i1: = 10;
case s1 [i] of
'A' .. 'z': begin c1: = perevod (s1 [i], i1, 96,122); q: = true; end;
'A' .. 'Z': begin c1: = perevod (s1 [i], i1, 64,90); q: = true; end;
'А' .. 'Я': begin c1: = perevod (s1 [i], i1, 191,223); q: = true; end;
'А' .. 'я': begin c1: = perevod (s1 [i], i1, 223,255); q: = true; end;
end;
if q = true then
begin
{If ord (s1 [i]) + i1> 255 then}
s2: = s2 + c1;
{Else
s2: = s2 + chr (ord (s1 [i]) + i1);}
end
else s2: = s2 + s1 [i];
q1: = false;
if m5 = k5 then begin m5: = 1; q1: = true; end
else inc (m5);
q2: = false;
if (q1 = true) then
begin
inc (m3);
end;
if m3> = k3 then begin m3: = 1; q2: = true end;
if (q2 = true) then m: = m +1;
if m> = k then m: = 1;
end;
{Delete (s2, k1-1, 2)}
memo2.Text: = s2;
 


Процедура кодування символу

begin
if abs (i1)> y-x +1 then
repeat
i1: = i1 mod (y-x +1);
until i1 <(y-x +1);
if ord (c) + i1> y then
perevod: = chr (x + (ord (c) + i1-y))
else
perevod: = chr (ord (c) + i1)
end;


2.6.3 Таблиця повідомлень

У ході роботи користувач може отримати повідомлення:
«Пароль не підтверджений» - слід переконатися в правильності пароля в дублюючих та основних полях.

Висновок
Обгрунтований вибір тієї чи іншої системи захисту повинен спиратися на якісь критерії ефективності. На жаль, до цих пір не розроблені відповідні методики оцінки ефективності криптографічних систем.
Найбільш простий критерій такої ефективності - імовірність розкриття ключа або потужність множини ключів (М). По суті це те ж саме, що і кpіптостойкость. Для її чисельної оцінки можна використовувати також і складність розкриття шифру шляхом перебору всіх ключів. Однак, цей критерій не враховує інших важливих вимог до криптосистемам:
· Неможливість розкриття або осмисленої модифікації інформації на основі аналізу її структури,
· Досконалість використовуваних протоколів захисту,
· Мінімальний обсяг використовуваної ключової інформації,
· Мінімальна складність реалізації (у кількості машинних операцій), її вартість,
· Висока оперативність.
У будь-якому випадку обраний комплекс кpіптогpафіческіх методів повинен поєднувати як зручність, гнучкість і оперативність використання, так і надійний захист від зловмисників циркулюючої в ІС інформації. Тому на даний момент найбільш оптимальні змішані кріптосісітеми, в яких текст кодується симетрично, а ключ кодується асиметричною і міститься разом з кодованим текстом.
Шифрування інформації не є панацеєю. Його слід розглядати тільки як один з методів захисту інформації і застосовувати обов'язково в поєднанні з законодавчими, організаційними та іншими заходами.

Література
1. Водолазський В. Комерційні системи шифрування: основні алгоритми та їх реалізація. Частина 1. / / Монітор. - 1992. - N 6-7. - C. 14 - 19.
2. Ігнатенко Ю.І. Як зробити так, щоб? .. / / Світ ПК. - 1994. - N 83. Ковалевський В., Максимов В. Криптографічні методи. / / КомпьютерПресс. - 1993. - N 5. - C. 31 - 34.
4. Мафтік С. Механізми захисту в мережах ЕОМ. - М.: Світ, 1993.
5. Спесивцев А.В., Вегнер В.А., Крутяк А.Ю. та ін Захист інформації в персональних ЕОМ. - M.: Радіо і зв'язок, 1992.
6. Сяо Д., Керр Д., Меднік С. Захист ЕОМ. - М.: Світ, 1982.
7. Шмельова О. Грим - що це? / / Hard'н'Soft. - 1994. - N 5.
8. ГОСТ 28147-89. Системи обробки інформації. Захист криптографічний. Алгоритм криптографічного перетворення.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
108.5кб. | скачати


Схожі роботи:
Шифрування і дешифрування даних за допомогою симетричних криптографічних алгоритмів
Законодавство про захист персональних даних працівника
Використання сучасних симетричних DES і асиметричних алгоритмів шифрування RSA
Технологія захисту персональних даних
Правова природа персональних даних працівника
Основні положення Федерального закону Про персональних даних
Аналіз алгоритмів нечисельних обробки даних
Захист даних і адміністрування бази даних
Захист прав за допомогою страйку
© Усі права захищені
написати до нас