ElGamal — 이산 대수 기반 공개키 암호

RSA가 소인수분해의 어려움에 기반한다면, ElGamal은 이산 대수 문제(DLP)에 기반한다. 두 시스템은 서로 다른 수학적 어려움을 활용하는데, 결정적 차이가 하나 있다. ElGamal은 암호화할 때마다 다른 암호문을 생성한다. 이 점이 의미론적 안전성(IND-CPA)의 핵심이 된다.

이 포스트에서 다루는 내용
  • 보안 근거: 이산 대수 문제 (DLP). gxmodpg^x \bmod p에서 xx를 구하는 것은 지수적으로 어렵다
  • 키 생성: 비밀키 xx, 공개키 h=gxmodph = g^x \bmod p
  • 암호화: 랜덤 kk 선택 → 암호문 (A,B)=(gk,mhk)modp(A, B) = (g^k, m \cdot h^k) \bmod p
  • 복호화: 공유 비밀 s=Axs = A^x, 평문 m=Bs1modpm = B \cdot s^{-1} \bmod p
  • 확률적 암호화: 같은 평문도 kk가 달라지면 다른 암호문 → IND-CPA 만족

RSA와의 차이: 왜 다른 어려움이 필요한가

RSA는 n=pqn = pq 소인수분해의 어려움에 의존한다. 이 문제는 검증된 어려움이지만, 같은 평문을 항상 같은 암호문으로 변환한다는 결정론적(deterministic) 특성이 있다. 공격자가 후보 평문을 암호화해 비교하는 선택 평문 공격(CPA)에 취약하다.

ElGamal은 이산 대수 문제(Discrete Logarithm Problem, DLP) 라는 독립적인 어려움을 사용한다. 그리고 암호화 과정에 랜덤성을 도입해 동일한 평문도 매번 다른 암호문으로 변환된다.

이산 대수 문제 (DLP)

소수 pp, 생성원(generator) gZpg \in \mathbb{Z}_p^*, 그리고 h=gxmodph = g^x \bmod p가 주어졌을 때, xx를 구하여라.

정방향 계산 kgkmodpk \to g^k \bmod p는 Square-and-Multiply로 O(logk)O(\log k)에 가능하다. 반면 역방향 gkmodpkg^k \bmod p \to k를 구하는 알고리즘은 아직 다항식 시간으로 알려져 있지 않다. 가장 빠른 알고리즘(Number Field Sieve)조차 준지수 시간 L[1/3]L[1/3]이 필요하다.

이산 대수 문제 — p=11, g=2에서 ℤ₁₁* 순환과 DLP
이산 대수 문제 — p=11, g=2에서 ℤ₁₁* 순환과 DLP

생성원(Generator): 소수 pp에 대해 gZpg \in \mathbb{Z}_p^*생성원 이라는 것은 gg의 거듭제곱이 Zp\mathbb{Z}_p^*의 모든 원소를 순환한다는 의미다.

{g0,g1,g2,,gp2}=Zp(mod p)\{g^0, g^1, g^2, \ldots, g^{p-2}\} = \mathbb{Z}_p^* \quad (\bmod\ p)

p=11p = 11, g=2g = 2이면 {1,2,4,8,5,10,9,7,3,6}=Z11\{1, 2, 4, 8, 5, 10, 9, 7, 3, 6\} = \mathbb{Z}_{11}^*으로 10개 원소 전부를 생성한다. 페르마의 소정리에 의해 gp11(modp)g^{p-1} \equiv 1 \pmod{p}이므로, 지수는 주기 p1p-1로 순환한다.

ElGamal 설정

공개 파라미터: 큰 소수 pp, Zp\mathbb{Z}_p^*의 생성원 gg

평문 공간: 메시지 mm은 아무 정수가 아니라 연산하는 군의 원소여야 한다. Zp\mathbb{Z}_p^*에서 쓴다면 1mp11 \le m \le p-1이고, 특히 m=0m = 0은 평문이 될 수 없다. m=0m = 0이면 B=0hk=0B = 0 \cdot h^k = 0이 되어 kk와 무관하게 암호문이 늘 00이고, 그 순간 확률적 암호화도 IND-CPA도 무너진다.

임의의 바이트열을 보내려면 먼저 군의 원소로 옮기는 인코딩이 필요하다. 데이터를 pp보다 작은 수로 자르고 00을 피하도록 옮기는 방식이 가장 단순하고, 뒤에서 볼 소수 위수 부분군에서 쓴다면 그 부분군 안으로 보내는 사상이 따로 필요하다. 인코딩은 복호 뒤 되돌릴 수 있어야 하므로 단사여야 한다.

