Intro
What is RSA?
RSA 암호 시스템은 공개 키 암호 방식 (Public-Key Cryptography, PKC) 의 일종이다.
1978년에 세 수학자 Rivest, Shamir, Adleman에 의해 개발되었으며, 이들의 이름의 앞글자를 따서 RSA라고 부르게 되었다.
RSA 암호 시스템은 수학적으로 큰 숫자의 소인수분해가 어렵다는 사실을 기반으로 안전성을 보장하여 동작하는 암호 시스템이다.
자세한 동작 원리는 후술하겠지만 일단 이해하기 쉽게 간단히 예를 들어서 설명해보자.
A가 B에게 메시지를 전달하려고 한다.
1. A는 B의 열린 자물쇠를 들고 와서 전달하고자 하는 메시지를 봉인한다.
2. A는 B에게 봉인한 메시지를 전달한다.
3. B는 해당 자물쇠의 열쇠로 A에게 받은 봉인된 메시지를 열어 확인한다.
CSS
복사
What is PKC?
PKC(Public-Key Cryptography, 공개 키 암호 방식)이란, 사전에 공개된 공개 키(Public Key)로 암호화하고, 비밀 키(Private Key)로 복호화를 하는 암호화 방식을 말하며, 암호화키와 복호화키가 달라 비대칭키 암호 방식(Asymmetric Cryptography)이라고도 부른다.
Mathematics
RSA 암호 시스템을 이해하기 위해서는, 해당 암호 시스템이 수학을 기반으로 동작하기 때문에 몇 가지 수학적 이론들을 알고 있어야 한다.
기본적인 수학 기호 및 용어 설명은 다음과 같다.
: 정수의 집합
: 정수 와 의 최대공약수
: 정수 는 정수 로 나누어 떨어진다.
: 정수 는 정수 로 나누어 떨어지지 않는다.
: 정수 를 으로 나눈 나머지와 정수 를 으로 나눈 나머지는 같다.
기약잉여계 : 자연수 에 대하여 이하의 과 서로소인 수들의 집합을 기약잉여계라 한다.
베주 항등식 (Bézout's Identity)
적어도 둘 중 하나는 0이 아닌 두 정수 , 가 있을 때, 두 정수 , 에 대하여 다음 명제가 성립한다.
를 만족하는 정수 , 가 반드시 존재한다.
증명
우선, 다음과 같은 집합 를 정의한다.
또한, 아래에서 집합 는 와 중 적어도 하나를 원소로 가짐, 즉, 임을 알 수 있다.
집합 는 정의에 따라서 자연수의 부분집합이므로 자연수의 정렬성에 의해 집합 의 최소항이 존재함을 알 수 있다.
이제 집합 의 최소항을 라고 하자.
이때, 는 집합 의 원소이므로 를 만족시키는 두 정수 , 이 존재한다고 할 수 있다.
그리고 나머지 정리에 의해 를 로 나눈 몫 와 나머지 에 대해 다음과 같이 나타낼 수 있다.
위 식을 에 대하여 정리하면 다음과 같다.
여기서 이라면 집합 의 정의에 의하여 이고, 이기 때문에 가 집합 의 최소항이라는 가정에 모순이 된다.
따라서 이며, 이를 대입해보면 , 즉, 임을 알 수 있다.
똑같은 방식으로 임을 알 수 있다.
따라서, 이고 이므로 는 와 의 공약수, 즉, 라고 할 수 있다.
그리고 와 의 공약수 가 있다고 하자.
그러면 , 이라고 할 수 있다.
이를 에 대입해보면 이므로 라고 할 수 있다.
결론적으로, 이고 이므로 이고,
를 만족하는 두 정수 , 가 존재함을 알 수 있다.
유클리드 호제법 (Euclidian Algorithm)
두 정수 , 가 있고, 를 로 나눈 나머지 에 대하여 다음 식이 성립한다.
증명
, 의 최대공약수, 즉, 를 라고 하자.
그렇다면 서로소인 두 정수 , 에 대해 , 와 같이 나타낼 수 있다.
그리고 나머지 정리에 의해 를 로 나눈 몫 , 나머지 에 대해 다음과 같이 나타낼 수 있다.
위 식을 에 대하여 정리하면 다음과 같다.
따라서, , 임을 알 수 있다.
이제 이라고 하자.
그렇다면 서로소인 두 정수 , 에 대해 , 과 같이 나타낼 수 있다.
그리고 a'을 아래와 같이 나타낼 수 있다.
따라서, , 임을 알 수 있고,
이므로 은 와 의 공약수이고, 와 은 서로소이므로 , 즉, 와 는 서로소라는 것을 알 수 있다.
결론적으로, , 이고, 와 는 서로소이므로, 임을 알 수 있다.
확장된 유클리드 알고리즘 (Extended Euclidian Algorithm)
두 정수 , 에 대하여 베주의 항등식인 를 만족시키는 정수 , 의 값은 다음과 같이 구할 수 있다.
eea.py
def eea(a, b):
r0, r1, x0, x1, y0, y1 = a, b, 1, 0, 0, 1
while r1:
q = r0 // r1
t = r0
r0 = r1
r1 = t - r0 * q
t = x0
x0 = x1
x1 = t - x0 * q
t = y0
y0 = y1
y1 = t - y0 * q
return x0, y0
Python
복사
증명
유클리드 호제법에 의해, 두 정수 , 의 최대공약수 에 대해서 다음과 같이 나타낼 수 있다.
또한, 이를 풀어서 정리하면 아래와 같다.
따라서 라는 점화식을 도출할 수 있고,
(, 는 정수) 라 하고 위 점화식에 대입하여 정리하면 다음과 같다.
따라서 , 라는 점화식을 도출할 수 있다.
그러면 라 하고
위에서 구한 점화식으로 이 0이 될 때까지 반복하면, 그때의 , 의 값이 각각 를 만족하는 값이 되는 것이다.
오일러의 정리 (Euler's Theorem)
서로소인 두 정수 와 에 대하여 다음 식이 성립한다.
증명
정수 의 기약잉여계 은 다음과 같다.
또한, 의 모든 원소에 각각 과 서로소인 정수 를 곱한 집합 은 다음과 같다.
이때, 집합 의 각 원소들은 과 서로소인 수들의 곱으로 이루어져 있으므로 모두 과 서로소이다.
또한, 서로 다른 의 원소인 에 대해 를 만족한다고 가정하면
⇒
⇒
인데, 는 과 서로소이므로 가 의 배수라는 것인데, 가 둘 다 이하의 서로 다른 자연수이므로 이어서 모순이 발생한다.
즉, 집합 의 각 원소들을 으로 나눈 나머지들의 집합은 모두 과 서로소이며, 서로 다른 자연수이므로 의 기약잉여계인 과 같다고 볼 수 있다.
따라서, 의 모든 원소를 곱한 값은 집합 의 각 원소들을 으로 나눈 나머지들의 곱과 같다는 것을 알 수 있고, 이를 식으로 나타내면 다음과 같다.
여기서 은 과 서로소인 수들의 곱이므로 과 서로소이므로 양변을 으로 나눌 수 있는데, 그렇게 하면 다음과 같다.
페르마의 소정리 (Fermat's little Theorem)
소수 와 와 서로소인 정수 에 대하여 다음 식이 성립한다.
따름정리 : 소수 에 대하여 다음 식이 성립한다.
증명
일 때
이고,
가 소수이고 이므로 와 는 서로소이다.
따라서 오일러의 정리에 의하여 이다.
또, 양변에 를 곱하면 이다.
일 때
p가 소수이고 이므로 가 의 배수이다.
그래서 이다.
또한 이다.
따라서 이다.
Mechanism
Key Generation
1.
두 소수 를 준비한다.
2.
를 계산한다.
3.
, 즉, 과 각각 서로소인 정수 를 준비한다.
4.
를 만족하는 정수 를 찾는다. (확장 유클리드 알고리즘 사용)
5.
는 더 이상 필요 없으며, 보안상의 문제가 될 수 있으니, 파기한다.
여기서 과 는 공개키이며, 키 생성 후 공개된다.
또한, 는 비밀키이며, 공개되지 않는다.
Encryption
공개키 과 , 전달하고자 하는 메시지 에 대하여 다음을 계산한다.
여기서 가 암호화된 메시지이다.
Decryption
공개키 N, 비밀키 d, 암호화된 메시지 c에 대하여 다음을 계산한다.
여기서 이 복호화된 메시지이다.
Proof
우선 복호화 식을 정리해보면 다음과 같다.
⇒
따라서 위 합동식 RSA 암호 시스템을 검증하기 위해서는 를 증명하면 된다.
우선 이므로 위 합동식이 일때와 일때 모두 성립하면, 일때도 성립하기 때문에, 대신 를 사용해보자.
또한, 이므로, 적당한 정수 에 대하여 이라 할 수 있다.
이제 이들을 위 합동식에 대입하여 정리해보면 다음과 같다.
⇒
⇒
⇒
⇒
여기서 두 가지 경우로 나눌 수 있는데,
첫 번째 경우는 m이 p의 배수가 아닐때이다.
이 의 배수가 아니면 가 소수이기 때문에 페르마의 소정리에 의해 이고, 이 식을 위에 대입해보면
⇒
⇒
이므로 합동식이 성립하게 된다.
두 번째 경우는 이 의 배수일 때이다.
이 의 배수이면 위 합동식의 양변은 모두 로 나누어 떨어져서 0이 되므로, 합동식이 성립하게 된다.