본문 바로가기

Ryu's Tech

암호화 기법 : RSA [Rivest Shamir Adleman]






소개

공개키 알고리즘의 대표적인 RSA는 1977년에 Ron Rivest, Adi Shamir와 Leonard Adleman에 의해 개발되었다. RSA는 큰 수의 소인수 분해가 매우 어렵다는 사실을 이용한다. 현재 슈퍼컴퓨터와 복잡한 수학적 기법들을 이용해 155자리 합성수가 인수분해 되었는데(1999년 8월) 155를 2진수로 표현하면 512 비트이기 때문에 흔히 RSA에서 사용하는 키는 이보다 길이가 2배 긴 1024비트를 이용한다.


RSA의 원리

집합 {1, 2, ... , n-1} 의 원소들 중에서 n 과 서로소의 관계에 있는 원소들의 개수를 φ(n)으로 나타내고 이를 Euler의 φ-function이라고 한다. 특별히 소수 p에 대해서 φ(p) = p-1 이다. 큰 정수 n에 대해 φ(n)의 값을 알기 위해서는 n의 소인수 분해가 필수적이다. 즉, n이 두 소수 p와 q의 곱일 때 φ(n) = (p-1)(q-1)이다. 따라서 소인수 분해 없이 φ(n)을 구하기는 매우 어렵다. Euler의 정리란, 서로 소인 두 양의 정수 a, n에 대해 aφ(n) ≡ 1 (mod n) 이 성립한다는 것이다.

Step 1
두개의 큰 소수 p, q를 선정하여 자신의 비밀열쇠로 한다
Step 2
n = pq인 n을 공개하고 φ(n)과 서로 소인 임의의 정수 e를 선택하여 공개키로 한다.
Step 3
ed ≡ 1 (mod φ(n)) 이 되는 d를 Euclidean Algorithm등으로 계산하여 비밀 열쇠로 한다.
즉, p와 q 그리고 d는 비밀 열쇠로, n과 e는 공개키로 한다.

암호화 Step
평문 M을 공개키 e를 사용하여 Me를 계산한 다음 modular n으로 간단히 한다.
즉 암호문 C는 다음과 같다. C = Me (mod n)

복호화 Step.
암호문 C를 비밀열쇠 d를 이용하여 Cd한 다음 modular n으로 간단히 한다.
다시 평문이 나오게 되는 관계식은 다음과 같다.
Cd ≡ (Me)d = Mtφ(n)+1 = Mφ(n)t M ≡ M (mod n)
여기서 t는 ed ≡ 1 (mod φ(n))에서 유도되는 ed = tφ(n)+1 을 만족하는 정수이다. 


▶ 키 생성
  - 두 개의 큰 소수 pq를 선택하고, 이들의 곱 n=pq를 계산한다.
  - φ(n) = (p-1)(q-1)
  - n과 서로소인 e를 선택하고 de=1mod φ(n) 를 만족하는 수 d를 계산한다.
  - (n, e)는 공개키로 공개하고, d는 개인키로 보관한다. 

  p = 2357,
q = 2551, n = pq = 6012707
  φ(n) = (p-1)(q-1) = 6007800
  e = 36749911 로 결정하면 유클리드 알고리즘을 이용하여 d = 422191
로 구할 수 있습니다.
 여기서 ne 즉, 6012707 36749911을 공개하고,  d = 422191
을 개인키로 보관합니다.

▶ 암호화
  - 메시지 m을 공개키(n,e)를 이용하여 c=m^e·mod n 로 암호화 한다.
  메시지 m = 5234673 이라면
  암호문 
c=m^e·mod n = 5234673^3674911 mod 6012707 = 3650502
  즉, 메시지 m = 5234673을 공개키 ne를 이용하여 암호화 하면 암호문 c = 3650502를 얻습니다.

▶ 복호화
  - 암호문 c를 자신의 비밀키 d를 이용하여 m = c^d·mod n 으로 복호화 한다.
  메시지
m = c^d·mod n = 3650502^422191 mod 6012707 = 5234673
  암호문 c = 3650502를 개인키 d를 이용하여 복호화 하면 원래의 메시지 m = 5234673을 얻을 수 있습니다.





중간자공격 [中間子攻擊, man-in-the-middle attack]
요약
암호통신을 도청하는 수법의 하나.
본문

통신하고 있는 두 당사자 사이에 끼어들어 당사자들이 교환하는 공개정보를 자기 것과 바꾸어버림으로써 들키지 않고 도청을 하거나 통신내용을 바꾸는 수법이다.

통신을 하고 있는 A와 B 사이의 경로에서 공격자 X가 사이에 끼어든다고 하자. 두 당사자가 공개키 암호를 사용하고 있으면, X는 A에게서 보내온 공개키를 가로채어 B에게 A의 공개키 대신에 자기 공개키를 A의 것이라고 속여 송신한다.

B는 (A의 것으로 믿고 있는) X의 공개키로 암호화한 데이터를 A에게 송신한다. X는 이를 가로채서 자신의 비밀키로 해독(decoding)한다. 그리고 이것을 다시 가로챈 A의 공개키로 암호화하여 A에게 보낸다. A는 받은 데이터를 자신의 비밀키로 해독한다.

이 과정에서 X는 송수신되는 데이터를 훔쳐보거나 개변할 수가 있는데, A나 B는 그 사실을 알지 못한다. 중간자 공격을 방지하기 위해서는 인증기관이 발행한 디지털증명서 등을 이용하여 공개정보(A의 공개키)의 정규 여부를 확인해야 한다. 



출처 : http://reinliebe.tistory.com/79