0Pricing
Cryptology Academy · Урок

Пары ключей RSA и ECDSA в Python

Создавайте, сериализуйте и используйте ключи RSA и EC для подписания и шифрования

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

Обзор операций с парами ключей

Библиотека Python cryptography поддерживает RSA и ECDSA для генерации ключей, подписывания, проверки, сериализации и загрузки. Это строительные блоки для сертификатов TLS, подписывания кода и JWT.

Генерация пары ключей RSA

Рекомендуемый минимум: 2048 бит для совместимости, 4096 бит для ключей с длительным сроком действия:

from cryptography.hazmat.primitives.asymmetric import rsa
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()
print("RSA key generated, size:", private_key.key_size, "bits")

Подписывание RSA с помощью PSS

Всегда используйте дополнение PSS для подписей (не PKCS#1 v1.5):

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

message = b"document to sign"
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)
print("RSA-PSS signature:", signature.hex()[:32], "...")

Проверка подписи RSA

При ошибке проверки возникает InvalidSignature:

from cryptography.exceptions import InvalidSignature

try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Signature valid!")
except InvalidSignature:
    print("Signature INVALID")

Генерация пары ключей ECDSA

ECDSA с NIST P-256 (secp256r1) обеспечивает 128-битную стойкость при значительно меньшем размере ключей, чем RSA-3072:

from cryptography.hazmat.primitives.asymmetric import ec

private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
print("EC private key generated on curve:", private_key.curve.name)

Подписывание и проверка ECDSA

По умолчанию ECDSA использует подписи, закодированные в DER:

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature

# Sign
sig = private_key.sign(b"my data", ec.ECDSA(hashes.SHA256()))
print("ECDSA signature bytes:", len(sig))

# Verify
try:
    public_key.verify(sig, b"my data", ec.ECDSA(hashes.SHA256()))
    print("ECDSA signature valid")
except InvalidSignature:
    print("Invalid")

Сериализация ключей в PEM

Сохраняйте ключи в файлах PEM для хранения или распространения:

from cryptography.hazmat.primitives import serialization

# Private key — encrypted with passphrase
private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.BestAvailableEncryption(b"strong-passphrase")
)

# Public key — no encryption
public_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_pem.decode()[:64])

Загрузка ключей из PEM

Загрузите сохранённые ключи обратно в объекты:

from cryptography.hazmat.primitives.serialization import (
    load_pem_private_key, load_pem_public_key
)

with open("ec_private.pem", "rb") as f:
    priv = load_pem_private_key(f.read(), password=b"strong-passphrase")

with open("ec_public.pem", "rb") as f:
    pub = load_pem_public_key(f.read())

print("Loaded EC key curve:", priv.curve.name)

Согласование ключей ECDH

Используйте ECDH для вывода общего секрета с целью симметричного шифрования:

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF

alice_priv = ec.generate_private_key(ec.SECP256R1())
bob_priv = ec.generate_private_key(ec.SECP256R1())

# Alice computes shared secret
shared = alice_priv.exchange(ec.ECDH(), bob_priv.public_key())
aes_key = HKDF(hashes.SHA256(), 32, None, b"app-context").derive(shared)
print("Derived AES key:", aes_key.hex())

Шифрование RSA с помощью OAEP

Для шифрования небольших объёмов данных (например, DEK) с помощью RSA всегда используйте OAEP:

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

# Encrypt with public key
ciphertext = public_key.encrypt(
    b"small secret",
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# Decrypt with private key
plaintext = private_key.decrypt(ciphertext, padding.OAEP(
    mgf=padding.MGF1(algorithm=hashes.SHA256()),
    algorithm=hashes.SHA256(), label=None
))
print("Decrypted:", plaintext)

Выбор между RSA и ECDSA

ECDSA: меньшие подписи (примерно 71 байт для P-256 против примерно 256 байт для RSA-2048), более быстрое подписывание, тот же уровень безопасности. RSA: более широкая поддержка устаревших систем, более простая концептуальная модель. Для новых систем используйте ECDSA P-256 или Ed25519.

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

Почему для цифровых подписей следует предпочитать RSA-PSS вместо PKCS#1 v1.5?

Итоги урока

Используйте rsa.generate_private_key для RSA и ec.generate_private_key для ECDSA. Подписывайте с помощью PSS (RSA) или ECDSA + SHA-256. Сериализуйте ключи в PEM в формате PKCS8 и используйте шифрование с парольной фразой. Используйте ECDH для согласования ключей. Для новых систем предпочитайте ECDSA P-256 или Ed25519.

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

Урок «Пары ключей RSA и ECDSA в Python» бесплатный?

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

Чему я научусь в уроке «Пары ключей RSA и ECDSA в Python»?

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

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

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

Сколько времени занимает урок «Пары ключей RSA и ECDSA в Python»?

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

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

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

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

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