ECC(Elliptic Curve Cryptography, 타원 곡선 암호)는 타원 곡선의 수학적 성질을 이용한 공개키 암호 시스템이다. RSA보다 훨씬 짧은 키 길이로 동등한 보안 수준을 제공하여, 모바일/IoT 환경과 TLS 1.3에서 표준으로 채택됐다.
타원 곡선 기초
타원 곡선 방정식: y² = x³ + ax + b (단, 4a³ + 27b² ≠ 0)
예: secp256k1 (Bitcoin): y² = x³ + 7
P-256 (NIST): y² = x³ - 3x + b (특정 b값)
점 덧셈 연산:
P + Q = R (두 점을 잇는 직선이 곡선과 만나는 세 번째 점의 반사)
P + P = 2P (접선과 곡선의 교점)
스칼라 곱셈:
k × P = P + P + ... + P (k번)
※ k와 P를 알면 kP 계산은 쉽지만,
kP와 P만 알면 k를 구하기는 수학적으로 매우 어려움 (ECDLP)
RSA vs ECC 보안 강도 비교
| 보안 강도 | RSA 키 길이 | ECC 키 길이 |
|---|
| 80 비트 | 1024 비트 | 160 비트 |
| 112 비트 | 2048 비트 | 224 비트 |
| 128 비트 | 3072 비트 | 256 비트 |
| 256 비트 | 15360 비트 | 521 비트 |
ECDH (타원 곡선 디피-헬만): 키 교환
앨리스: 비공개 키 a, 공개 키 A = a×G
밥: 비공개 키 b, 공개 키 B = b×G
공유 비밀 = a×B = b×A = ab×G
ECDSA (타원 곡선 전자서명): Bitcoin, TLS에서 사용
EdDSA / Ed25519: 성능과 보안성 향상된 현대적 서명 알고리즘
python
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes, serialization
# ECDH 키 쌍 생성
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
# 공개키 직렬화
pem = public_key.public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
)
print(pem.decode()) # 짧은 키 (256비트 = 32바이트)
주요 표준 곡선
| 곡선 | 용도 |
|---|
| P-256 (secp256r1) | TLS, HTTPS, FIDO2 |
| P-384 | 정부/군사 등급 |
| secp256k1 | Bitcoin, Ethereum |
| Curve25519 | SSH, Signal, WireGuard |
| Ed25519 | SSH 서명, Git 커밋 서명 |
관련 개념