본문으로 건너뛰기

9장. 공개키 암호와 RSA

학습 목표

  • 공개키 암호시스템의 기본 원리를 설명한다.
  • 공개키 암호의 세 가지 활용(암·복호화, 전자서명, 키 교환)을 구분한다.
  • 공개키 암호시스템이 충족해야 할 요구사항을 나열·설명한다.
  • RSA 알고리즘의 동작 원리를 제시한다.
  • 타이밍 공격을 이해한다.
  • 알고리즘 복잡도 관련 이슈를 요약한다.

9.1 공개키 암호시스템의 원리

대칭 암호와의 차이

공개키(비대칭) 암호는 암호학 역사상 유일한 진정한 혁명으로 평가된다. 기존의 모든 암호가 치환과 순열에 기반한 반면, 공개키 암호는 수학적 함수에 기반하며 두 개의 별도 키를 사용한다.

흔한 세 가지 오해:

  1. 공개키 암호가 대칭 암호보다 더 안전하다 → 아니다. 보안은 키 길이와 계산 복잡도에 의존한다.
  2. 공개키 암호가 대칭 암호를 완전히 대체한다 → 아니다. 계산 부하 때문에 현재는 키 관리와 서명에 한정된다.
  3. 공개키 방식에서는 키 분배가 간단하다 → 아니다. 여전히 프로토콜과 중앙 에이전트가 필요하다.

공개키 암호시스템의 구성

구분대칭(관용) 암호공개키 암호
동작 요건동일 알고리즘·동일 키로 암·복호화한 알고리즘, 두 개의 관련 키
보안 요건비밀키가 비밀로 유지두 키 중 하나만 비밀이면 됨
키 공유송·수신자가 동일 키 공유송·수신자가 쌍의 각각 다른 키 보유

여섯 가지 구성 요소: 평문, 암호화 알고리즘, 공개키·개인키 쌍, 암호문, 복호화 알고리즘.

공개키의 세 가지 활용

활용설명사용 키
암·복호화수신자 공개키로 암호화, 개인키로 복호화수신자의 PU/PRPU / PR
전자서명송신자 개인키로 서명, 공개키로 검증송신자의 PR/PUPR / PU
키 교환두 당사자가 세션키를 안전하게 교환양측의 키
알고리즘암·복호화전자서명키 교환
RSAYesYesYes
타원곡선YesYesYes
Diffie-HellmanNoNoYes
DSSNoYesNo

인증과 기밀성의 동시 제공

두 공개키 연산을 결합하면 인증 + 기밀성을 모두 달성할 수 있다.

Z=E(PUb,  E(PRa,  X))Z = E\bigl(PU_b,\; E(PR_a,\; X)\bigr)

X=D(PUa,  D(PRb,  Z))X = D\bigl(PU_a,\; D(PR_b,\; Z)\bigr)

송신자 개인키로 먼저 서명(인증) → 수신자 공개키로 암호화(기밀성). 단점은 공개키 알고리즘을 4회 수행해야 한다는 것이다.

요구사항

Diffie와 Hellman이 제시한 조건:

  1. 키 쌍 (PUb,PRb)(PU_b, PR_b) 생성이 계산적으로 쉬워야 한다.
  2. 공개키와 메시지로 암호문을 생성하기 쉬워야 한다: C=E(PUb,M)C = E(PU_b, M)
  3. 개인키로 복호화가 쉬워야 한다: M=D(PRb,C)M = D(PR_b, C)
  4. PUbPU_b로부터 PRbPR_b를 결정하는 것이 계산적으로 불가능해야 한다.
  5. PUbPU_bCC로 원본 MM을 복원하는 것이 계산적으로 불가능해야 한다.
  6. (선택) 두 키를 어느 순서로든 적용 가능: D[PUb,E(PRb,M)]=D[PRb,E(PUb,M)]D[PU_b, E(PR_b, M)] = D[PR_b, E(PU_b, M)]

Trap-Door One-Way Function

공개키 암호의 핵심은 트랩도어 단방향 함수이다.

  • Y=fk(X)Y = f_k(X)kkXX가 알려져 있으면 쉬움
  • X=fk1(Y)X = f_k^{-1}(Y)kkYY가 알려져 있으면 쉬움
  • X=fk1(Y)X = f_k^{-1}(Y)YY만 알고 kk를 모르면 실행 불가능

공개키 암호분석

  • 무차별 대입: 큰 키로 방어하되, 공개키 연산의 계산 부하로 키 크기와 성능 간 트레이드오프가 있다.
  • 수학적 공격: 공개키로부터 개인키를 계산하는 시도. 수학적으로 불가능함이 증명된 적은 없다.
  • 확률적 메시지 공격 (Probable-message attack): 짧은 메시지(예: 56비트 DES 키)를 모든 가능한 값으로 암호화하여 전송된 암호문과 매칭. 랜덤 비트를 추가하여 방어한다.

9.2 RSA 알고리즘

알고리즘 설명

