Завдання Симетричне шифрування. Вибрати ключі та розробити блок-схему алгоритму та програму для шифрування файлу даних афінним шифром 2+(і mod 4) порядку. Тип афінного шифру визначається останньою цифрою і номера залікової книжки (НЗК). def encrypt(data, a, b): encrypted_data = [] for byte in data: encrypted_byte = (a * byte + b) % 256 encrypted_data.append(encrypted_byte) return bytes(encrypted_data) def main(): # Введіть свій номер залікової книжки та останню цифру student_id = int(input("Введіть номер залікової книжки: ")) last_digit = int(input("Введіть останню цифру: ")) # Визначення ключів a = student_id b = last_digit # Читання вхідного файлу input_file_path = input("Введіть шлях до вхідного файлу: ") with open(input_file_path, 'rb') as file: data = file.read() # Шифрування даних encrypted_data = encrypt(data, a, b) # Збереження зашифрованих даних у вихідний файл output_file_path = input("Введіть шлях до вихідного файлу: ") with open(output_file_path, 'wb') as file: file.write(encrypted_data) print("Файл успішно зашифровано.") if __name__ == "__main__": main() Отримуєм такий вивід Асиметричне шифрування. 2.1. Зашифрувати Слово відкритого тексту за алгоритмом RSA. Слово визначається останньою цифрою і НЗК і задано в таблиці 1. Для генерування використати числа p та q, які визначаються передостанньою цифрою j НЗК і задані в таблиці 2. Букви тексту замінити натуральними числами, що відповідають порядковому номеру букви латинської абетки. Наприклад, А=00, B=01, C=02 і т.д. import math def gcd(a, b): while b != 0: a, b = b, a % b return a def find_mod_inverse(a, m): m0, x0, x1 = m, 0, 1 while a > 1: q = a // m m, a = a % m, m x0, x1 = x1 - q * x0, x0 return x1 + m0 if x1 < 0 else x1 def generate_keypair(p, q): N = p * q phi = (p - 1) * (q - 1) e = 65537 # вибір публічного експонента (зазвичай використовується 65537) d = find_mod_inverse(e, phi) return (N, e), (N, d) def text_to_numbers(text): return [ord(char) - ord('A') for char in text] def encrypt(message, public_key): N, e = public_key return [(char ** e) % N for char in message] def main(): # Визначте ваші значення p та q з таблиці 2. p_last_digit = 1 # Замініть це значення на передостанню цифру j НЗК. q_last_digit = 7 # Замініть це значення на передостанню цифру j НЗК. p = 61 # Виберіть просте число, що закінчується на p_last_digit. q = 53 # Виберіть інше просте число, що закінчується на q_last_digit. # Генерування ключів public_key, private_key = generate_keypair(p, q) # Введення слова відкритого тексту, яке визначається останньою цифрою і НЗК word_last_digit = 9 # Замініть це значення на останню цифру з таблиці 1. word = "HELLO" # Замініть це значення на слово, яке потрібно зашифрувати. # Заміна букв тексту натуральними числами message = text_to_numbers(word) # Шифрування за допомогою алгоритму RSA encrypted_message = encrypt(message, public_key) print("Слово відкритого тексту:", word) print("Зашифроване повідомлення:", encrypted_message) if __name__ == "__main__": main() Вивід Опис заданих систем шифрування Розробка алгоритмів шифрування та розшифрування заданим афінним шифром def gcd(a, b): while b != 0: a, b = b, a % b return a def find_mod_inverse(a, m): m0, x0, x1 = m, 0, 1 while a > 1: q = a // m m, a = a % m, m x0, x1 = x1 - q * x0, x0 return x1 + m0 if x1 < 0 else x1 def encrypt(text, a, b, m): encrypted_text = [] for char in text: encrypted_char = (a * char + b) % m encrypted_text.append(encrypted_char) return encrypted_text def decrypt(encrypted_text, a, b, m): a_inv = find_mod_inverse(a, m) decrypted_text = [] for char in encrypted_text: decrypted_char = (a_inv * (char - b)) % m decrypted_text.append(decrypted_char) return decrypted_text # Приклад використання: m = 26 # розмір алфавіту (кількість латинських літер) a = 3 # ключ a b = 7 # ключ b # Відкритий текст plaintext = [0, 11, 14, 11, 14] # "HELLO" перетворено у натуральні числа # Шифрування encrypted_text = encrypt(plaintext, a, b, m) print("Зашифрований текст:", encrypted_text) # Розшифрування decrypted_text = decrypt(encrypted_text, a, b, m) print("Розшифрований текст:", decrypted_text) Таблиця ідентифікаторів, використаних в програм Глобальні змінні: m: Розмір алфавіту, тобто кількість можливих символів. a, b: Ключі шифрування та розшифрування. Функції: gcd(a, b): Знаходження найбільшого спільного дільника. find_mod_inverse(a, m): Знаходження мультиплікативно оберненого до encrypt(text, a, b, m): Шифрування тексту за афінним decrypt(encrypted_text, a, b, m): Розшифрування зашифрованого тексту афінним шифром. Основний блок коду: Змінні: plaintext: Відкритий текст у вигляді списку чисел. encrypted_text: Зашифрований текст у вигляді списку чисел. decrypted_text: Розшифрований текст у вигляді списку чисел. Вивід результатів: print("Зашифрований текст:", encrypted_text): Виводить зашифрований текст. print("Розшифрований текст:", decrypted_text): Виводить розшифрований текст. Текст програми. def gcd(a, b): while b != 0: a, b = b, a % b return a def find_mod_inverse(a, m): m0, x0, x1 = m, 0, 1 while a > 1: q = a // m m, a = a % m, m x0, x1 = x1 - q * x0, x0 return x1 + m0 if x1 < 0 else x1 def encrypt(text, a, b, m): encrypted_text = [] for char in text: encrypted_char = (a * char + b) % m encrypted_text.append(encrypted_char) return encrypted_text def decrypt(encrypted_text, a, b, m): a_inv = find_mod_inverse(a, m) decrypted_text = [] for char in encrypted_text: decrypted_char = (a_inv * (char - b)) % m decrypted_text.append(decrypted_char) return decrypted_text # Приклад використання: m = 26 # розмір алфавіту (кількість латинських літер) a = 3 # ключ a b = 7 # ключ b # Відкритий текст plaintext = [0, 11, 14, 11, 14] # "HELLO" перетворено у натуральні числа # Шифрування encrypted_text = encrypt(plaintext, a, b, m) print("Зашифрований текст:", encrypted_text) # Розшифрування decrypted_text = decrypt(encrypted_text, a, b, m) print("Розшифрований текст:", decrypted_text) Шифрування заданого слова за допомогою алгоритму RSA. import math def gcd(a, b): while b != 0: a, b = b, a % b return a def find_mod_inverse(a, m): m0, x0, x1 = m, 0, 1 while a > 1: q = a // m m, a = a % m, m x0, x1 = x1 - q * x0, x0 return x1 + m0 if x1 < 0 else x1 def generate_keypair(p, q): N = p * q phi = (p - 1) * (q - 1) e = 65537 # вибір публічного експонента (зазвичай використовується 65537) d = find_mod_inverse(e, phi) return (N, e), (N, d) def encrypt(message, public_key): N, e = public_key return [(char ** e) % N for char in message] # Вхідні дані word = "HELLO" p = 61 # просте число q = 53 # інше просте число # Генерація ключів public_key, _ = generate_keypair(p, q) # Перетворення слова у натуральні числа (відповідно до ASCII кодів) message = [ord(char) for char in word] # Шифрування encrypted_message = encrypt(message, public_key) print("Вхідне слово:", word) print("Зашифроване повідомлення:", encrypted_message) Одержані результати print("Вхідне слово:", word) print("Зашифроване повідомлення:", encrypted_message) Висновки У ході цього взаємодії ми розробили алгоритми для афінного шифру та RSA шифрування на мові програмування Python. Афінний шифр: Розроблено програму для шифрування та розшифрування тексту афінним шифром. Використані математичні концепції, такі як афінне перетворення, Найбільший Спільний Дільник (НСД) та мультиплікативно обернене число. RSA шифрування: Розроблено програму для шифрування слова алгоритмом RSA. Використано концепції генерації ключів, публічного та приватного ключів, а також великих простих чисел. Ці завдання надали можливість поглибити розуміння основних принципів шифрування, а також взаємодії з математичними концепціями, необхідними для забезпечення безпеки інформації при обміні. Програмний код служив інструментом для реалізації вивчених концепцій і продемонстрував їхню прикладність у сфері криптографії. СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ Перелік джерел: Криптография . [Електронний ресурс]. – Доступний з http://cryptolog.ru/ Криптоалгоритмы: справочник. [Електронний ресурс]. – Доступний з http://www.bytemag.ru/articles/detail.php?ID=9058 Атаки на алгоритмы шифрования. [Електронний ресурс]. – Доступний з http://www.bytemag.ru/articles/detail.php?ID=9053 Информационная безопасность - Криптография. [Електронний ресурс]. – Доступний з http://itbezopasnost.ru/kriptografiya.html Перелік літератури: Шеннон К. Теория связи в секретных системах / Шеннон К. // Работы по теории информации и кибернетике. – М. : Изд. Иностр. Лит, 1963. – С. 333 – 402. Вербіцький О. В. Вступ до криптології / О. В. Вербіцький. – Львів: "ВНТЛ", 1998. Лагун А. Е. Криптографічні системи та протоколи / А. Е. Лагун // Навч. посібник. – Львів : Вид-во Львівської політехніки, 2013. – 96 с. Венбо Мао. Современная криптография. Теория и практика. М: Вильямс, 2005. – 768 с. |