Блочные и потоковые шифры

Современные симметричные шифры делятся на два больших семейства: блочные и потоковые.

Блочные шифры

Блочный шифр разбивает данные на куски фиксированного размера (например, по 16 байт) и шифрует каждый блок целиком. Самый известный пример — AES. Если последний блок неполный, его дополняют специальными байтами — это называется набивкой (padding).

Потоковые шифры

Потоковый шифр работает иначе: он генерирует длинную псевдослучайную последовательность (гамму) и накладывает её на данные побайтово, обычно через XOR. Такой подход удобен, когда данные идут непрерывным потоком — например, голос в звонке или видео в эфире. Пример — алгоритм ChaCha20.

Сравним два подхода

БлочныйПотоковый
Единица обработкиБлок (например, 16 байт)Байт или бит
ПримерAESChaCha20
Удобен дляФайлов, дисковПотоков: видео, голос

Простейший потоковый шифр своими руками

Сделаем учебный потоковый шифр: сгенерируем гамму из ключа и наложим её через 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 взят только для наглядности.
Проверьте себя
1. Чем блочный шифр отличается от потокового?
AБлочный шифрует данные кусками фиксированного размера, потоковый — побайтово
BБлочный не использует ключ
CПотоковый работает только с файлами
DМежду ними нет разницы
Поддержать проект