
- •Основні положення теорії алгоритмів та її застосування
- •Введення до теорії алгоритмів
- •Загальні риси алгоритмів
- •Машина Поста
- •Машина т’юринга
- •Основи лямбда-числення та функціонального програмування
- •Теза Черча-т’юринга про алгоритмічну розв’язність задачі
- •Проблема розв’язності (зависання)
- •Алгоритмічно нерозв’язні задачі
- •Проблема відсутності загального методу вирішення задачі
- •Проблема інформаційної невизначеності задачі
- •Проблема логічної нерозв’язності задачі
- •Побудова машини т’юринга для обчислення деяких простих функцій
- •Введення до оцінки складності алгоритмів
- •Визначення порядку складності алгоритму
- •Оптимізація алгоритмів
- •Структури даних в алгоритмічній мові програмування
- •Визначення алгоритмічної мови програмування
- •Базові елементи сучасної мови програмування: типи даних; екземпляри даних; вирази; оператори; функції; класи.
- •Поняття типу даних
- •Прості типи: числові; символьні; логічні.
- •Тип даних рядок
- •Структуровані типи даних: масиви, записи, множини
- •Типи даних за значенням і за посиланням
- •Сумісність типів та перетворення між типами даних
- •Екземпляри даних: змінні, константи
- •Видимість даних
- •Управління ходом виконання та структурування програм в алгоритмічній мові програмування
- •Вирази, операнди та операції
- •Основні операції: арифметичні; логічні; бульові; з використанням рядків
- •Поняття оператора
- •Прості оператори: присвоювання; виклику функції
- •Оператори управління ходом виконання: розгалуження; вибору; цикли; переходу
- •Структурування програм: функції та класи
- •Параметри функцій: вхідні, результуючі.
- •Рекурсивні функції
- •Файли: текстові, бінарні
- •Алгоритми чисельних методів, апроксимації функцій, інтегрування та вирішення рівнянь з одним невідомим
- •Чисельні методи
- •Особливості вирішення задач чисельними методами, точність та коректність рішень
- •Апроксимації функцій: лінійна інтерполяція; інтерполяційний многочлен Ньютона.
- •Чисельне інтегрування: метод трапецій; метод Сімпсона; метод Сімпсона з оцінкою погрішності.
- •Вирішення рівнянь з одним невідомим: метод простих ітерацій; метод Ньютона; метод парабол.
- •Алгоритми вирішення системи лінійних рівнянь, пошуку екстремуму функції
- •Вирішення системи лінійних рівнянь методом Гауса
- •Пошук екстремуму функцій одної змінної: метод золотого перетину; метод парабол.
- •Пошук екстремуму функцій багатьох змінних: метод координатного спуску; метод найскорішого спуску.
- •Алгоритми обробки масивів
- •Визначення масивів
- •Операції над масивами
- •Упорядкування масивів: сортування вибором; сортування вставкою; бульбашкове сортування; сортування методом Шелла; метод швидкого сортування.
- •Вибір методів сортування
- •Пошук в упорядкованих масивах методом половинного поділу, інтерполяційним методом
- •Застосування індексів для пошуку у невпорядкованих даних
- •Алгоритми обробки даних на основі списків та дерев
- •Визначення списку
- •Види списків: незалежні списки, однозв’язані списки; двозв’язані списки; кільцеві списки; упорядковані списки
- •Основні операції над списками: включення елементу до списку; видалення елементу; перехід між елементами; ітератор для списку
- •Упорядкування та пошук в списках
- •Похідні структури даних: черга, стек, дек
- •Визначення дерева
- •Впорядковані дерева
- •Бінарні дерева
- •Основні операції з бінарними деревами: включення елементу; видалення елементу; обхід дерева
- •Балансування дерева
- •Алгоритми обробки текстових даних на основі регулярних виразів
- •Введення до теорії кінцевих автоматів
- •Графічне представлення кінцевих автоматів
- •Використання кінцевого автомату: синтаксичний аналіз.
- •Реалізація синтаксичного аналізу файлу з розділяючими комами
- •Детерміновані та недетерміновані кінцеві автомати
- •Регулярні вирази
- •Форма Бекуса-Наура для запису регулярних виразів
- •Синтаксичний аналіз регулярних виразів
- •Компіляція регулярних виразів
- •Інструменти для спрощення роботи з регулярними виразами
- •Зіставлення рядків з регулярними виразами.
- •Алгоритми систем числення
- •Введення до систем числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Системи числення з нетрадиційними основами
- •Перетворення між різними системами числення
- •Арифметика чисел з плаваючою комою
- •Точність операцій з плаваючою комою
- •Арифметика великих чисел
- •Алгоритми криптографії та хешування
- •Значення випадкових чисел у програмуванні
- •Алгоритми генерації рівномірно розподілених псевдовипадкових чисел
- •Перевірка якості випадкових чисел
- •Кодування з виправленням помилок
- •Стиснення даних
- •Стиснення даних зі словником
- •Алгоритм стиснення даних Лемпела-Зіва
- •Введення до криптографії
- •Елементи теорії порівнянь
- •Шифрування за допомогою випадкових чисел
- •Створення таємного ключа по Діффі-Хеллману
- •Система rsa
- •Алгоритми цифрового підпису
- •Введення до хешування
- •Функції хешування
- •Проста функція хешування рядків
- •Функції хешування з використанням рандомізації
- •Вирішення конфліктів за допомогою лінійного зондування
- •Псевдовипадкове зондування
- •Подвійне хешування
Шифрування за допомогою випадкових чисел
Використання генератора псевдовипадкових чисел на стороні, яка шифрує повідомлення і стороні, яка дешифрує його, за умов ідентичності алгоритму і початкового значення може бути використано для найпростішого шифрування.
Отримані таким чином псевдовипадкові числа за допомогою оператора XOR застосовуються над даними. Після передачі в процесі розшифрування слід заново перегенерувати числа і повторити операцію XOR.
У такому разі система є захищеною до тих пір, доки зловмиснику невідомий алгоритм генерації чисел і початкове число.
Створення таємного ключа по Діффі-Хеллману
Алгоритм Діффі-Хеллмана використовується для створення (передачі) таємного ключа для шифрування незахищеними каналами зв’язку
Система rsa
Безпека алгоритму RSA побудована на принципі складності факторизації. Алгоритм використовує два ключі — відкритий (public) і секретний (private), разом відкритий і відповідний йому секретний ключі утворюють пари ключів (keypair). Відкритий ключ не потрібно зберігати в таємниці, він використовується для шифрування даних. Якщо повідомлення було зашифровано відкритим ключем, то розшифрувати його можна тільки відповідним секретним ключем.
Алгоритми цифрового підпису
Введення до хешування
Хешування – перетворення вхідного масиву даних довільної довжини в результуючу послідовність (як правило, фіксованої довжини) таким чином, щоб будь-які зміни вхідних даних приводили до непередбачуваних змін результуючих даних.
Такі перетворення називаються хеш-функціями чи хеш-перетвореннями, а їх результати – хешем, хеш-кодом чи дайджестом повідомлення.
Розрахунок контрольної суми повідомлення – окремий випадок хеш-функції.
Колізії – ситуації, коли для різних вхідних даних формуються однакові хеш-коди. Для якісної функції хешування ймовірність колізій має бути мінімальною.
Хешування використовується у криптографії для перевірки і збереження дайджестів паролів, для пришвидшення операцій пошуку і сортування даних, для контролю на наявність помилок.
Функції хешування
Алфавітні вказівники, функції розрахунку контрольних кодів є окремими випадками функцій хешування
Поширені функції хешування: CRC, MD2, MD4, MD5, SHA, HAVAL, Whirlpool, ГОСТ Р 34.11-94, Adler-32, N-Hash, RIPEMD-160, Snefru, TTH, PJW-32…
Проста функція хешування рядків
Розглянемо наступний приклад хешування
Обмеження результуючого діапазону
Проблема – висока ймовірність колізій
Покращення розподілу хеш-кодів
Приклад реалізації функції на C#
Хеш-таблиці
Якщо хешування використовується для реалізації операції пошуку, то хеш-коди зберігаються у так званих хеш-таблицях, що містять пари хеш-код та значення, для якого він розрахований
Хеш-таблицю можна уявити у вигляді масиву, індекси якої є хеш-кодами, а значення – елементами, для яких здійснюється хешування. Заповнення хеш-таблиці здійснюється шляхом розміщення елементів у місця, яким відповідають певні хеш-коди
В ідеальному варіанті пошук з використанням хеш-таблиці може бути здійснений всього за один крок – для шуканого елементу розраховується хеш-код, за яким з таблиці обирається необхідний елемент, чи визначається його відсутність
Для більшості поширених алгоритмів хешування розмір хеш-таблиці має бути простим числом
Приклад реалізації функції хешування для заповнення хеш-таблиці