본문으로 건너뛰기

10장. 기타 공개키 암호시스템

개요​

Diffie-Hellman 키 교환, Elgamal 암호시스템, 타원곡선 산술, ECC, 비대칭 기반 PRNG

학습 목표

  • Diffie-Hellman 키 교환을 정의한다.
  • 중간자 공격(man-in-the-middle attack)을 이해한다.
  • Elgamal 암호시스템의 개요를 제시한다.
  • 타원곡선 산술을 이해한다.
  • 타원곡선 암호(ECC)의 개요를 제시한다.
  • 비대칭 암호 기반 의사난수 생성 기법 두 가지를 설명한다.

10.1 Diffie-Hellman 키 교환​

최초로 발표된 공개키 알고리즘(1976, Diffie & Hellman). 목적은 두 사용자가 대칭 암호에 사용할 비밀키를 안전하게 교환하는 것이다. 알고리즘 자체는 비밀값의 교환에 한정되며, 그 효과는 이산대수(discrete logarithm) 계산의 어려움에 기반한다.

이산대수​

소수 pp의 원시근(primitive root) α\alpha가 있을 때, α mod p,  α2 mod p,  …,  αp−1 mod p\alpha \bmod p,\; \alpha^2 \bmod p,\; \dots,\; \alpha^{p-1} \bmod p는 11부터 p−1p-1까지의 모든 정수를 한 번씩 생성한다.

임의의 정수 bb에 대해 b≡αi(modp)b \equiv \alpha^i \pmod{p}인 유일한 ii를 bb의 이산대수 dlogα,p(b)\text{dlog}_{\alpha, p}(b)라 한다.

알고리즘​

공개 파라미터: 소수 qq, qq의 원시근 α\alpha

  1. A: 비밀 정수 XA<qX_A < q 를 랜덤 선택, 공개키 YA=αXA mod qY_A = \alpha^{X_A} \bmod q 계산
  2. B: 비밀 정수 XB<qX_B < q 를 랜덤 선택, 공개키 YB=αXB mod qY_B = \alpha^{X_B} \bmod q 계산
  3. A 계산: K=YBXA mod qK = Y_B^{X_A} \bmod q
  4. B 계산: K=YAXB mod qK = Y_A^{X_B} \bmod q

두 계산의 결과가 동일함은 다음으로 증명된다:

K=(YB)XA mod q=(αXB)XA mod q=αXAXB mod q=(YA)XB mod qK = (Y_B)^{X_A} \bmod q = (\alpha^{X_B})^{X_A} \bmod q = \alpha^{X_A X_B} \bmod q = (Y_A)^{X_B} \bmod q

공격자는 qq, α\alpha, YAY_A, YBY_B만 알고 있으므로, 비밀키를 구하려면 이산대수 XB=dlogα,q(YB)X_B = \text{dlog}_{\alpha,q}(Y_B)를 계산해야 한다. 큰 소수에서는 이것이 실행 불가능하다.

예시​

q=353,α=3,XA=97,XB=233q = 353, \quad \alpha = 3, \quad X_A = 97, \quad X_B = 233

YA=397 mod 353=40,YB=3233 mod 353=248Y_A = 3^{97} \bmod 353 = 40, \quad Y_B = 3^{233} \bmod 353 = 248

K=24897 mod 353=40233 mod 353=160K = 248^{97} \bmod 353 = 40^{233} \bmod 353 = 160

키 교환 프로토콜​

  • 일회성 교환: A가 XAX_A, YAY_A를 생성·전송, B가 응답 → 일회용 세션키 생성. qq와 α\alpha는 사전에 알려져 있거나 첫 메시지에 포함.
  • 장기 공개키 디렉토리: 각 사용자가 장기 XiX_i를 유지하고 YiY_i를 중앙 디렉토리에 공개. 누구든지 상대의 공개값으로 비밀키를 계산하여 암호화된 메시지 전송 가능. 기밀성과 일정 수준의 인증을 제공하지만, 재전송 공격은 방어하지 못한다.

중간자 공격 (Man-in-the-Middle Attack)​

프로토콜이 참가자를 인증하지 않기 때문에 중간자 공격에 취약하다.

