Шифр Гронсфельда
Шифр Гронсфельда — поліалфавітний підстановочний шифр створений графом Гронсфельдом (керівником першої дешифрувальної служби Німеччини) в 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»
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')) # дешифрування
- http://kmb.ufoctf.ru/crypto/caezar_cipher/main.html [Архівовано 9 листопада 2017 у Wayback Machine.]