비대칭 암호화 소개
비대칭 암호화(또는 공개 키 암호화)는 현대 디지털 보안의 초석입니다. 단일 키를 공유하는 대칭 암호화와 달리 비대칭 시스템은 키 쌍을 사용합니다. 암호화 또는 서명 검증을 위한 공개 키와 복호화 또는 서명을 위한 개인 키가 그것입니다.
이 가이드에서는 전통적인 RSA에서 현대적인 타원 곡선 암호화(ECC)로의 진화를 살펴보고, Ed25519, X25519와 같은 표준과 RSA-PSS, HKDF와 같은 고급 기법을 다룹니다.
1. RSA 변형: OAEP, PSS 및 PKCS1-v1.5
RSA (Rivest–Shamir–Adleman)는 수십 년 동안 업계 표준이었습니다. 하지만 RSA가 구현되는 방식은 보안에 큰 영향을 미칩니다.
RSA-PKCS1-v1.5 (레거시 표준)
가장 오래된 패딩 방식입니다. 여전히 널리 사용되지만, 패딩 오라클 공격(예: Bleichenbacher 공격)에 취약합니다. 새로운 애플리케이션에서는 사용을 권장하지 않습니다.
RSA-OAEP (최적 비대칭 암호화 패딩)
암호화에 사용됩니다. OAEP는 Feistel 네트워크 기반 패딩을 추가하여 "평문 인식" 기능을 제공합니다. 이는 공격자가 암호문을 수정하여 평문에 대한 정보를 얻는 것을 방지합니다.
- 권장 사항: 데이터 암호화 시 PKCS1-v1.5 대신 RSA-OAEP를 사용하세요.
RSA-PSS (확률적 서명 방식)
디지털 서명에 사용됩니다. 이전 방식과 달리 PSS는 무작위 오라클 모델에서 증명 가능한 보안을 제공합니다. 서명 프로세스에 솔트(salt)를 추가하여 결정론적이 아닌 확률적으로 만듭니다.
- 권장 사항: TLS 1.3과 같은 현대 프로토콜은 오래된 PKCS1-v1.5 서명보다 RSA-PSS를 요구하거나 강력히 선호합니다.
2. 타원 곡선 암호화 (ECC) 심층 분석
ECC는 RSA와 동일한 수준의 보안을 훨씬 작은 키 크기로 제공합니다. 예를 들어, 256비트 ECC 키는 대략 3072비트 RSA 키와 맞먹는 보안을 제공합니다.
ECDSA (타원 곡선 디지털 서명 알고리즘)
디지털 서명 알고리즘(DSA)의 타원 곡선 버전입니다.
- ECDSA-P256: 가장 일반적인 NIST 곡선입니다. 널리 지원되지만, NIST 파라미터에 "백도어"가 있을 수 있다는 우려가 제기되기도 합니다.
- ECDSA-P384: 더 높은 보안 등급(일급 비밀 수준)에 사용됩니다.
EdDSA 및 Twisted Edwards 곡선
현대 암호학은 EdDSA (Edwards-curve Digital Signature Algorithm)로 이동하고 있습니다.
- Ed25519: Curve25519를 기반으로 합니다. 빠른 속도와 높은 보안을 위해 설계되었습니다. 결정론적(서명 시 난수 생성기가 필요 없음)이므로 ECDSA에서 흔히 발생하는 치명적인 실패 원인을 제거합니다.
- Ed448: Ed25519보다 더 높은 보안(224비트 보안 수준)을 제공하는 "골디락스(Goldilocks)" 곡선입니다.
3. 키 교환 프로토콜
보안되지 않은 채널을 통해 두 당사자가 어떻게 공유 비밀 키를 설정할까요?
디피-헬먼 (Diffie-Hellman, DH)
최초의 키 교환 프로토콜입니다. 오늘날에는 대부분 타원 곡선 버전으로 대체되었습니다.
ECDH (타원 곡선 디피-헬먼)
- ECDH-P256 / P384: NIST 곡선을 사용하여 비밀을 설정합니다.
- X25519: 현대 키 교환의 골드 표준입니다. Curve25519를 사용하는 ECDH 함수입니다. NIST 곡선보다 빠르고 안전하며 올바르게 구현하기가 더 쉽습니다.
- X448: X25519의 더 높은 보안 버전입니다.
4. 키 유도: HKDF
공유 비밀이 설정된 후(예: X25519를 통해), 이를 직접 암호화 키로 사용해서는 안 됩니다. 대신 **키 유도 함수 (KDF)**를 사용해야 합니다.
HKDF-SHA256 (HMAC 기반 추출 및 확장 KDF)
HKDF는 두 단계의 프로세스를 따릅니다.
- 추출(Extract): "원시" 공유 비밀과 선택적인 솔트를 사용하여 "의사 난수 키(PRK)"를 생성합니다.
- 확장(Expand): 해당 PRK를 원하는 길이의 여러 키(예: AES 키 및 IV)로 변환합니다.
HKDF-SHA256을 사용하면 최종 키가 암호학적으로 강력하고 서로 독립적임을 보장할 수 있습니다.
5. 비교 표
| 알고리즘 | 키 크기 (보안) | 성능 | 표준 | 사용 사례 |
|---|---|---|---|---|
| RSA 2048 | 112비트 | 느림 | 레거시 | 호환성 |
| RSA 3072 | 128비트 | 매우 느림 | 강력함 | 레거시/엔터프라이즈 |
| ECDSA-P256 | 128비트 | 빠름 | NIST | 일반 모바일/웹 |
| Ed25519 | 128비트 | 매우 빠름 | 현대적 | 서명에 권장 |
| X25519 | 128비트 | 매우 빠름 | 현대적 | 키 교환에 권장 |
| Ed448 | 224비트 | 보통 | 고보안 | 초고보안 시스템 |
6. 보안 권장 사항: 왜 Ed25519인가?
전문가들이 RSA와 NIST 곡선에서 Ed25519로 옮겨가는 이유는 무엇일까요?
- 부채널 공격(Side-Channel Attacks) 저항성: Ed25519 구현은 설계상 상수 시간(constant-time)으로 작동하여 타이밍 공격으로부터 보호됩니다.
- 불량 난수 배제: ECDSA는 서명할 때마다 신선하고 고품질의 난수가 필요합니다. RNG(난수 생성기)가 조금이라도 실패하면 개인 키가 노출될 수 있습니다. Ed25519는 결정론적이어서 이 문제를 원천적으로 방지합니다.
- 성능: Ed25519는 서명 및 검증 속도가 훨씬 빠르며, 이는 트래픽이 많은 서버에 매우 중요합니다.
- 작은 키 크기: 32바이트 키는 512바이트 RSA 키보다 QR 코드, 데이터베이스 인덱스, 헤더에서 다루기가 훨씬 쉽습니다.
7. 코드 예제
Node.js: Ed25519 서명
기본 제공되는 crypto 모듈 사용:
const crypto = require('crypto');
// Ed25519 키 쌍 생성
const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');
const message = Buffer.from('Hello, Security!');
// 서명
const signature = crypto.sign(null, message, privateKey);
// 검증
const isVerified = crypto.verify(null, message, publicKey, signature);
console.log('서명 검증 결과:', isVerified);
Python: X25519 키 교환
cryptography 라이브러리 사용:
from cryptography.hazmat.primitives.asymmetric import x25519
# 앨리스 측
alice_private = x25519.X25519PrivateKey.generate()
alice_public = alice_private.public_key()
# 밥 측
bob_private = x25519.X25519PrivateKey.generate()
bob_public = bob_private.public_key()
# 공유 비밀 계산
alice_shared = alice_private.exchange(bob_public)
bob_shared = bob_private.exchange(alice_public)
assert alice_shared == bob_shared
print("공유 비밀 설정 완료!")
8. FAQ: 일반적인 실수
Q: RSA-OAEP와 RSA-PSS에 동일한 키를 사용할 수 있나요?
A: 기술적으로는 가능하지만 절대로 권장하지 않습니다. 암호화와 서명이라는 서로 다른 목적으로 동일한 키를 사용하면 프로토콜 간 공격(cross-protocol attacks)을 초래할 수 있습니다. 각 역할에 맞는 별도의 키를 항상 사용하세요.
Q: Ed25519는 양자 내성이 있나요?
A: 아니요. RSA 및 현재의 모든 ECC와 마찬가지로, Ed25519는 쇼어(Shor) 알고리즘을 사용하는 대규모 양자 컴퓨터에 취약합니다. 양자 내성을 위해서는 ML-KEM이나 ML-DSA와 같은 양자 내성 암호(PQC)를 고려해야 합니다.
Q: HKDF에서 SHA-256을 사용하는 이유는 무엇인가요?
A: SHA-256은 높은 보안 마진을 제공하며 전 세계적으로 지원됩니다. SHA-3나 BLAKE2도 훌륭하지만, SHA-256은 여전히 HKDF 구현의 업계 표준입니다.
요약
RSA에서 타원 곡선 암호화로의 전환은 보안과 효율성 모두에서 큰 도약을 의미합니다. 현대적인 애플리케이션의 경우:
- 디지털 서명에는 Ed25519를 사용하세요.
- 키 교환에는 X25519를 사용하세요.
- 키 유도에는 HKDF-SHA256을 사용하세요.
- 레거시 호환성이 반드시 필요한 경우에만 RSA-OAEP/PSS를 사용하세요.
이러한 현대적인 표준을 채택함으로써 애플리케이션의 속도와 보안을 보장하고 최신 암호화 모범 사례를 따를 수 있습니다.