암호학은 정수론 위에 세워져 있다. 이 장은 이후 장(유한체, 공개키 암호)을 이해하기 위한 기반을 다룬다.
학습 목표
- 가분성과 나눗셈 알고리즘을 이해한다.
- 유클리드 알고리즘으로 최대공약수를 구한다.
- 모듈러 산술과 확장 유클리드 알고리즘을 다룬다.
- 소수, 페르마 정리, 오일러 정리, 오일러 토티언트 함수를 설명한다.
- 밀러–라빈 소수 판정, 중국인의 나머지 정리, 이산 로그를 이해한다.
2.1 가분성과 나눗셈 알고리즘
가분성 (Divisibility)
정수 a,b,m에 대해 a=mb (b=0) 이면 "b가 a를 나눈다"라 하고 b∣a로 표기.
가분성의 주요 성질
- a∣1⇒a=±1
- a∣b 이고 b∣a 이면 a=±b
- b=0 이면 b∣0
- a∣b 이고 b∣c 이면 a∣c (이행성)
- b∣g 이고 b∣h 이면 임의의 정수 m,n에 대해 b∣(mg+nh)
나눗셈 알고리즘 (Division Algorithm)
임의의 정수 a와 양의 정수 n에 대해, 다음을 만족하는 유일한 정수 q(몫)와 r(나머지)가 존재한다.
a=qn+r,0≤r<n,q=⌊a/n⌋
r은 잉여(residue) 라고도 부른다.
예시
- a=11, n=7: 11=1⋅7+4, q=1, r=4
- a=−11, n=7: −11=(−2)⋅7+3, q=−2, r=3
2.2 유클리드 알고리즘
최대공약수 (GCD)
두 정수 a,b를 모두 나누는 가장 큰 양의 정수를 gcd(a,b)로 표기.
- gcd(a,b)=gcd(∣a∣,∣b∣)
- gcd(a,0)=∣a∣
- gcd(a,b)=1 이면 서로소(relatively prime)
유클리드 알고리즘의 핵심 정리
gcd(a,b)=gcd(b, amodb)
이 관계를 반복 적용하여 gcd를 구한다.
재귀 정의
Euclid(a, b):
if b == 0: return a
else: return Euclid(b, a mod b)
예시: gcd(1160718174, 316258250)=1078
| 단계 | 피제수 | 제수 | 몫 | 나머지 |
|---|
| 1 | 1,160,718,174 | 316,258,250 | 3 | 211,943,424 |
| 2 | 316,258,250 | 211,943,424 | 1 | 104,314,826 |
| 3 | 211,943,424 | 104,314,826 | 2 | 3,313,772 |
| … | … | … | … | … |
| 10 | 2,156 | 1,078 | 2 | 0 |
2.3 모듈러 산술
Modulus와 합동 (Congruence)
정수 a, 양의 정수 n에 대해 amodn은 a를 n으로 나눈 나머지.
a≡b(modn)⟺n∣(a−b)
합동 관계의 성질
- a≡b(modn) iff n∣(a−b)
- a≡b(modn) 이면 b≡a(modn)
- a≡b, b≡c(modn) 이면 a≡c(modn)
모듈러 산술 연산의 성질
[(amodn)+(bmodn)]modn=(a+b)modn
[(amodn)−(bmodn)]modn=(a−b)modn
[(amodn)×(bmodn)]modn=(a×b)modn
빠른 모듈러 거듭제곱 예시: 117mod13
112114117=121≡4(mod13)=(112)2≡16≡3(mod13)=11⋅112⋅114≡11⋅4⋅3≡132≡2(mod13)
잉여류 집합 Zn
Zn={0,1,2,…,n−1}
Zn은 단위원을 갖는 가환환(commutative ring) 이다.
곱셈 소거 법칙 (주의)
보통의 산술과 달리, 모듈러 산술에서 곱셈 소거는 조건부로만 성립한다.
a⋅b≡a⋅c(modn)⇒b≡c(modn),단, gcd(a,n)=1
a가 n과 서로소일 때만 a의 곱셈 역원이 존재한다.
확장 유클리드 알고리즘 (Extended Euclidean)
gcd 뿐 아니라 베주 계수(Bézout coefficients) x,y도 함께 구한다.
ax+by=gcd(a,b)
반복 과정에서 다음 점화식을 유지한다.
xi=xi−2−qixi−1,yi=yi−2−qiyi−1
활용: a의 모듈러 역원 a−1modn은 ax+ny=1을 풀어 x로 구한다. 이는 RSA 키 생성, 유한체 연산에서 핵심적으로 사용된다.
예시: 1759x+550y=gcd(1759,550)
| i | ri | qi | xi | yi |
|---|
| -1 | 1759 | — | 1 | 0 |
| 0 | 550 | — | 0 | 1 |
| 1 | 109 | 3 | 1 | -3 |
| 2 | 5 | 5 | -5 | 16 |
| 3 | 4 | 21 | 106 | -339 |
| 4 | 1 | 1 | -111 | 355 |
결과: gcd=1, x=−111, y=355
2.4 소수
p>1인 정수가 ±1,±p 외의 약수를 갖지 않으면 소수(prime) 이다.
산술의 기본 정리
임의의 정수 a>1은 소수의 곱으로 유일하게 분해된다.
a=p1a1p2a2⋯ptat,p1<p2<⋯<pt
또는 모든 소수 p∈P에 대해
a=p∈P∏pap,ap≥0
소인수분해로 보는 gcd
a=∏pap, b=∏pbp 일 때
gcd(a,b)=p∈P∏pmin(ap,bp)
단, 소인수분해 자체가 어렵기 때문에 이 공식은 실용적 계산법이 아니다. 실제로는 유클리드 알고리즘을 사용한다.
2.5 페르마 정리와 오일러 정리
페르마의 작은 정리 (Fermat's Little Theorem)
p가 소수이고 gcd(a,p)=1 이면
ap−1≡1(modp)
대안형 (a가 p로 나누어져도 성립):
ap≡a(modp)
예시: p=19, a=7⇒718≡1(mod19)
오일러 토티언트 함수 ϕ(n)
1부터 n−1까지의 정수 중 n과 서로소인 것의 개수. 관례상 ϕ(1)=1.
핵심 공식
| 조건 | 공식 |
|---|
| p가 소수 | ϕ(p)=p−1 |
| p가 소수, k≥1 | ϕ(pk)=pk−pk−1 |
| gcd(m,n)=1 | ϕ(mn)=ϕ(m)ϕ(n) |
| p,q가 서로 다른 소수, n=pq | ϕ(n)=(p−1)(q−1) |
마지막 공식은 RSA의 키 생성 에서 직접 사용된다.
오일러 정리
gcd(a,n)=1 이면
aϕ(n)≡1(modn)
대안형:
aϕ(n)+1≡a(modn)
페르마 정리는 오일러 정리의 특수한 경우 (n=p 소수)이다.
2.6 소수 판정 (Primality Testing)
밀러–라빈 알고리즘 (Miller–Rabin)
암호학에서 가장 널리 쓰이는 확률적 소수 판정 알고리즘.
핵심 성질
성질 1: p가 소수이고 0<a<p 이면
a2≡1(modp)⟺a≡±1(modp)
성질 2: p>2가 소수일 때 p−1=2kq (q는 홀수)로 표현하면, 1<a<p−1인 임의의 a에 대해 다음 중 하나가 반드시 성립.
- aq≡1(modp)
- 어떤 j (0≤j≤k−1)에 대해 a2jq≡−1(modp)
알고리즘
TEST(n):
find k > 0, q odd such that (n - 1) = 2^k · q
pick random a with 1 < a < n - 1
if a^q mod n == 1: return "inconclusive"
for j = 0 to k - 1:
if a^(2^j · q) mod n == n - 1: return "inconclusive"
return "composite"
composite 반환 → n은 확실히 합성수
inconclusive 반환 → n은 아마도 소수 (결정적이지 않음)
반복 사용과 정확도
n이 합성수이지만 한 번의 TEST에서 inconclusive를 반환할 확률은 <1/4. t번 반복 시 모두 통과할 확률은
<(1/4)t
예: t=10이면 10−6 미만.
AKS 알고리즘 (결정적)
2002년 Agrawal–Kayal–Saxena가 발표한 결정적 다항시간 소수 판정 알고리즘. 이론적으로 획기적이지만, 실제 성능은 여전히 밀러–라빈보다 느려 실무에서는 밀러–라빈이 주로 사용된다.
소수의 분포 (소수 정리)
n 근처에서 소수는 평균적으로 ln(n)마다 하나씩 존재. 짝수를 제외하면 평균 0.5ln(n)번 시도 후 소수 발견.
2200 크기의 소수를 찾으려면 평균 0.5ln(2200)≈69번 시도.
2.7 중국인의 나머지 정리 (CRT)
서로 쌍으로 서로소인 m1,m2,…,mk에 대해 M=∏i=1kmi라 하자.
ZM의 임의의 원소 A는 다음 k-튜플과 일대일 대응한다.
A↔(a1,a2,…,ak),ai=Amodmi
복원 공식
Mi=M/mi, ci=Mi⋅(Mi−1modmi) 로 정의할 때
A≡i=1∑kaici(modM)
합동 연산은 튜플별 연산으로 환원
(A±B)modM↔((a1±b1)modm1, …, (ak±bk)modmk)
(A⋅B)modM↔((a1⋅b1)modm1, …, (ak⋅bk)modmk)
큰 수 M에 대한 연산을 작은 mi들에 대한 연산으로 분해할 수 있다. RSA 복호화 가속(CRT 최적화)의 핵심 원리.
예시 (손자의 문제): x≡2(mod3), x≡3(mod5), x≡2(mod7)⇒x=23
2.8 이산 로그 (Discrete Logarithms)
정수의 차수 (Order)
gcd(a,n)=1일 때 am≡1(modn)을 만족하는 가장 작은 양의 정수 m을 a의 차수(order) 라 한다. m은 항상 ϕ(n)을 나눈다.
원시근 (Primitive Root)
차수가 ϕ(n)인 정수를 n의 원시근이라 한다. a가 n의 원시근이면
a, a2, a3, …, aϕ(n)
는 서로 다른 (mod n) 값이고, 모두 n과 서로소.
- 원시근을 갖는 정수 n은 2,4,pk,2pk 형태뿐 (p는 홀수 소수).
- 소수 p는 항상 원시근을 갖는다.
이산 로그의 정의
a가 소수 p의 원시근이면, 임의의 b에 대해 유일한 i (0≤i≤p−2)가 존재해
b≡ai(modp)
이 i를 b의 a를 밑으로 하는 이산 로그라 하고 dloga,p(b) 또는 inda,p(b)로 표기.
로그 성질의 유사성
dloga,p(xy)≡dloga,p(x)+dloga,p(y)(modϕ(p))
dloga,p(yr)≡r⋅dloga,p(y)(modϕ(p))
이산 로그 문제 (DLP)
y=gxmodp에서
- g,x,p로 y 계산 → 쉬움 (빠른 거듭제곱, Chapter 9)
- y,g,p로 x 계산 → 매우 어려움
현재 가장 빠른 알고리즘의 점근적 복잡도:
O(exp((lnp)1/3(lnlnp)2/3))
이 일방향성이 Diffie–Hellman 키 교환, ElGamal, DSA 등의 보안을 지탱한다.
부록 2A. Mod의 두 가지 의미
mod는 두 가지 방식으로 사용된다.
이항 연산자로서의 mod
amodn=a−⌊a/n⌋⋅n,n=0
두 정수를 받아 나머지를 반환. 예: 7mod3=1.
합동 관계로서의 mod
a≡b(modn)⟺amodn=bmodn⟺n∣(a−b)
괄호 사용이 다름에 유의:
- 이항 연산자:
a mod n (괄호 없음)
- 합동 관계:
a ≡ b (mod n) (괄호 안에 modulus)
주요 용어
| 한글 | 영문 |
|---|
| 전단사 | bijection |
| 합성수 | composite number |
| 중국인의 나머지 정리 | Chinese remainder theorem |
| 이산 로그 | discrete logarithm |
| 약수 | divisor |
| 유클리드 알고리즘 | Euclidean algorithm |
| 오일러 정리 | Euler's theorem |
| 오일러 토티언트 함수 | Euler's totient function |
| 페르마 정리 | Fermat's theorem |
| 최대공약수 | greatest common divisor (gcd) |
| 모듈러 산술 | modular arithmetic |
| 법, 모듈러스 | modulus |
| 차수 | order |
| 소수 | prime number |
| 원시근 | primitive root |
| 서로소 | relatively prime |
| 잉여 | residue |