이전 글에서는 보안의 기본 개념과 대표적인 암호 시스템에 대해 간략하게 설명했습니다.
비대칭 암호에서 어려운 문제란 무엇이고 그것이 어떻게 사용되는지 알아보겠습니다. 자세한 내용보다는 개념 위주로 서술하겠습니다.
RSA 암호
RSA 암호는 IFP (Integer Factorization Problem) 문제를 사용합니다. IFP 문제는 간단히 소인수분해라고 생각하면 됩니다.
pq=n일 때, p와 q를 이용해 n을 구하는 것은 쉽지만 n으로 p와 q를 구하는 것은 어렵습니다.
Number Theory
소수
먼저 소수(prime number)가 무엇인지에 대해 알아보겠습니다.
소수 p는 1보다 크며, ±1,±p만을 약수로 가집니다.
또한 이 소수들의 곱을 이용하면 모든 수를 표현할 수 있습니다.
1보다 큰 모든 정수 a에 대하여, a=p1α1⋅p2α2⋯ptαt(p1<p2⋯<pt, pi is prime number) 로 표현할 수 있는 단 하나의 방법이 존재합니다.
서로소
최대공약수에 대한 설명은 생략하겠습니다. 두 수 a, b에 대해서 c=gcd(a,b)를 a, b의 최대공약수라고 합니다.
만약 gcd(a,b)=1이라면 a와 b는 서로소입니다.
모듈러 연산
어떤 정수 a와 양의 정수 n이 있을 때, a를 n으로 나누면 다음과 같은 관계가 성립합니다.
a=q⋅n+r, 0≤r≤n and q=⌊a/n⌋. q는 몫, r은 나머지입니다.
여기서 amod n은 r, 즉 나머지가 됩니다.
만약 amodn=bmodn이라면 a≡bmodn이라고 쓰며, mod n에 대해 합동이라고 합니다.
Euler's Totient Function
오일러의 토션트 함수 또는 오일러의 파이 함수라고 부르는 함수가 있습니다.
이 함수는 양의 정수 n에 대해 n보다 작은 정수 중 1을 포함한 서로소의 개수를 나타냅니다.
표기는 다음과 같습니다.
ϕ(n)
오일러 토션트 함수는 다음과 같은 성질이 있습니다.
어떤 양의 정수에 n에서 다른 소수 p, q에 대해, n=p×q일 때, ϕ(n)은 다음과 같이 정해집니다.
ϕ(n)=ϕ(pq)=ϕ(p)ϕ(q)=(p−1)(q−1)
페르마의 소정리
페르마의 소정리는 다음과 같습니다.
p가 소수이고 a가 p로 나눠지지 않을 때 ap−1≡1modp가 성립합니다.
증명은 생략하겠습니다.
오일러의 정리
오일러의 정리는 페르마의 소정리의 일반화를 통해 얻어집니다.
모든 서로소인 a와 n에 대해 aϕ(n)≡1modn이 성립합니다.
오일러 토션트 함수의 성질을 이용해 다음과 같은 따름정리가 나오게 됩니다.
두 개의 소수 p와 q에 대해 정수 m과 n이 n=pq이고 0<m<n일 때,
mϕ(n)+1=m(p−1)(q−1)+1≡mmodn
RSA 암호의 구현
이제 위와 같은 정리들을 이용해 만들어진 RSA 암호를 살펴보겠습니다.
키 생성
- 두 개의 소수 p와 q를 정합니다.
- pq=n과 (p−1)(q−1)=ϕ(n)을 구합니다.
- ϕ(n)과 서로소인 정수 e를 고릅니다.
- 1modϕ(n)=ed가 되도록 d를 찾습니다.
여기서 n과 e가 공개키, d가 개인키가 됩니다. 왜 그럴까요?
그 이유를 설명하기 위해서 암호화 과정과 복호화 과정을 설명하겠습니다.
암호화와 복호화
- 암호화
C=Memodn for 0<M<N (여기서 M은 평문, C는 암호문입니다.)
- 복호화
M=Cdmodn
복호화가 왜 성립하는지 증명하겠습니다.
Cd=(Me)d=Med=Mkϕ(n)+1=M⋅(Mϕ(n))k=M
Cd=Med까지는 암호화의 과정을 적용시키면 쉽게 계산할 수 있습니다.
키 생성 과정의 4번에서 모듈러의 정의를 적용시키면 ed=kϕ(n)+1이 나오고,
Mϕ(n)에 오일러 정리를 적용하면 1이 됩니다.
암호화 과정과 복호화 과정을 함수로 나타내면 다음과 같습니다.
C=f(M)=MemodnM=f−1(C)=Cdmodn
이전 글에서 비밀통로 일방향 함수는 특정한 정보를 알고 있다면 역함수를 구하기 쉽다고 설명했습니다.
여기서 d를 알고 있다면 역함수를 구하기 쉬울 것입니다.
암호문을 보내는 사람이 공개키로만 암호를 만들면 개인키를 가지고 있는 수신자는 다시 암호를 평문으로 변환할 수 있게 됩니다.
다음 글에서는 또 다른 어려운 문제인 DLP와 그 어려움을 이용한 ElGamal에 대해서 설명하겠습니다.