Шифр Гронсфельда — поліалфавітний підстановочний шифр створений графом Гронсфельдом (керівником першої дешифрувальної служби Німеччини) в 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'))  # дешифрування

Джерела ред.