Треки
/
Python
Python
/
Вправи
/
Простий шифр
Простий шифр

Простий шифр

Легка

Вказівки

Створіть реалізацію шифру Віженера. Шифр Віженера належить до простих шифрів підстановки.

Термінологія шифру

Шифром називають алгоритм, який використовують, щоб зашифрувати, тобто закодувати, рядок тексту (англ. string). Незашифрований рядок тексту називають відкритим текстом, а зашифрований рядок тексту - шифротекстом. Перетворення відкритого тексту на шифротекст називають кодуванням, а зворотне перетворення - декодуванням.

У шифрі підстановки кожну літеру відкритого тексту замінюють на літеру шифротексту, яку обчислюють за допомогою ключа. (Зауважмо: літера-замінник може збігатися з початковою літерою.)

Деталі кодування

У цьому шифрі роль ключа відіграє послідовність малих літер, наприклад "abcd". Кожну літеру відкритого тексту зсувають або обертають на відстань, що залежить від відповідної літери ключа. "a" у ключі означає зсув на 0 (тобто жодного зсуву). "b" у ключі означає зсув на 1. "c" у ключі означає зсув на 2, і так далі.

Перша літера відкритого тексту використовує першу літеру ключа, друга літера відкритого тексту - другу літеру ключа, і так далі. Якщо літери в ключі закінчуються раніше, ніж літери у відкритому тексті, почніть ключ із самого початку.

Якщо ключ містить лише одну літеру, наприклад "dddddd", тоді всі літери відкритого тексту зсуваються на однакову відстань (у цьому прикладі на три), тож це буде той самий шифр, що й шифр обертання або шифр зсуву (який іноді називають шифром Цезаря). Наприклад, відкритий текст "iamapandabear" перетворився б на "ldpdsdqgdehdu".

Якщо ключ містить лише літеру "a" (один або більше разів), відстань зсуву дорівнює нулю, і шифротекст збігається з відкритим текстом.

Зазвичай ключ усе ж складніший за це! Для ключа "abcd" літери відкритого тексту зсувалися б на відстань 0, 1, 2 і 3. Для відкритого тексту "hello" потрібно 5 зсувів, тож доведеться повернутися до початку ключа, і відстані зсуву становитимуть 0, 1, 2, 3 і 0. Застосувавши ці зсуви до літер "hello", отримуємо "hfnoo".

Випадкові ключі

Якщо ключ не надано, згенеруйте ключ, який складається щонайменше зі 100 випадкових малих літер латинського алфавіту.

Використовувати random чи secrets?

Починаючи з Python 3.6, існує два різні модулі для отримання «випадкових» чисел:

Модуль random є псевдовипадковим: він не генерує справжньої випадковості, а працює за алгоритмом, який імітує випадковість. Оскільки ці «випадкові числа» утворюються за відомим алгоритмом, вони не є по-справжньому випадковими. Як наслідок, модуль random не годиться для криптографії і його не варто використовувати, саме тому, що він псевдовипадковий.

Модуль secrets генерує криптографічно стійкі «випадкові» числа, які забезпечують вищий рівень безпеки, потрібний для криптографії. У найстрогішому сенсі вони теж псевдовипадкові, але вони гарантують, що утворені ними числа абсолютно непередбачувані.

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

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Простий шифр?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.