공격 절차:

  1. Darth가 비밀키 XD1X_{D1}, XD2X_{D2}를 생성하고 공개키 YD1Y_{D1}, YD2Y_{D2}를 계산
  2. Alice가 YAY_A를 Bob에게 전송 → Darth가 가로채고 YD1Y_{D1}을 Bob에게 전달
  3. Darth는 K2=YAXD2 mod qK_2 = Y_A^{X_{D2}} \bmod q 계산 (Alice와의 공유키)
  4. Bob이 YBY_B를 Alice에게 전송 → Darth가 가로채고 YD2Y_{D2}를 Alice에게 전달
  5. Darth는 K1=YBXD1 mod qK_1 = Y_B^{X_{D1}} \bmod q 계산 (Bob과의 공유키)

결과: Alice-Darth는 K2K_2, Darth-Bob은 K1K_1을 공유. Darth는 모든 통신을 복호화·변조·재암호화 가능.

방어

이 취약점은 전자서명과 공개키 인증서(13·14장)를 통해 극복할 수 있다.


10.2 Elgamal 암호시스템​

1984년 T. Elgamal이 발표한 이산대수 기반 공개키 방식으로, Diffie-Hellman과 밀접하게 관련된다. DSS(13장)와 S/MIME(19장) 등 여러 표준에서 사용된다.

키 생성​

  • 공개 파라미터: 소수 qq, 원시근 α\alpha
  • 랜덤 정수 XAX_A 선택 (1<XA<q−11 < X_A < q - 1)
  • YA=αXA mod qY_A = \alpha^{X_A} \bmod q 계산
  • 개인키: XAX_A / 공개키: {q,α,YA}\{q, \alpha, Y_A\}

암호화 (B → A)​

  1. 메시지 MM을 0≤M≤q−10 \le M \le q - 1인 정수로 표현
  2. 랜덤 정수 kk 선택 (1≤k≤q−11 \le k \le q - 1)
  3. 일회용 키 K=YAk mod qK = Y_A^k \bmod q 계산
  4. 암호문 생성:

C1=αk mod q,C2=K⋅M mod qC_1 = \alpha^k \bmod q, \quad C_2 = K \cdot M \bmod q

복호화 (A)​

  1. K=C1XA mod qK = C_1^{X_A} \bmod q 로 일회용 키 복원
  2. M=C2⋅K−1 mod qM = C_2 \cdot K^{-1} \bmod q
동작 증명

K=YAk mod q=(αXA)k mod q=αkXA mod q=(C1)XA mod qK = Y_A^k \bmod q = (\alpha^{X_A})^k \bmod q = \alpha^{kX_A} \bmod q = (C_1)^{X_A} \bmod q

따라서 복호화 시 동일한 KK를 복원할 수 있고, C2⋅K−1=K⋅M⋅K−1=MC_2 \cdot K^{-1} = K \cdot M \cdot K^{-1} = M이다.

예시 (q=19q = 19, α=10\alpha = 10, XA=5X_A = 5)​

YA=105 mod 19=3,공개키={19,10,3}Y_A = 10^5 \bmod 19 = 3, \quad \text{공개키} = \{19, 10, 3\}

M=17M = 17을 암호화 (k=6k = 6):

K=36 mod 19=7K = 3^6 \bmod 19 = 7

C1=106 mod 19=11,C2=7×17 mod 19=5C_1 = 10^6 \bmod 19 = 11, \quad C_2 = 7 \times 17 \bmod 19 = 5

복호화:

K=115 mod 19=7,K−1 mod 19=11K = 11^5 \bmod 19 = 7, \quad K^{-1} \bmod 19 = 11

M=5×11 mod 19=17M = 5 \times 11 \bmod 19 = 17

각 블록마다 고유한 kk 필수

같은 kk를 두 블록에 사용하면, 한 블록 M1M_1을 알 때 다른 블록을 쉽게 복원할 수 있다:

M2=C2,1−1⋅C2,2⋅M1 mod qM_2 = C_{2,1}^{-1} \cdot C_{2,2} \cdot M_1 \bmod q

보안: 공격자가 개인키 XAX_A를 복원하려면 XA=dlogα,q(YA)X_A = \text{dlog}_{\alpha,q}(Y_A)를 계산해야 한다. pp가 최소 300자릿수이고 q−1q - 1에 큰 소인수가 포함되면 안전하다.


10.3 타원곡선 산술​

RSA의 키 길이가 보안 강화를 위해 계속 증가하면서 처리 부담이 커지고 있다. 이에 대한 대안으로 **타원곡선 암호(ECC)**가 도전하고 있다. ECC의 핵심 매력은 훨씬 작은 키 크기로 동등한 보안을 제공한다는 점이다.

