Cryptology Academy · Урок

Шифрование и расшифрование AES-GCM в Python

Реализуйте аутентифицированное шифрование с правильным управлением одноразовыми числами

Урок 2 из 413 шагов

«Шифрование и расшифрование AES-GCM в Python» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.

Зачем нужен AES-GCM?

AES-GCM — это схема аутентифицированного шифрования со связанными данными (AEAD). Она обеспечивает конфиденциальность (AES-CTR) и целостность и подлинность (MAC GHASH) за один проход — это стандарт современного шифрования.

Компоненты GCM: CTR + GHASH

AES-GCM = AES в режиме счётчика (шифрование) + полиномиальный MAC GHASH (аутентификация). Тег аутентификации размером 128 бит охватывает как шифротекст, так и необязательные дополнительные аутентифицированные данные (AAD).

Требования к одноразовым значениям

96-битное одноразовое значение нельзя повторно использовать с тем же ключом. Повторное использование одноразового значения полностью ломает GCM: злоумышленник восстанавливает ключ аутентификации и может подделывать шифротексты. Используйте случайные одноразовые значения или счётчик с ротацией ключей.

Шифрование с помощью AES-GCM в Python

Использование слоя hazmat:

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)

# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)

plaintext = b"sensitive payload"
aad = b"user_id=42"  # authenticated but not encrypted

ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())

Расшифрование с помощью AES-GCM в Python

При расшифровании тег проверяется автоматически; при ошибке возникает InvalidTag:

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag

# key, nonce, ciphertext, aad from previous step
try:
    recovered = aesgcm.decrypt(nonce, ciphertext, aad)
    print("Decrypted:", recovered)
except InvalidTag:
    print("Authentication failed — ciphertext tampered!")

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

Добавьте одноразовое значение в начало шифротекста перед сохранением. При расшифровании разделите данные на границе 12-го байта:

def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce = os.urandom(12)
    ct = aesgcm.encrypt(nonce, data, aad or None)
    return nonce + ct  # prepend nonce

def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce, ct = blob[:12], blob[12:]
    return aesgcm.decrypt(nonce, ct, aad or None)

Дополнительные аутентифицированные данные (AAD)

AAD проходит аутентификацию, но не шифруется. Используйте его, чтобы связать шифротекст с контекстом: ID пользователя, ID записи, версией API. Это не позволяет злоумышленнику перенести действительный шифротекст в другой контекст.

Использование низкоуровневого программного интерфейса Cipher

Для потокового шифрования или шифрования на месте используйте программный интерфейс Cipher непосредственно с режимом GCM:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())

Устойчивость AES-GCM-SIV к неправильному использованию одноразовых значений

AES-GCM-SIV (RFC 8452) устойчив к неправильному использованию одноразовых значений: их повторное использование раскрывает, что два открытых текста идентичны, но NOT нарушает подлинность. Предпочитайте этот режим, когда трудно гарантировать уникальность одноразовых значений.

Вывод ключа перед шифрованием

Никогда не используйте обычный пароль непосредственно как ключ AES. Выведите ключ с помощью Argon2 или HKDF:

from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os

master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())

Особенности производительности

Аппаратное ускорение AES-NI делает AES-GCM чрезвычайно быстрым (примерно 1–4 GB/s на современных процессорах). Python cryptography использует OpenSSL, который задействует AES-NI. Для файлов размером более 100 MB используйте потоковую обработку по фрагментам с низкоуровневым программным интерфейсом Cipher.

Проверка знаний

Что произойдёт, если одно и то же одноразовое значение дважды использовать с AES-GCM и одним ключом?

Итоги урока

AES-GCM обеспечивает аутентифицированное шифрование за один проход. Для каждого шифрования используйте новое случайное одноразовое значение размером 96 бит. Добавляйте одноразовое значение в начало шифротекста при сохранении. AAD связывает шифротекст с контекстом. AES-GCM-SIV устойчив к неправильному использованию одноразовых значений. Выводите ключи с помощью HKDF и никогда не используйте обычные пароли напрямую.

Можно начать бесплатно

Изучай Cryptology Academy с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
67
Уроки
261

Часто задаваемые вопросы

Урок «Шифрование и расшифрование AES-GCM в Python» бесплатный?

Да — полный текст урока «Шифрование и расшифрование AES-GCM в Python» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шифрование и расшифрование AES-GCM в Python»?

Реализуйте аутентифицированное шифрование с правильным управлением одноразовыми числами Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cryptology Academy?

Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Шифрование и расшифрование AES-GCM в Python»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cryptology Academy?

Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор библиотеки криптографии Python
  2. Шифрование и расшифрование AES-GCM в Python
  3. Пары ключей RSA и ECDSA в Python
  4. Распространённые ошибки в криптографии Python и безопасные шаблоны
← Назад к Cryptology Academy