Древние шифры: скитала, Цезарь и первые секреты
Тысячи лет назад полководцы и шпионы уже прятали свои сообщения. Их методы кажутся наивными, но именно с них началась вся криптография.
Шифр — это не магия, а правило, по которому буквы превращаются в другие буквы. Главное — чтобы враг этого правила не знал.
Спартанская скитала
Около 2500 лет назад спартанцы использовали скиталу — деревянный жезл. На него по спирали наматывали узкую полоску кожи и писали сообщение вдоль жезла. Когда ленту разматывали, буквы перемешивались и превращались в бессмыслицу. Прочитать текст мог только тот, у кого был жезл точно такого же диаметра.
Это пример перестановочного шифра: буквы остаются те же, но меняется их порядок.
Шифр Цезаря
Юлий Цезарь сдвигал каждую букву алфавита на 3 позиции вперёд. A становилась D, B → E и так далее. Это шифр подстановки: каждая буква заменяется на другую по фиксированному правилу.
Запустим шифр Цезаря на латинском алфавите:
import string
def caesar(text, shift):
result = []
for ch in text.upper():
if ch in string.ascii_uppercase:
idx = (ord(ch) - ord('A') + shift) % 26
result.append(chr(idx + ord('A')))
else:
result.append(ch)
return ''.join(result)
message = "ATTACK AT DAWN"
enc = caesar(message, 3)
dec = caesar(enc, -3)
print("Исходный текст:", message)
print("Зашифровано: ", enc)
print("Расшифровано: ", dec)
Почему это слабо
У шифра Цезаря всего 25 возможных сдвигов. Враг может просто перебрать их все за минуту. Попробуем взломать:
import string
def caesar(text, shift):
out = []
for ch in text.upper():
if ch in string.ascii_uppercase:
idx = (ord(ch) - ord('A') + shift) % 26
out.append(chr(idx + ord('A')))
else:
out.append(ch)
return ''.join(out)
secret = "WKLV LV D VHFUHW"
print("Перебираем все сдвиги:")
for s in range(1, 26):
print(f"сдвиг {s:2d}: {caesar(secret, -s)}")
Среди 25 строк глаз сразу находит осмысленную. Безопасность, которая держится на переборе из 25 вариантов, — не безопасность.
Вывод:
Древние шифры прятали сообщения перестановкой (скитала) или подстановкой (Цезарь). Их слабость — маленькое число ключей, которое легко перебрать.