๊ฐ๋ ์ดํด
ECDSA๋?
ECDSA๋ ํ์๊ณก์ ์ํธํ๋ฅผ ์ฌ์ฉํ๋ ๋์งํธ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ด๋ค. RSA๋ณด๋ค ์งง์ ํค ๊ธธ์ด๋ก ๋๋ฑํ ๋ณด์์ฑ์ ์ ๊ณตํ๋ค.
์ค์ํ ๋น์
๋์ฅ์ ์ฐ๋ ๊ณผ์ ๊ณผ ์ ์ฌํ๋ค:
- ๋์ฅ(๊ฐ์ธํค)์ ๋ณธ์ธ๋ง ๊ฐ์ง๊ณ ์๋ค
- ๋์ฅ ์ด๋ฏธ์ง(๊ณต๊ฐํค)๋ ๋ชจ๋๊ฐ ์ ์ ์๋ค
- ์ค์ ๋์ฅ ๋ฌธ์(์๋ช )์ผ๋ก ์ง์์ฌ๋ถ๋ฅผ ํ์ธํ๋ค
graph TB subgraph "์ค์ ๋์ฅ ์ฌ์ฉ" A[๋์ฅ ์ ์] --> B[๋์ฅ ๋ฑ๋ก] B --> C[๋ฌธ์์ ๋์ฅ ์ฐ๊ธฐ] C --> D[๋์ฅ ์ง์ ํ์ธ] end subgraph "ECDSA" E[ํค ์์ฑ] --> F[๊ณต๊ฐํค ๊ณต์ ] F --> G[๋์งํธ ์๋ช ] G --> H[์๋ช ๊ฒ์ฆ] end
๊ตฌ์ฒด์ ์ธ ๋น์ :
- ์ฃผ๋ฏผ์ผํฐ์์ ๋์ฅ ๋ฑ๋กํ๊ธฐ
- ๋์ฅ ๋ง๋ค๊ธฐ = ๊ฐ์ธํค ์์ฑ
- ๋์ฅ ๋ฑ๋กํ๊ธฐ = ๊ณต๊ฐํค ๊ณต์
- ๋์ฅ ๋ฌธ์ = ๊ณต๊ฐํค
- ์ค์ ๋์ฅ = ๊ฐ์ธํค
- ๊ณ์ฝ์์ ๋์ฅ ์ฐ๊ธฐ
sequenceDiagram participant ๊น์ฒ ์ participant ์ํ Note over ๊น์ฒ ์: ๋ณธ์ธ ๋์ฅ ๋ณด์ Note over ์ํ: ๋์ฅ ๋ฑ๋ก์ ๋ณด ๋ณด์ ๊น์ฒ ์->>์ํ: ๊ณ์ฝ์์ ๋์ฅ์ ์ฐ์ด์ ์ ์ถ Note over ์ํ: ๋ฑ๋ก๋ ๋์ฅ ๋ฌธ์๊ณผ<br/>๊ณ์ฝ์์ ๋์ฅ ๋น๊ต ์ํ->>๊น์ฒ ์: ๋์ฅ ํ์ธ ์๋ฃ
- ์ค์ ์์:
- ๊ฐ์ธํค(์ค์ ๋์ฅ) = ์ ๋ ๋จ์๊ฒ ๋ณด์ฌ์ฃผ๋ฉด ์ ๋จ
- ๊ณต๊ฐํค(๋์ฅ ๋ฌธ์) = ๋๊ตฌ๋ ๋ณผ ์ ์์
- ์๋ช (์ฐํ ๋์ฅ) = ์ง์ง ๋ณธ์ธ์ด ์ฐ์๋์ง ํ์ธ ๊ฐ๋ฅ
์ด๋ ๊ฒ ์ดํดํ์๋ฉด ์ข ๋ ์ฌ์ธ๊น์?
๋์ ๋ฐฉ์
ECDSA ์ฒ๋ฆฌ ๊ณผ์
sequenceDiagram participant Signer participant Verifier Note over Signer: 1. ๋ฉ์์ง ํด์ ์์ฑ Note over Signer: 2. ์์ ํค(k) ์์ฑ Note over Signer: 3. ์๋ช ๊ฐ(r,s) ๊ณ์ฐ Signer->>Verifier: ๋ฉ์์ง + ์๋ช (r,s) Note over Verifier: 1. ๋ฉ์์ง ํด์ ๊ฒ์ฆ Note over Verifier: 2. ์๋ช ๊ฒ์ฆ ๊ณ์ฐ Note over Verifier: 3. ์ ํจ์ฑ ํ์ธ
์์คํ ๊ตฌ์กฐ
graph TB subgraph "์๋ช ์์ฑ" A[๋ฉ์์ง] --> B[ํด์ ํจ์] B --> C[์๋ช ์์ฑ] D[๊ฐ์ธํค] --> C end subgraph "์๋ช ๊ฒ์ฆ" E[๋ฉ์์ง] --> F[ํด์ ํจ์] F --> G[์๋ช ๊ฒ์ฆ] H[๊ณต๊ฐํค] --> G end
๊ตฌํ ์์
๊ธฐ๋ณธ ๊ตฌํ
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.exceptions import InvalidSignature
class ECDSASigner:
"""
ECDSA๋ฅผ ์ด์ฉํ ๋์งํธ ์๋ช
์์ฑ ๋ฐ ๊ฒ์ฆ
"""
def __init__(self):
# SECP256K1 ๊ณก์ ์ฌ์ฉ (Bitcoin์์๋ ์ฌ์ฉ)
self.private_key = ec.generate_private_key(ec.SECP256K1())
self.public_key = self.private_key.public_key()
def sign_message(self, message: bytes) -> bytes:
"""
๋ฉ์์ง์ ๋ํ ์๋ช
์ ์์ฑํ๋ค
Args:
message: ์๋ช
ํ ๋ฉ์์ง
Returns:
bytes: ์์ฑ๋ ์๋ช
"""
return self.private_key.sign(
message,
ec.ECDSA(hashes.SHA256())
)
def verify_signature(self, message: bytes, signature: bytes) -> bool:
"""
์๋ช
์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ค
Args:
message: ์๋ณธ ๋ฉ์์ง
signature: ๊ฒ์ฆํ ์๋ช
Returns:
bool: ๊ฒ์ฆ ๊ฒฐ๊ณผ
"""
try:
self.public_key.verify(
signature,
message,
ec.ECDSA(hashes.SHA256())
)
return True
except InvalidSignature:
return False์๋ชป๋ ๊ตฌํ๊ณผ ์ฌ๋ฐ๋ฅธ ๊ตฌํ
์๋ชป๋ ์์
# ์ทจ์ฝํ ๊ตฌํ - ์ฌ์ฉํ์ง ๋ง ๊ฒ
class InsecureSigner:
def __init__(self):
# ๊ณ ์ ๋ ํค ์ฌ์ฉ (์ทจ์ฝ์ )
self.k = 123456
def sign(self, message):
# ์์ธก ๊ฐ๋ฅํ ์์๊ฐ ์ฌ์ฉ
return self.k * hash(message)์ฌ๋ฐ๋ฅธ ๊ตฌํ
# ์์ ํ ๊ตฌํ
import secrets
class SecureSigner:
def __init__(self):
self.private_key = ec.generate_private_key(ec.SECP256K1())
def sign(self, message):
# ์ํธํ์ ์ผ๋ก ์์ ํ ๋์ ์์ฑ
k = secrets.randbits(256)
return self.private_key.sign(
message,
ec.ECDSA(hashes.SHA256())
)์ฑ๋ฅ ์ต์ ํ
๋ฐฐ์น ์ฒ๋ฆฌ
class BatchSigner:
"""
์ฌ๋ฌ ์๋ช
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ํด๋์ค
"""
def batch_sign(self, messages):
"""
์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ํ๋ฒ์ ์๋ช
ํ๋ค
"""
return [
self.private_key.sign(
msg,
ec.ECDSA(hashes.SHA256())
)
for msg in messages
]
def batch_verify(self, messages, signatures):
"""
์ฌ๋ฌ ์๋ช
์ ํ๋ฒ์ ๊ฒ์ฆํ๋ค
"""
try:
for msg, sig in zip(messages, signatures):
self.public_key.verify(
sig,
msg,
ec.ECDSA(hashes.SHA256())
)
return True
except InvalidSignature:
return False๋ณด์ ๊ณ ๋ ค์ฌํญ
์ฃผ์ ์ํ
graph TB subgraph "๋ณด์ ์ํ" A[์์ํค ์ฌ์ฌ์ฉ] --> B[๊ฐ์ธํค ๋ ธ์ถ] C[์ทจ์ฝํ ๋์] --> D[์๋ช ์์กฐ] E[๋ถ์ฑ๋ ๊ณต๊ฒฉ] --> F[ํค ์ ์ถ] end
๋์ ๋ฐฉ์
- ์์ํค(k) ๊ด๋ฆฌ
- ๋งค ์๋ช ๋ง๋ค ์๋ก์ด ๋์ ์ฌ์ฉ
- ์ํธํ์ ์ผ๋ก ์์ ํ ๋์ ์์ฑ๊ธฐ ์ฌ์ฉ
- ํค ๋ณดํธ
- ์์ ํ ํค ์ ์ฅ์ ์ฌ์ฉ
- ์ ๊ธฐ์ ์ธ ํค ๊ฐฑ์
์ค์ ํ์ฉ ์ฌ๋ก
1. ๋ธ๋ก์ฒด์ธ
- Bitcoin ํธ๋์ญ์ ์๋ช
- ์ค๋งํธ ์ปจํธ๋ํธ ์๋ช
2. TLS ์ธ์ฆ์
- ์๋ฒ ์ธ์ฆ
- ํด๋ผ์ด์ธํธ ์ธ์ฆ
3. ์ฝ๋ ์๋ช
- ์ํํธ์จ์ด ํจํค์ง ์๋ช
- ๋ชจ๋ฐ์ผ ์ฑ ์๋ช
๊ฒฐ๋ก
ECDSA์ ์ฅ์
- RSA๋ณด๋ค ์งง์ ํค ๊ธธ์ด๋ก ๋๋ฑํ ๋ณด์์ฑ ์ ๊ณตํ๋ค
- ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ์ ํฉํ๋ค
- ๊ตญ์ ํ์ค์ผ๋ก ์ธ์ ๋ฐ๋๋ค
์ฃผ์์ฌํญ
- ์์ ํ ๋์ ์์ฑ์ด ํ์์ ์ด๋ค
- ์์ํค ๊ด๋ฆฌ์ ์ฃผ์ํด์ผ ํ๋ค
- ์ ์ ํ ๊ณก์ ์ ์ ํํด์ผ ํ๋ค