키 생성 (수신자 Alice):

  1. 비밀키 xx1xp21 \leq x \leq p-2 범위에서 무작위 선택
  2. h=gxmodph = g^x \bmod p 계산
  3. 공개키: (p, g, h)(p,\ g,\ h) · 개인키: xx

암호화 (송신자 Bob):

  1. 임시 비밀(ephemeral key) kk1kp21 \leq k \leq p-2 범위에서 무작위 선택
  2. A=gkmodpA = g^k \bmod p
  3. B=mhkmodpB = m \cdot h^k \bmod p
  4. 암호문: (A, B)(A,\ B)

복호화 (수신자 Alice):

  1. 공유 비밀 s=Axmodps = A^x \bmod p 계산
  2. ss의 모듈러 역원 s1modps^{-1} \bmod p 계산 (확장 유클리드 알고리즘)
  3. 복원: m=Bs1modpm = B \cdot s^{-1} \bmod p
ElGamal 암복호화 흐름 — p=11, g=2 수치 예시
ElGamal 암복호화 흐름 — p=11, g=2 수치 예시

복호화 정확성 증명

Bs1B \cdot s^{-1}mm을 복원하는가.

s=Ax=(gk)x=gkx(modp)s = A^x = (g^k)^x = g^{kx} \pmod{p} hk=(gx)k=gxk(modp)h^k = (g^x)^k = g^{xk} \pmod{p}

따라서 s=hks = h^k이다. BB의 정의에 의해

Bs1=mhk(hk)1=m(modp)B \cdot s^{-1} = m \cdot h^k \cdot (h^k)^{-1} = m \pmod{p} \quad \checkmark

핵심은 Alice와 Bob이 각자 독립적으로 동일한 공유 비밀 gkxmodpg^{kx} \bmod p를 계산한다는 것이다.

  • Bob: hk=(gx)kh^k = (g^x)^k (Alice의 공개키 hh와 자신의 임시 키 kk 사용)
  • Alice: Ax=(gk)xA^x = (g^k)^x (Bob이 보낸 AA와 자신의 비밀키 xx 사용)

이는 Diffie-Hellman 키 교환의 직접적인 응용이다. ElGamal 암호화는 DH 키 교환에 메시지 마스킹(mhkm \cdot h^k)을 결합한 구조이다.

보안 근거: CDH 가정

ElGamal이 기대는 가정은 두 개이고 서로 다른 것을 보장한다.

메시지를 통째로 복원하지 못한다 — CDH

CDH. gg, gxg^x, gkg^k 가 주어졌을 때 gxkg^{xk}를 계산하는 다항식 시간 알고리즘이 존재하지 않는다.

공격자가 암호문 (A,B)=(gk,mhk)(A, B) = (g^k, m \cdot h^k)을 가로채더라도 공유 비밀 gxkg^{xk}를 계산하지 못하면 mm을 복원할 수 없다. 이것이 단방향성(one-wayness) 이다.

DLP와의 관계는 한쪽 방향만 알려져 있다. DLP를 풀 수 있으면 gxg^x에서 xx를 얻어 (gk)x(g^k)^x를 계산할 수 있으므로 CDH도 풀린다. 여기서 나오는 결론은 CDH가 어려우면 DLP도 어렵다이다. 반대로 CDH를 푸는 능력에서 DLP 해법을 얻는 일반적인 방법은 알려져 있지 않다. 그러니 「DLP가 어려우니 CDH도 어렵다」고 말할 수는 없고, CDH는 DLP보다 강한 가정으로 따로 세워야 한다.

한 비트도 새지 않는다 — DDH

IND-CPA는 CDH만으로는 나오지 않는다. gxkg^{xk}를 통째로 계산하지 못해도 그 일부 정보가 새면 두 후보 평문을 구별할 수 있기 때문이다. 그래서 필요한 것이 더 강한 가정이다.

DDH. gg, gxg^x, gkg^k, ZZ 가 주어졌을 때 Z=gxkZ = g^{xk}인지 ZZ가 무작위인지 구별하는 것이 어렵다.