1977년 Rivest, Shamir, Adleman(MIT)이 개발한, 가장 널리 사용되는 공개키 암·복호화 알고리즘이다. 평문과 암호문은 00부터 n1n - 1 사이의 정수이며, 전형적인 nn의 크기는 1024비트 이상이다.

키 생성:

단계내용공개/비밀
1두 소수 pp, qq 선택비밀
2n=p×qn = p \times q공개
3ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1)
4gcd(ϕ(n),e)=1\gcd(\phi(n), e) = 1, 1<e<ϕ(n)1 < e < \phi(n)ee 선택공개
5de1(modϕ(n))d \equiv e^{-1} \pmod{\phi(n)} 계산비밀
  • 공개키: PU={e,n}PU = \{e, n\}
  • 개인키: PR={d,n}PR = \{d, n\}

암호화: C=Memodn\text{암호화: } C = M^e \bmod n

복호화: M=Cdmodn\text{복호화: } M = C^d \bmod n

RSA가 성립하는 이유

eeddϕ(n)\phi(n)에 대한 곱셈 역원, 즉 ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}이다. 오일러 정리에 의해 Medmodn=MM^{ed} \bmod n = M이 성립한다.

예시 (p=17p = 17, q=11q = 11)

n=187,ϕ(n)=160,e=7,d=23n = 187, \quad \phi(n) = 160, \quad e = 7, \quad d = 23

PU={7,187},PR={23,187}PU = \{7, 187\}, \quad PR = \{23, 187\}

M=88    C=887mod187=11M = 88 \;\longrightarrow\; C = 88^{7} \bmod 187 = 11

C=11    M=1123mod187=88C = 11 \;\longrightarrow\; M = 11^{23} \bmod 187 = 88

계산적 측면

고속 모듈러 지수 연산

abmodna^b \bmod n을 계산할 때, bb를 이진수 bkbk1b0b_k b_{k-1} \cdots b_0으로 표현한 뒤 비트별 제곱·곱셈을 반복한다.

abmodn=(bi0a2imodn)modna^b \bmod n = \left(\prod_{b_i \neq 0} a^{2^i} \bmod n\right) \bmod n

예를 들어 x16x^{16}은 일반적으로 15회 곱셈이 필요하지만, 반복 제곱 x2x4x8x16x^2 \to x^4 \to x^8 \to x^{16}으로 4회로 축소된다.

공개키 연산 효율화

e=65537=216+1e = 65537 = 2^{16} + 1을 자주 사용한다. 이진 표현에 11인 비트가 2개뿐이므로 곱셈 횟수가 최소화된다. 다른 선택지로 e=3e = 3이나 e=17e = 17이 있다.

e=3e = 3의 취약점

3명의 서로 다른 사용자(모두 e=3e = 3)에게 동일 메시지 MM을 보내면, 공격자는 C1=M3modn1C_1 = M^3 \bmod n_1, C2=M3modn2C_2 = M^3 \bmod n_2, C3=M3modn3C_3 = M^3 \bmod n_3로부터 CRT를 이용해 M3mod(n1n2n3)M^3 \bmod (n_1 n_2 n_3)를 구한 뒤, M<niM < n_i이므로 단순히 세제곱근을 취해 MM을 복원할 수 있다. 랜덤 패딩으로 방어한다.

개인키 연산 효율화 (CRT 활용)

CdmodnC^d \bmod n을 직접 계산하는 대신, 페르마 소정리를 활용하여:

Vp=Cdmod(p1)modp,Vq=Cdmod(q1)modqV_p = C^{d \bmod (p-1)} \bmod p, \quad V_q = C^{d \bmod (q-1)} \bmod q

CRT로 MM을 복원하면 약 4배 속도 향상된다.

키 생성 — 소수 찾기

원하는 크기의 홀수를 랜덤으로 뽑아 밀러-라빈(Miller-Rabin) 등 확률적 소수 판정 테스트를 수행한다. 소수 정리에 의해, NN 근처의 소수는 평균 ln(N)\ln(N)개마다 하나씩 존재한다. 따라서 22002^{200} 근처의 소수를 찾으려면 평균 약 ln(2200)/270\ln(2^{200})/2 \approx 70번 시도하면 된다.

eedd의 결정에는 확장 유클리드 알고리즘을 사용한다. 이 알고리즘은 gcd(ϕ(n),e)\gcd(\phi(n), e)e1modϕ(n)e^{-1} \bmod \phi(n)을 동시에 계산한다. 두 랜덤 수가 서로소일 확률은 약 0.60.6이므로 소수의 시도만 필요하다.

RSA의 보안

다섯 가지 공격 접근법이 있다:

공격 유형설명
무차별 대입가능한 모든 개인키를 시도 → 큰 키로 방어
수학적 공격nn을 소인수분해하여 pp, qq 발견
타이밍 공격복호화 소요 시간의 차이를 분석하여 키 비트 추론
하드웨어 오류 공격프로세서 전원을 조작하여 서명 생성 중 오류 유도
선택 암호문 공격 (CCA)RSA의 곱셈적 성질을 악용

