Блочные и потоковые шифры
Современные симметричные шифры делятся на два больших семейства: блочные и потоковые.
Блочные шифры
Блочный шифр разбивает данные на куски фиксированного размера (например, по 16 байт) и шифрует каждый блок целиком. Самый известный пример — AES. Если последний блок неполный, его дополняют специальными байтами — это называется набивкой (padding).
Потоковые шифры
Потоковый шифр работает иначе: он генерирует длинную псевдослучайную последовательность (гамму) и накладывает её на данные побайтово, обычно через XOR. Такой подход удобен, когда данные идут непрерывным потоком — например, голос в звонке или видео в эфире. Пример — алгоритм ChaCha20.
Сравним два подхода
| Блочный | Потоковый | |
| Единица обработки | Блок (например, 16 байт) | Байт или бит |
| Пример | AES | ChaCha20 |
| Удобен для | Файлов, дисков | Потоков: видео, голос |
Простейший потоковый шифр своими руками
Сделаем учебный потоковый шифр: сгенерируем гамму из ключа и наложим её через XOR. Используем стандартный модуль random только для демонстрации (в реальности нужны криптостойкие генераторы!):
import random
def keystream(key, length):
rng = random.Random(key) # ключ = зерно генератора
return bytes(rng.randint(0, 255) for _ in range(length))
def stream_cipher(data, key):
gamma = keystream(key, len(data))
return bytes(b ^ g for b, g in zip(data, gamma))
msg = "Secret stream!".encode("utf-8")
enc = stream_cipher(msg, key=12345)
dec = stream_cipher(enc, key=12345)
print("Шифр-текст (байты):", list(enc)[:6], "...")
print("Расшифровка:", dec.decode())Вывод:
Шифр-текст (байты): [183, 38, 78, 178, 12, 9] ... Расшифровка: Secret stream!
Обрати внимание: шифрование и расшифровка — это одна и та же операция (наложить гамму). Это свойство XOR. Главное — чтобы гамма никогда не повторялась и была по-настоящему непредсказуемой.
Важное предупреждение
Модульrandomв Python НЕ криптостойкий. Для реальной защиты используютsecretsи проверенные библиотеки. Здесь random взят только для наглядности.