아벨 그룹 (Abelian Group) 복습​

아벨 그룹 {G,⋅}\{G, \cdot\}은 다섯 가지 공리를 만족하는 집합과 이항 연산의 쌍이다:

  • (A1) 닫힘: a,b∈G⇒a⋅b∈Ga, b \in G \Rightarrow a \cdot b \in G
  • (A2) 결합법칙: a⋅(b⋅c)=(a⋅b)⋅ca \cdot (b \cdot c) = (a \cdot b) \cdot c
  • (A3) 항등원: ∃ e∈G\exists\, e \in G, a⋅e=aa \cdot e = a
  • (A4) 역원: 각 aa에 대해 a′∈Ga' \in G, a⋅a′=ea \cdot a' = e
  • (A5) 교환법칙: a⋅b=b⋅aa \cdot b = b \cdot a

Diffie-Hellman은 Zp∗\mathbb{Z}_p^* 위의 곱셈 그룹을 사용하고, ECC는 타원곡선 위의 덧셈 그룹을 사용한다. DH에서 ak mod qa^k \bmod q에 대응하는 ECC 연산은 k⋅P=P+P+⋯+P⏟k번k \cdot P = \underbrace{P + P + \cdots + P}_{k\text{번}}이다.

실수 위의 타원곡선​

타원곡선은 (타원이 아니라) 다음과 같은 3차 방정식으로 정의된다:

y2=x3+ax+by^2 = x^3 + ax + b

여기에 무한원점(point at infinity) O\mathcal{O}를 포함한 점의 집합 E(a,b)E(a, b)를 정의한다. 다음 조건을 만족하면 그룹이 형성된다:

4a3+27b2≠04a^3 + 27b^2 \neq 0

덧셈 규칙 (기하학적)​

  1. O\mathcal{O}는 항등원: P+O=PP + \mathcal{O} = P
  2. P=(x,y)P = (x, y)의 역원은 −P=(x,−y)-P = (x, -y), P+(−P)=OP + (-P) = \mathcal{O}
  3. 두 점 PP, QQ의 덧셈: PP와 QQ를 잇는 직선의 세 번째 교점 RR에 대해 P+Q=−RP + Q = -R (x축 대칭)
  4. PP와 −P-P (동일 x좌표, 수직선): P+(−P)=OP + (-P) = \mathcal{O}
  5. 점의 배가: QQ에서의 접선의 다른 교점 SS에 대해 2Q=−S2Q = -S

덧셈 규칙 (대수적)​

서로 다른 두 점 P=(xP,yP)P = (x_P, y_P), Q=(xQ,yQ)Q = (x_Q, y_Q)에 대해 R=P+Q=(xR,yR)R = P + Q = (x_R, y_R):

λ=yQ−yPxQ−xP\lambda = \frac{y_Q - y_P}{x_Q - x_P}

xR=λ2−xP−xQ,yR=−yP+λ(xP−xR)x_R = \lambda^2 - x_P - x_Q, \quad y_R = -y_P + \lambda(x_P - x_R)

점의 배가 P+P=2PP + P = 2P (yP≠0y_P \neq 0):

λ=3xP2+a2yP\lambda = \frac{3x_P^2 + a}{2y_P}

xR=λ2−2xP,yR=λ(xP−xR)−yPx_R = \lambda^2 - 2x_P, \quad y_R = \lambda(x_P - x_R) - y_P

Zp\mathbb{Z}_p 위의 타원곡선​

변수와 계수를 Zp\mathbb{Z}_p로 제한:

y2 mod p=(x3+ax+b) mod py^2 \bmod p = (x^3 + ax + b) \bmod p

그룹 형성 조건: (4a3+27b2) mod p≠0(4a^3 + 27b^2) \bmod p \neq 0

Zp\mathbb{Z}_p 위에서의 덧셈 규칙은 실수 위와 동일한 대수적 형태를 따르되, 모든 연산을  mod p\bmod p로 수행하고 나눗셈은 모듈러 역원으로 대체한다.

예시: E23(1,1)E_{23}(1, 1)에서 P=(3,10)P = (3, 10), Q=(9,7)Q = (9, 7)​

