Шифр Гронсфельда

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Шифр Гронсфельда — поліалфавітний підстановочний шифр створений графом Гронсфельдом (керівником першої дешифрувальної служби Німеччини) в XVII столітті. Шифр можна вважати удосконаленням шифру Цезаря (надійність) і Віженера / Бофора (швидкість).

Опис[ред. | ред. код]

Ключ[ред. | ред. код]

Довжина ключа (K) повинна бути рівною довжині вихідного тексту. Для цього циклічно записують ключ до тих пір, поки його довжина не буде відповідати довжині вихідного тексту.

Шифрування[ред. | ред. код]

Таблиця Гронсфельда

Кожен символ Mi відкритого тексту M потрібно змістити вправо на Ki (відповідний символ ключа K) кроків.
Або користуючись таблицею Гронсфельда (Tx y, де x — номер рядка, а y — номер стовпця, відлік ведеться з нуля):
кожен символ Ci шифротексту C знаходиться на перетині стовпця y, перший символ якого дорівнює відповідному символу відкритого тексту Mi, і Ki-й (відповідній цифрі ключа) рядка — (TKi y)

Дешифрування[ред. | ред. код]

Кожний символ (Ci) зашифрованого тексту C потрібно змістити вліво на Ki (відповідний символ ключа K) кроків.
Або користуючись таблицею Гронсфельда (Tx y, де x — номер рядка, а y — номер стовпця і відлік ведеться з нуля):
потрібно в Ki (i-а цифра ключа K) рядку знайти символ, який дорівнює відповідному символу шифротексту (TKi y = Ci), і перший елемент стовпця буде i-м символом відкритого тексту.

Приклад[ред. | ред. код]

Нехай дано вихідний текст: C = «GRONSFELD»
і ключ: K = «2015»

Ключ[ред. | ред. код]

Довжина тексту — 9 символів, отже й довжина ключа також повинна дорівнювати 9 символам.
K = «201520152»

Шифрування[ред. | ред. код]

  • M1 = «G».
  • y = 6 (y — номер стовпця)
  • K1 = 2
  • С1 = T2 6 = «I»
    C += «I» (C = «I»)
  • M1 = «R».
  • y = 17
  • K2 = 0
  • С2 = T0 6 = «R»
    C += «I» (C = «IR»)

. . . . . . . . .

  • m9 = «D»
  • y = 3
  • K9 = 2
  • С9 = T2 3 = «F»
    C += «I» (C = «IRPSUFFQF»)

Шифротекст (C) — «IRPSUFFQF»

Дешифрування[ред. | ред. код]

  • C1 = «I».
  • x = K1 = 2
  • y = 6
  • M += «G» (M = «G»)
  • C2 = «R»
  • x = K2 = 0
  • y = 17
  • M += «R» (M = «GR»)

. . . . . . . . .

  • C10 = «H»
  • x = K9 = 2
  • y = 3
  • M += «F» (M = «GRONSFELD»)

Дешифрований текст (M) — «GRONSFELD»

Реалізація[ред. | ред. код]

Python[ред. | ред. код]

A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * 2  # алфавіт
def f(mc, k, op):
    k *= len(mc) // len(k) + 1
    return ''.join([A[A.index(j) + int(k[i]) * op] for i, j in enumerate(mc)])
def encrypt(message, key):
    return f(message, key, 1)
def decrypt(ciphertext, key):
    return f(ciphertext, key, -1)
print(encrypt('GRONSFELD', '2015'))  # шифрування
print(decrypt('IRPSUFFQF', '2015'))  # дешифрування

Джерела[ред. | ред. код]