Не изобретай свой шифр
Самое важное правило во всей криптографии умещается в три слова: не изобретай свой шифр. Звучит обидно, но за этим стоит горький опыт десятилетий.
«Каждый может придумать шифр, который сам не сможет взломать. Это не значит, что его не взломает кто-то другой.» — известный принцип криптографии.
Почему свой шифр — плохая идея
Когда новичок придумывает шифр, он проверяет: «смогу ли я сам его прочитать без ключа?» Не смог — значит надёжно. Но криптоаналитики используют математику, статистику и приёмы, о которых автор даже не знает. Шифр, который кажется крепким, обычно падает за минуты.
Профессиональные шифры вроде AES создавались годами, их публично атаковали тысячи лучших экспертов мира, и они выстояли. Это и есть гарантия.
Игрушечный шифр и как он течёт
Возьмём «свой шифр» — XOR с одной повторяющейся буквой. Кажется случайным, но течёт мгновенно:
def my_cipher(text, key_char):
k = ord(key_char)
return bytes(b ^ k for b in text.encode())
secret = my_cipher("PASSWORD: hunter2", 'K')
print("Выглядит как случайный мусор:", secret)
# Атака: ключ — один байт, перебираем все 256
print()
print("Взлом перебором одного байта:")
for k in range(256):
guess = bytes(b ^ k for b in secret)
try:
s = guess.decode()
if s.isprintable() and "PASS" in s:
print(f" ключ={k} ({chr(k)!r}) -> {s}")
except UnicodeDecodeError:
pass
Шифр «развалился» за 256 попыток. А ведь он выглядел убедительно.
Принцип Керкгоффса
В XIX веке Огюст Керкгоффс сформулировал правило: стойкость должна зависеть только от секретности ключа, а не от секретности алгоритма. Хороший шифр можно опубликовать целиком — и он останется надёжным, пока враг не знает ключ.
Самодельные шифры обычно нарушают это: вся их «защита» — в том, что никто не видел код. Стоит коду утечь — и всё.
Что делать вместо этого
- Нужно зашифровать данные — берите проверенную библиотеку (например,
cryptographyв Python) и алгоритм AES-GCM. - Нужно хешировать пароли — берите bcrypt, scrypt или Argon2 (об этом — следующие уроки).
- Нужна случайность для ключей — берите
secrets, а неrandom.
Изобретать свой шифр полезно только для учёбы — чтобы понять, как всё устроено. Никогда — для реальной защиты.
Вывод:
Не изобретай свой шифр для реальной защиты. Любительские шифры выглядят надёжно, но ломаются мгновенно. По принципу Керкгоффса стойкость держится на секретном ключе, а не на тайне алгоритма. Используй проверенные библиотеки.