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