Шифр Віженера: принцип, злам і онлайн-калькулятор

Шифр Віженера: принцип, злам і онлайн-калькулятор

Шифр Віженера — це багатоалфавітний шифр, у якому кожна літера тексту зсувається на різну кількість позицій. Розмір зсуву задає ключове слово: його літери по черзі визначають зсув для кожної літери повідомлення. Три століття шифр Віженера вважали «нерозкривним». Однак у XIX столітті його зламали, і цей злам досі гарно пояснює, чому довгий ключ сам по собі не гарантує безпеки.

Спробуйте калькулятор: введіть текст і ключове слово, а таблиця покаже, як кожна літера ключа зсуває літеру тексту.

Калькулятор шифру Віженера

Як працює шифр Віженера

Ключ записують під текстом і повторюють стільки разів, скільки потрібно. Номер літери ключа в абетці (А=0, Б=1, …) — це зсув для літери тексту над нею. Фактично це кілька шифрів Цезаря, що чергуються.

Текст:   А Т А К У В А Т И
Ключ:    Л И М О Н Л И М О
Зсув:   15 10 16 18 17 15 10 16 18
Шифр:    Л Я М Я Є Н И Д Ш

Формула та сама, що й у шифра Цезаря, лише ключ залежить від позиції:

C[i] = (P[i] + K[i mod m]) mod n
P[i] = (C[i] − K[i mod m]) mod n

Тут m — довжина ключа, n — розмір абетки. Калькулятор SparSIT працює одразу з українською й англійською абетками. Ключ просувається лише на літерах, тому пробіли й розділові знаки не «з’їдають» позиції ключа.

Реалізація на Python

UA = "АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"

def vigenere(text, key, sign=1):
    shifts = [UA.index(c) for c in key.upper() if c in UA]
    out, j = [], 0
    for ch in text:
        up = ch.upper()
        if up not in UA:
            out.append(ch)
            continue
        c = UA[(UA.index(up) + sign * shifts[j % len(shifts)]) % len(UA)]
        out.append(c if ch == up else c.lower())
        j += 1
    return "".join(out)

s = vigenere("Атакувати", "ЛИМОН")      # шифрування
vigenere(s, "ЛИМОН", sign=-1)           # розшифрування

У Python оператор % завжди повертає невід’ємне число, тому окрема корекція від’ємного залишку не потрібна.

Чим Віженер кращий за Цезаря

Однакові літери тексту переходять у різні літери шифротексту. У прикладі вище три літери «А» стали «Л», «М» та «И». Через це прямий частотний аналіз не працює: розподіл літер шифротексту майже рівномірний. Перебір теж стає важчим: для ключа з 8 літер українська абетка дає 33⁸ ≈ 1,4 трильйона варіантів.

Як зламують шифр Віженера

Тест Касіскі

Ключ повторюється періодично. Тому однакові фрагменти тексту, що потрапили під однакові позиції ключа, дають однакові фрагменти шифротексту. Відстані між такими повторами кратні довжині ключа. Найбільший спільний дільник відстаней підказує довжину ключа.

Індекс збігу та частотний аналіз

Коли довжина ключа m відома, шифротекст розбивають на m стовпців. Кожен стовпець — це звичайний шифр Цезаря, і його ламають частотним аналізом окремо. Отже, задача зводиться до m простих задач.

Коли Віженер стає нерозкривним

Якщо ключ випадковий, довший за повідомлення і ніколи не використовується повторно, шифр стає одноразовим блокнотом (one-time pad). Його стійкість доведена математично. Проте такий ключ складно передати й зберігати, тому на практиці його застосовують рідко. Байтову версію цієї ідеї описано в статті про XOR-шифрування.

Підсумок

  • Шифр Віженера — набір шифрів Цезаря, які чергуються за ключовим словом.
  • Він стійкіший до частотного аналізу, ніж шифр Цезаря, але ламається через періодичність ключа.
  • Для реальних даних використовуйте AES. Огляд усіх методів — на сторінці методи шифрування.

Детальніше про метод див. статтю «Шифр Віженера» у Вікіпедії.

Related Posts

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.