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

Простий шифр

Легка

Вказівки

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

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

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

Примітки щодо реалізації

Визначення інтерфейсу Cipher міститься у файлі cipher.go.

Реалізації повинні відповідати інтерфейсу Cipher.

type Cipher interface {
    Encode(string) string
    Decode(string) string
}

Передбачається, що Encode ігноруватиме всі символи в рядку тексту (англ. string), які не належать до A-Za-z, і вони не потраплять до вихідних даних. Вихідні дані також буде зведено до нижнього регістру.

Функції, які використовуються для отримання шифрів:

func NewCaesar() Cipher { }

func NewShift(distance int) Cipher { }

func NewVigenere(key string) Cipher { }

Аргумент для NewShift має бути в діапазоні від 1 до 25 або від -1 до -25. Нуль не допускається. За некоректних аргументів NewShift повертає nil.

Аргумент для NewVigenere має складатися лише з малих літер від a до z. Значення, що складаються лише з літери «a», не допускаються. За некоректних аргументів NewVigenere повертає nil.

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

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

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