λ=7−109−3 mod 23=−36 mod 23=−12 mod 23=11\lambda = \frac{7 - 10}{9 - 3} \bmod 23 = \frac{-3}{6} \bmod 23 = \frac{-1}{2} \bmod 23 = 11

xR=(112−3−9) mod 23=109 mod 23=17x_R = (11^2 - 3 - 9) \bmod 23 = 109 \bmod 23 = 17

yR=(11(3−17)−10) mod 23=−164 mod 23=20y_R = (11(3 - 17) - 10) \bmod 23 = -164 \bmod 23 = 20

P+Q=(17,20)P + Q = (17, 20)

점의 수 NN은 다음 범위에 있다:

p+1−2p≤N≤p+1+2pp + 1 - 2\sqrt{p} \le N \le p + 1 + 2\sqrt{p}

GF(2m)GF(2^m) 위의 타원곡선​

이 경우 사용되는 방정식 형태가 다르다:

y2+xy=x3+ax2+by^2 + xy = x^3 + ax^2 + b

그룹 형성 조건: b≠0b \neq 0. 하드웨어 구현에 적합하며 (비트 연산만으로 강력한 암호시스템 구축 가능), 소수 곡선(Zp\mathbb{Z}_p)은 소프트웨어에 적합하다.


10.4 타원곡선 암호 (ECC)​

타원곡선 이산대수 문제 (ECDLP)​

Q=kP(Q,P∈Eq(a,b),  k<q)Q = kP \quad (Q, P \in E_q(a,b),\; k < q)

kk와 PP가 주어졌을 때 QQ를 계산하는 것은 쉽지만, QQ와 PP가 주어졌을 때 kk를 결정하는 것은 어렵다. 이것이 ECC 보안의 근거이며, 가장 빠른 알려진 기법은 Pollard rho 방법이다.

ECC 키 크기 비교 (NIST SP 800-57)​

대칭키 (비트)DH/DSA (L,N)(L, N)RSA (비트)ECC (비트)
801024, 1601024160–223
1122048, 2242048224–255
1283072, 2563072256–383
1927680, 3847680384–511
25615360, 51215360512+

SP 800-57은 2030년까지 RSA 3072비트, ECC 256비트 이상을 권장한다. 동일 키 길이에서 ECC와 RSA의 계산 비용은 유사하므로, ECC는 더 짧은 키로 계산적 이점을 가진다.

ECC Diffie-Hellman 키 교환​

공통 파라미터: 타원곡선 Eq(a,b)E_q(a, b), 베이스 포인트 GG (큰 위수 nn)

  1. A: 비밀 nA<nn_A < n 선택, 공개키 PA=nA×GP_A = n_A \times G 계산
  2. B: 비밀 nB<nn_B < n 선택, 공개키 PB=nB×GP_B = n_B \times G 계산
  3. 공유 비밀:

K=nA×PB=nA×(nB×G)=nB×(nA×G)=nB×PAK = n_A \times P_B = n_A \times (n_B \times G) = n_B \times (n_A \times G) = n_B \times P_A

예시​

p=211,Ep(0,−4):y2=x3−4,G=(2,2),240G=Op = 211, \quad E_p(0, -4): y^2 = x^3 - 4, \quad G = (2, 2), \quad 240G = \mathcal{O}

nA=121  →  PA=121⋅(2,2)=(115,48)n_A = 121 \;\to\; P_A = 121 \cdot (2,2) = (115, 48)

nB=203  →  PB=203⋅(2,2)=(130,203)n_B = 203 \;\to\; P_B = 203 \cdot (2,2) = (130, 203)

K=121⋅(130,203)=203⋅(115,48)=(161,69)K = 121 \cdot (130, 203) = 203 \cdot (115, 48) = (161, 69)

비밀키는 점 쌍

공유 비밀키는 좌표 쌍이다. 대칭 암호의 세션키로 사용하려면 xx 좌표 등에서 단일 값을 추출한다.

ECC 암호화/복호화​

각 사용자 A는 개인키 nAn_A를 선택하고 공개키 PA=nA×GP_A = n_A \times G를 생성한다.

암호화 (A → B): 메시지를 타원곡선 점 PmP_m으로 인코딩한 뒤, 랜덤 kk를 선택:

Cm={kG,    Pm+kPB}C_m = \{kG, \;\; P_m + kP_B\}

복호화 (B): 첫 번째 점에 자신의 개인키를 곱하여 마스크를 제거:

