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

Как работает симметричное шифрование?

1.8 Middle🔥 111 комментариев
#Безопасность и аутентификация

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

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

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

Симметричное шифрование

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

Базовые концепции

Как это работает

Оригинальный текст + Ключ --[Encryption]--> Зашифрованный текст
Зашифрованный текст + Ключ --[Decryption]--> Оригинальный текст

Ключевая особенность: Один и тот же ключ используется для обеих операций.

Простой пример (Caesar Cipher)

Shift=3 (каждая буква сдвигается на 3 позиции)

Оригинал:     HELLO
Ключ:         3
Зашифровано:  KHOOR

Расшифровка:
Зашифровано:  KHOOR
Ключ:         3 (назад)
Оригинал:     HELLO

Это очень простой и небезопасный пример, но показывает принцип.

Преимущества симметричного шифрования

  1. Скорость: Симметричное шифрование очень быстрое — можно шифровать большие объёмы данных.

    • AES: 1000+ Mbps
    • Асимметричное (RSA): 10x медленнее
  2. Простота: Легко реализовать и использовать.

  3. Малый размер: Зашифрованный текст примерно такого же размера как оригинал.

  4. Проверенность: Алгоритмы проверены временем (AES, DES).

Недостатки симметричного шифрования

  1. Управление ключами: Обе стороны должны иметь одинаковый ключ. Как его безопасно передать?

    • Нельзя отправить по интернету в открытом виде
    • Нужен безопасный канал для обмена ключом
  2. Масштабируемость: Для 100 пользователей нужно 100 разных ключей (или один общий, что плохо).

  3. Без аутентификации: Не доказывает кто отправил сообщение.

Современные алгоритмы симметричного шифрования

1. AES (Advanced Encryption Standard)

Самый популярный и рекомендуемый алгоритм на сегодня.

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

  • Размер ключа: 128, 192, или 256 бит
  • Размер блока: 128 бит
  • Скорость: Очень быстро (аппаратное ускорение в современных процессорах)
  • Статус: Государственный стандарт (FIPS 197)

Пример (Python):

from cryptography.fernet import Fernet

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

# Шифруем
original_text = "Secret message"
encrypted = cipher.encrypt(original_text.encode())
print(f"Encrypted: {encrypted}")

# Расшифровываем
decrypted = cipher.decrypt(encrypted).decode()
print(f"Decrypted: {decrypted}")

Варианты режима работы:

  • ECB (Electronic Code Book) — простой, но НЕБЕЗОПАСНЫЙ
  • CBC (Cipher Block Chaining) — лучше, требует IV
  • CTR (Counter Mode) — хороший, параллелизируемый
  • GCM (Galois Counter Mode) — лучший, добавляет аутентификацию

2. ChaCha20

Альтернатива AES, особенно на устройствах без аппаратного ускорения.

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

  • Размер ключа: 256 бит
  • Быстрее AES на старом оборудовании
  • Используется в TLS, OpenSSH

3. 3DES (Triple Data Encryption Standard)

Устаревший, но ещё используется в legacy системах.

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

  • Размер ключа: 168 бит (эффективно 112 бит из-за структуры)
  • Медленнее AES в 100+ раз
  • Рекомендуется миграция на AES

Процесс шифрования/расшифрования в деталях

AES с CBC режимом (популярный вариант)

Шифрование:
┌─────────────────┐
│ Оригинальный    │
│ текст           │
└────────┬────────┘
         ↓
  ┌──────────────┐
  │ Разбиение на │ (каждый блок 128 бит = 16 байт)
  │ блоки        │
  └──────┬───────┘
         ↓
  Блок 1
     ↓
  XOR с IV (Initialization Vector)
     ↓
  Encrypt с ключом → Зашифр. блок 1
     ↓
  XOR со следующим блоком
     ↓
  Encrypt с ключом → Зашифр. блок 2
     ↓
  ...

Расшифровка (обратный процесс):
Зашифр. блок → Decrypt → XOR → Оригинальный блок

Почему нужен IV (Initialization Vector)?

