Cryptology Academy · 강의

Python의 RSA 및 ECDSA 키 쌍

서명과 암호화를 위해 RSA 및 EC 키를 생성하고 직렬화하여 사용합니다.

레슨 3/413개 단계

Python의 RSA 및 ECDSA 키 쌍은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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")

PSS를 사용한 RSA 서명

서명에는 항상 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 키 쌍 생성

NIST P-256(secp256r1)을 사용하는 ECDSA는 RSA-3072보다 훨씬 작은 키로 128비트 보안 수준을 제공합니다.

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())

OAEP를 사용한 RSA 암호화

RSA로 작은 데이터를 암호화할 때(예: DEK) 항상 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는 더 작은 서명(P-256의 경우 약 71바이트, RSA-2048의 경우 약 256바이트)을 생성하고 더 빠르게 서명하면서 동일한 보안 수준을 제공합니다. RSA는 기존 시스템의 지원 범위가 더 넓고 개념적으로 이해하기 쉽습니다. 새로운 시스템에는 ECDSA P-256 또는 Ed25519를 사용하십시오.

이해도 확인

디지털 서명에는 PKCS#1 v1.5보다 RSA-PSS를 우선해야 하는 이유가 무엇입니까?

학습 내용 복습

RSA에는 rsa.generate_private_key를, ECDSA에는 ec.generate_private_key를 사용하십시오. RSA에는 PSS로, ECDSA에는 SHA-256과 함께 서명하십시오. PKCS8 형식과 암호문 암호화를 사용해 PEM으로 직렬화하십시오. 키 합의에는 ECDH를 사용하십시오. 새로운 시스템에는 ECDSA P-256 또는 Ed25519를 우선 사용하십시오.

무료로 시작

AI 튜터와 함께 Cryptology Academy을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
67
레슨
261

자주 묻는 질문

“Python의 RSA 및 ECDSA 키 쌍” 강의는 무료인가요?

네 — “Python의 RSA 및 ECDSA 키 쌍” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Python의 RSA 및 ECDSA 키 쌍”에서 뭘 배우나요?

서명과 암호화를 위해 RSA 및 EC 키를 생성하고 직렬화하여 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Python의 RSA 및 ECDSA 키 쌍” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Python 암호화 라이브러리 개요
  2. Python에서 AES-GCM 암호화 및 복호화
  3. Python의 RSA 및 ECDSA 키 쌍
  4. 흔한 Python 암호화 실수와 안전한 패턴
← Cryptology Academy(으)로 돌아가기