DDH는 Zp\mathbb{Z}_p^* 전체에서는 성립하지 않는다. 르장드르 기호로 제곱잉여 여부를 다항식 시간에 판정할 수 있고, gxkg^{xk}의 제곱잉여 여부가 gxg^xgkg^k의 그것으로 정해지기 때문이다. 그래서 IND-CPA를 말하려면 소수 위수 qq인 부분군에서 연산해야 한다. p=2q+1p = 2q+1인 안전 소수의 제곱잉여 부분군이 그런 군이다. 자세한 이야기는 Diffie-Hellman 글에서 다룬다.

쉽게 말하면

CDH 가정은 "재료 두 개(gxg^x, gkg^k)를 알아도 완성품(gxkg^{xk})을 만들 수 없다"는 것이고, DDH 가정은 한 걸음 더 나아가 "완성품인지 아닌지조차 알아볼 수 없다"는 것이다. 메시지를 통째로 못 읽는 것과 한 비트도 알아내지 못하는 것은 서로 다른 요구이고, 뒤엣것에 더 강한 가정이 든다.

확률적 암호화와 IND-CPA 안전성

ElGamal의 핵심 이점은 확률적(randomized) 암호화다.

같은 평문 mm도 임시 키 kk가 달라지면 완전히 다른 암호문이 생성된다.

확률적 암호화 — ElGamal vs RSA 의미론적 안전성 비교
확률적 암호화 — ElGamal vs RSA 의미론적 안전성 비교

이 성질은 IND-CPA(선택 평문 공격 하 식별 불가능성) 안전성을 가능하게 한다.

  • RSA(교과서적): mCm \to C가 결정론적. 공격자가 두 후보 m0,m1m_0, m_1을 직접 암호화해 도전 암호문 CC^*와 비교 가능.
  • ElGamal: m(A,B)m \to (A, B)가 확률적. 공격자가 mm을 암호화해도 kk가 달라 CC^*와 일치하지 않음.

단, 암호문이 두 개의 군 원소 (A,B)(A, B)로 구성되므로 평문 대비 암호문 크기가 2배로 증가한다. RSA 대비 트레이드오프다.

ElGamal vs RSA 비교
  • 보안 근거: ElGamal은 DLP (이산 대수), RSA는 소인수분해
  • 암호화 유형: ElGamal은 확률적 (IND-CPA), RSA는 결정론적 (교과서적)
  • 암호문 크기: ElGamal은 평문의 2배, RSA는 평문과 동일
  • 랜덤 비트 사용: ElGamal은 매번 필요, RSA는 불필요 (OAEP 적용 시 필요)

올바른 파라미터 선택

소수 pp 크기: DLP의 어려움은 pp의 크기에 비례한다. 현재 권장은 2048비트 이상. p1p-1이 큰 소인수를 포함해야 한다 (Pohlig-Hellman 공격 방지).

생성원 gg 선택: ggZp\mathbb{Z}_p^* 전체를 생성해야 한다. p1p-1의 소인수 qq에 대해 g(p1)/q≢1(modp)g^{(p-1)/q} \not\equiv 1 \pmod{p}를 확인한다.

임시 키 kk 관리: kk는 암호화마다 독립적으로 새로 선택해야 한다. 같은 kk를 두 번 사용하면 두 암호문 B1=m1hkB_1 = m_1 \cdot h^k, B2=m2hkB_2 = m_2 \cdot h^k에서 B1/B2=m1/m2B_1 / B_2 = m_1 / m_2가 노출된다.

핵심 정리
  • ElGamal은 DLP의 어려움에 기반한다. gxg^x를 알아도 xx를 역산하는 다항식 알고리즘은 알려져 있지 않다.
  • 복호화 정확성은 Ax=hk=gkxA^x = h^k = g^{kx}라는 공유 비밀의 동등성에서 비롯된다. Diffie-Hellman 키 교환의 직접 응용이다.
  • 확률적 암호화 덕분에 동일 평문도 매번 다른 암호문을 생성한다. 이것이 IND-CPA 안전성의 핵심이다.
  • 임시 키 kk를 재사용하면 즉시 평문 비율이 노출된다. kk는 반드시 매번 새로 생성해야 한다.
다음 포스트

Diffie-Hellman — 공개 채널 위의 비밀 키 교환에서는 ElGamal의 수학적 기반이 된 Diffie-Hellman 키 교환 프로토콜, CDH/DDH 가정, 중간자 공격과 인증 문제, 전방향 안전성, 그리고 DH에서 ElGamal로의 확장까지 다룬다.

© 2026 XsQuare01. Powered by GitHub Pages. · 방문자