Не изобретай свой шифр

Самое важное правило во всей криптографии умещается в три слова: не изобретай свой шифр. Звучит обидно, но за этим стоит горький опыт десятилетий.
«Каждый может придумать шифр, который сам не сможет взломать. Это не значит, что его не взломает кто-то другой.» — известный принцип криптографии.

Почему свой шифр — плохая идея

Когда новичок придумывает шифр, он проверяет: «смогу ли я сам его прочитать без ключа?» Не смог — значит надёжно. Но криптоаналитики используют математику, статистику и приёмы, о которых автор даже не знает. Шифр, который кажется крепким, обычно падает за минуты.

Профессиональные шифры вроде 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.

Изобретать свой шифр полезно только для учёбы — чтобы понять, как всё устроено. Никогда — для реальной защиты.

Вывод:

Не изобретай свой шифр для реальной защиты. Любительские шифры выглядят надёжно, но ломаются мгновенно. По принципу Керкгоффса стойкость держится на секретном ключе, а не на тайне алгоритма. Используй проверенные библиотеки.
Проверьте себя
1. Что утверждает принцип Керкгоффса?
AАлгоритм шифрования нужно держать в строгой тайне
BСтойкость должна зависеть только от секретности ключа, а не алгоритма
CЧем длиннее текст, тем надёжнее шифр
DСвой шифр всегда надёжнее AES
2. Почему не стоит изобретать свой шифр для реальной защиты?
AЭто слишком медленно писать
BАвтор проверяет шифр только против себя, а эксперты ломают его математикой за минуты
CСвои шифры запрещены законом
DОни занимают слишком много памяти
Поддержать проект