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