Без IV один и тот же текст будет давать одинаковую последовательность зашифрования. Это позволяет атакующему распознать паттерны.

Эпохи без IV (плохо):
Оригинал:     HELLO HELLO HELLO
Зашифровано:  ABCDE ABCDE ABCDE  ← Видно повторение!

С IV (хорошо):
Зашифровано:  ABCDE FGHIJ KLMNO  ← Одинаковый текст → разный результат

Практический пример: Шифрование данных в БД

Сценарий

Хотим хранить в БД номера кредитных карт, но в зашифрованном виде.

from cryptography.fernet import Fernet
import os
from dotenv import load_dotenv

load_dotenv()
ENCRYPTION_KEY = os.getenv('ENCRYPTION_KEY')

class CardStorage:
    def __init__(self, key):
        self.cipher = Fernet(key)
    
    def encrypt_card(self, card_number: str) -> str:
        """Зашифруем номер карты перед сохранением в БД"""
        return self.cipher.encrypt(card_number.encode()).decode()
    
    def decrypt_card(self, encrypted_card: str) -> str:
        """Расшифруем номер карты при необходимости"""
        return self.cipher.decrypt(encrypted_card.encode()).decode()
    
    def save_to_db(self, user_id: int, card_number: str):
        encrypted = self.encrypt_card(card_number)
        # Сохраняем в БД
        db.execute(
            "INSERT INTO cards (user_id, card) VALUES (?, ?)",
            (user_id, encrypted)
        )
    
    def get_from_db(self, user_id: int) -> str:
        encrypted_card = db.query(
            "SELECT card FROM cards WHERE user_id = ?",
            (user_id,)
        )[0]
        return self.decrypt_card(encrypted_card)

# Использование
storage = CardStorage(ENCRYPTION_KEY)
storage.save_to_db(123, "4532-1111-2222-3333")
decrypted = storage.get_from_db(123)
print(decrypted)  # 4532-1111-2222-3333

Симметричное vs Асимметричное шифрование

АспектСимметричноеАсимметричное
КлючиОдин ключДва ключа (публичный + приватный)
СкоростьОчень быстроМедленнее в 100+ раз
Размер данныхМалыйБольшой
Обмен ключамиПроблемаЛегко (публичный ключ)
МасштабируемостьПлохаяХорошая
АутентификацияНетДа (цифровые подписи)
ПримерыAES, ChaCha20RSA, ECDSA

Гибридный подход (лучший вариант)

Комбинируем оба метода:

  1. Асимметричное шифрование для обмена ключом симметричного шифрования
  2. Симметричное шифрование для самих данных
Алиса хочет отправить секретное сообщение Бобу:

1. Алиса генерирует случайный ключ (K) для симметричного шифрования
2. Алиса шифрует сообщение с помощью K (быстро)
3. Алиса шифрует K с публичным ключом Боба (асимметричное)
4. Отправляет [зашифр. сообщение + зашифр. ключ]

Боб получает:

5. Боб расшифровывает ключ K с приватным ключом
6. Боб расшифровывает сообщение с помощью K
7. Получает оригинальное сообщение

Этот подход используется в:

  • TLS/HTTPS (SSL handshake)
  • PGP (Email encryption)
  • Большинстве современных систем

Практическая рекомендация

Для System Analyst:

Используй:

  • AES-256-GCM — для защиты данных
  • ChaCha20-Poly1305 — альтернатива
  • Встроенные библиотеки криптографии (не писать свой)
  • Случайный IV/nonce для каждого шифрования

Избегай:

  • ECB режима (он небезопасен)
  • Хардкодированных ключей
  • Слабых ключей (< 128 бит для современных)
  • Самостоятельного написания крипто-кода

Выводы

Симметричное шифрование — это быстрый и эффективный способ защиты данных в состоянии покоя и в пути. Основная проблема — управление ключами, но это решается через гибридный подход с асимметричным шифрованием. Для System Analyst важно понимать, когда использовать симметричное шифрование и как безопасно интегрировать его в архитектуру.

Как работает симметричное шифрование? | PrepBro