소인수분해 문제

RSA 수학적 공격의 세 가지 접근:

  1. nn을 소인수분해하여 pp, qq 발견 → ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1) 계산 → de1(modϕ(n))d \equiv e^{-1} \pmod{\phi(n)}
  2. ϕ(n)\phi(n)을 직접 결정 (소인수분해와 동등한 난이도)
  3. dd를 직접 결정 (소인수분해 이상으로 어려움)
해독된 RSA 챌린지비트 수달성 시기
RSA-1294281994년 4월
RSA-1555121999년 8월
RSA-2006632005년 5월
RSA-7687682009년 12월

768비트 해독 팀은, 1024비트 해독이 약 1000배 더 어렵지만 향후 10년 내 가능하다고 보고 1024비트 RSA의 단계적 폐지를 권고했다.

pp, qq 선택 시 추가 제약
  1. ppqq의 길이 차이가 소수 자릿수 이내여야 한다.
  2. (p1)(p-1)(q1)(q-1) 각각에 큰 소인수가 포함되어야 한다.
  3. gcd(p1,q1)\gcd(p-1, q-1)이 작아야 한다.
  4. e<ne < n이고 d<n1/4d < n^{1/4}이면 dd를 쉽게 결정할 수 있으므로 주의.

타이밍 공격

Paul Kocher가 시연한 공격. 컴퓨터의 복호화 소요 시간을 관측하여 개인키를 비트별로 추론한다. 고속 지수 알고리즘에서 비트가 11인 경우 추가 모듈러 곱셈이 발생하므로, 특정 반복에서 시간이 길어지면 해당 비트가 11이라고 판단한다.

대응책 세 가지:

  • 상수 시간 연산: 모든 지수 연산이 동일 시간 소요하도록 강제. 단순하지만 성능 저하.
  • 랜덤 지연: 무작위 지연을 추가하여 타이밍 분석 교란. 노이즈가 충분하지 않으면 추가 측정으로 극복 가능.
  • 블라인딩 (Blinding): 가장 효과적. 암호문에 랜덤 값을 곱하여 내부 처리 비트를 숨긴다.

C=CremodnC' = C \cdot r^e \bmod n

M=(C)dmodnM' = (C')^d \bmod n

M=Mr1modnM = M' \cdot r^{-1} \bmod n

redmodn=rr^{ed} \bmod n = r이므로 올바른 결과를 얻는다. RSA Data Security는 이 기법을 제품에 포함하며, 약 2~10%의 성능 비용을 보고했다.

하드웨어 오류 기반 공격

프로세서의 전원을 조작하여 RSA 서명 생성 중 단일 비트 오류를 유도한다. 약 100시간 만에 1024비트 개인키를 추출한 사례가 보고되었다. 공격자가 물리적 접근과 전원 제어가 필요하므로 심각한 위협은 아니다.

선택 암호문 공격 (CCA)과 OAEP

기본 RSA는 다음과 같은 곱셈적 성질을 가진다:

E(PU,M1)E(PU,M2)=E(PU,M1M2)E(PU, M_1) \cdot E(PU, M_2) = E(PU, M_1 \cdot M_2)

이를 악용하여, C=MemodnC = M^e \bmod n를 다음과 같이 해독할 수 있다:

  1. X=(C2e)modnX = (C \cdot 2^e) \bmod n 계산
  2. XX를 선택 암호문으로 제출하면 Y=Xdmodn=(2M)modnY = X^d \bmod n = (2M) \bmod n을 얻음
  3. MM을 복원
OAEP (Optimal Asymmetric Encryption Padding)

이 공격을 방어하기 위해 RSA Security는 OAEP를 권장한다. 절차는 다음과 같다:

  1. 선택적 파라미터 PP의 해시값에 0을 패딩하여 데이터 블록 DBDB 생성
  2. 랜덤 시드를 MGF(마스크 생성 함수)에 통과시켜 DBDB와 XOR → maskedDB\text{maskedDB}
  3. maskedDB\text{maskedDB}를 다시 MGF에 통과시켜 시드와 XOR → maskedseed\text{maskedseed}
  4. EM=maskedseedmaskedDBEM = \text{maskedseed} \| \text{maskedDB}
  5. EMEM을 RSA로 암호화

시드가 매번 달라지므로 동일 메시지를 두 번 암호화해도 다른 암호문이 생성되어 곱셈적 성질 기반 공격이 무효화된다.


주요 용어

한글영문
선택 암호문 공격chosen ciphertext attack (CCA)
전자서명digital signature
키 교환key exchange
단방향 함수one-way function
최적 비대칭 암호화 패딩optimal asymmetric encryption padding (OAEP)
개인키private key
공개키public key
공개키 암호public-key cryptography
RSARSA
타이밍 공격timing attack
트랩도어 단방향 함수trap-door one-way function