Pm+kPB−nB(kG)=Pm+k(nBG)−nB(kG)=PmP_m + kP_B - n_B(kG) = P_m + k(n_BG) - n_B(kG) = P_m

마스킹 원리

A는 kPBkP_B를 더해 메시지를 마스킹한다. kk를 아는 사람은 A뿐이므로 공격자가 마스크를 제거할 수 없다. 동시에 A는 "단서" kGkG를 포함시켜, 개인키 nBn_B를 아는 B만이 nB(kG)=kPBn_B(kG) = kP_B를 계산하여 마스크를 제거할 수 있게 한다.

예시​

q=257,E257(0,−4):y2=x3−4,G=(2,2)q = 257, \quad E_{257}(0, -4): y^2 = x^3 - 4, \quad G = (2, 2)

nB=101,PB=101⋅(2,2)=(197,167)n_B = 101, \quad P_B = 101 \cdot (2,2) = (197, 167)

Pm=(112,26),k=41P_m = (112, 26), \quad k = 41

kG=41⋅(2,2)=(136,128)kG = 41 \cdot (2,2) = (136, 128)

kPB=41⋅(197,167)=(68,84)kP_B = 41 \cdot (197, 167) = (68, 84)

Cm={(136,128),    (112,26)+(68,84)}={(136,128),    (246,174)}C_m = \{(136, 128),\;\; (112,26) + (68,84)\} = \{(136, 128),\;\; (246, 174)\}

복호화: (246,174)−101⋅(136,128)=(246,174)−(68,84)=(112,26)=Pm(246, 174) - 101 \cdot (136, 128) = (246, 174) - (68, 84) = (112, 26) = P_m


10.5 비대칭 암호 기반 의사난수 생성​

비대칭 암호 알고리즘은 겉보기에 랜덤한 출력을 생성하므로 PRNG의 기반이 될 수 있다. 대칭 알고리즘보다 느리기 때문에, 개방형 비트 스트림이 아니라 짧은 의사난수 비트 시퀀스를 생성하는 PRF 용도로 사용된다.

Micali-Schnorr PRNG (RSA 기반)​

ANSI X9.82, ISO 18031에 권장. OFB 모드와 유사한 구조에서 RSA를 사용한다. 출력을 두 부분으로 나누어 **순방향 예측 불가능성(forward unpredictability)**을 확보한다.

절차:

yi=xi−1e mod ny_i = x_{i-1}^e \bmod n

  • xix_i = yiy_i의 상위 rr비트 (다음 반복의 입력)
  • ziz_i = yiy_i의 하위 kk비트 (의사난수 출력)

r+k=Nr + k = N (NN은 nn의 비트 길이). 파라미터 조건:

조건목적
n=pqn = pq (두 소수의 곱)RSA 수준의 암호 강도
gcd⁡(e,ϕ(n))=1\gcd(e, \phi(n)) = 1s↦se mod ns \mapsto s^e \bmod n 매핑이 일대일
r⋅e≥2Nr \cdot e \ge 2^N완전한 모듈러 축소 보장
r≥2×strengthr \ge 2 \times \text{strength}암호 공격 방어

예: e=3e = 3, N=1024N = 1024이면 3r>10243r > 1024이므로 r≥683r \ge 683, k=341k = 341비트가 매 지수 연산마다 생성된다.

Dual EC PRNG (ECC 기반)​

NSA가 개발. 타원곡선 위의 알려진 두 점 PP, QQ를 사용한다:

si=x(si−1⋅P),ri=lsb240(x(si⋅Q))s_i = x(s_{i-1} \cdot P), \quad r_i = \text{lsb}_{240}(x(s_i \cdot Q))

보안 논란

이 알고리즘의 보안성과 효율성에 대한 논란이 있다. ECC를 이미 구현했지만 다른 PRNG 알고리즘이 없는 시스템에서만 사용 동기가 있다.


주요 용어​

한글영문
아벨 그룹abelian group
이진 곡선binary curve
3차 방정식cubic equation
Diffie-Hellman 키 교환Diffie-Hellman key exchange
이산대수discrete logarithm
타원곡선elliptic curve
타원곡선 산술elliptic curve arithmetic
타원곡선 암호elliptic curve cryptography (ECC)
유한체finite field
중간자 공격man-in-the-middle attack
Micali-SchnorrMicali-Schnorr
소수 곡선prime curve
원시근primitive root
무한원점zero point