Python의 RSA 및 ECDSA 키 쌍
서명과 암호화를 위해 RSA 및 EC 키를 생성하고 직렬화하여 사용합니다.
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Python 암호화 라이브러리 개요
- Python에서 AES-GCM 암호화 및 복호화
- Python의 RSA 및 ECDSA 키 쌍
- 흔한 Python 암호화 실수와 안전한 패턴