← Назад к вопросам

Какие два основных вида шифрования знаешь?

2.0 Middle🔥 201 комментариев
#REST API и HTTP#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Два основных вида шифрования

В криптографии существуют два главных подхода к шифрованию: симметричное (symmetric) и асимметричное (asymmetric). Они работают на принципиально разных основаниях и применяются в разных сценариях.

1. Симметричное шифрование (Symmetric Encryption)

Принцип: Один и тот же ключ используется для шифрования и расшифрования. И отправитель, и получатель должны знать этот секретный ключ.

from cryptography.fernet import Fernet

# Генерируем ключ
key = Fernet.generate_key()
cipher = Fernet(key)

plaintext = b"Secret message"
ciphertext = cipher.encrypt(plaintext)
print(ciphertext)

decrypted = cipher.decrypt(ciphertext)
print(decrypted)  # b"Secret message"

Алгоритмы: AES (Advanced Encryption Standard), DES, 3DES.

Характеристики:

  • Скорость: Очень быстро
  • Размер ключа: 128-256 бит (AES)
  • Безопасность: Высокая (при правильной реализации)
  • Проблема: Нужно обмениваться ключом
  • Использование: Шифрование данных, БД, хранилище

2. Асимметричное шифрование (Asymmetric Encryption)

Принцип: Используется пара ключей — публичный (public key) и приватный (private key).

  • Публичный ключ: известен всем, используется для шифрования
  • Приватный ключ: знает только владелец, используется для расшифрования
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend

# Генерируем пару ключей
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# Шифруем сообщение публичным ключом
plaintext = b"Secret message"
ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# Расшифровываем приватным ключом
decrypted = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(decrypted)  # b"Secret message"

Алгоритмы: RSA, ECC (Elliptic Curve Cryptography).

Характеристики:

  • Скорость: Медленнее симметричного
  • Размер ключа: 2048+ бит (RSA) или 256 бит (ECC)
  • Безопасность: Высокая
  • Преимущество: Не нужно обмениваться приватным ключом
  • Использование: HTTPS, цифровые подписи, обмен ключами

HTTPS (SSL/TLS) — гибридный подход

  1. Браузер запрашивает сертификат сервера (содержит публичный ключ)
  2. Браузер генерирует случайный симметричный ключ (Session Key)
  3. Браузер шифрует Session Key асимметричным ключом сервера
  4. Браузер отправляет зашифрованный Session Key серверу
  5. Сервер расшифровывает своим приватным ключом
  6. Теперь оба знают Session Key
  7. Все данные шифруются симметричным Session Key (быстро)

Почему так? Асимметричное медленнее, но безопасно обменивается ключом. Симметричное быстрое, используется для больших объёмов данных.

Цифровая подпись

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# Боб подписывает сообщение своим приватным ключом
message = b"I am Bob"
signature = bob_private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# Алиса проверяет подпись используя публичный ключ Боба
try:
    bob_public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Подпись валидна")
except:
    print("Подпись невалидна")

Сравнение

АспектСимметричноеАсимметричное
Ключей1 (общий)2 (публичный + приватный)
СкоростьБыстроМедленно
Размер данныхБольшой объёмОграниченный размер
Обмен ключомПроблемаРешение
АутентификацияНетДа (подпись)
ПримерAES, DESRSA, ECC
ПрименениеХранилищеHTTPS, подписи

Лучшие практики

  1. Используй готовые библиотеки (cryptography), не пиши сам
  2. Для шифрования данных — симметричное (AES + Fernet)
  3. Для обмена ключами и подписей — асимметричное (RSA/ECC)
  4. Никогда не складывай ключи в код — используй переменные окружения
  5. Используй HTTPS везде (асимметричное шифрование под капотом)

Вывод: симметричное шифрование быстрое, но требует обмена ключом. Асимметричное решает проблему обмена, но медленнее. На практике используются оба вместе.

Какие два основных вида шифрования знаешь? | PrepBro