security cryptography ecc rsa encryption web-security

타원 곡선 및 고급 비대칭 암호화 가이드

현대 비대칭 암호화에 대한 종합 가이드: RSA 변형(OAEP, PSS)과 타원 곡선 암호화(ECDSA, Ed25519), 키 교환(X25519) 및 키 유도(HKDF) 비교 분석.

2026-04-11

비대칭 암호화 소개

비대칭 암호화(또는 공개 키 암호화)는 현대 디지털 보안의 초석입니다. 단일 키를 공유하는 대칭 암호화와 달리 비대칭 시스템은 키 쌍을 사용합니다. 암호화 또는 서명 검증을 위한 공개 키와 복호화 또는 서명을 위한 개인 키가 그것입니다.

이 가이드에서는 전통적인 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는 두 단계의 프로세스를 따릅니다.

  1. 추출(Extract): "원시" 공유 비밀과 선택적인 솔트를 사용하여 "의사 난수 키(PRK)"를 생성합니다.
  2. 확장(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로 옮겨가는 이유는 무엇일까요?

  1. 부채널 공격(Side-Channel Attacks) 저항성: Ed25519 구현은 설계상 상수 시간(constant-time)으로 작동하여 타이밍 공격으로부터 보호됩니다.
  2. 불량 난수 배제: ECDSA는 서명할 때마다 신선하고 고품질의 난수가 필요합니다. RNG(난수 생성기)가 조금이라도 실패하면 개인 키가 노출될 수 있습니다. Ed25519는 결정론적이어서 이 문제를 원천적으로 방지합니다.
  3. 성능: Ed25519는 서명 및 검증 속도가 훨씬 빠르며, 이는 트래픽이 많은 서버에 매우 중요합니다.
  4. 작은 키 크기: 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를 사용하세요.

이러한 현대적인 표준을 채택함으로써 애플리케이션의 속도와 보안을 보장하고 최신 암호화 모범 사례를 따를 수 있습니다.