Створіть реалізацію шифру Віженера. Шифр Віженера належить до простих шифрів підстановки.
Шифром називають алгоритм, який використовують, щоб зашифрувати, тобто закодувати, рядок тексту (англ. 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 випадкових малих літер латинського алфавіту.