비대칭 키 암호화 (Asymmetric-Key Encipherment)
•
개인키와 공개키 두 키를 한 쌍으로 암호키를 구성
◦
개인키 (Private Key) - 개인이 보관
◦
공개키 (Public Key) - 타인에게 공개
비대칭 키를 이용한 응용분야
◦
비밀 메시지
▪
A의 공개키로 암호화한 메시지는 A의 개인키로 풀 수 있다
◦
전자서명
▪
A의 공개키로 풀리면 A의 개인키로 암호화한 것이라는 증거
대칭키 암호화와의 비교
𝜑 : 오일러의 파이함수
◦
n보다 작으면서 n과 서로소인 정수의 개수 ← 에 속하는 원소의 개수
▪
ex) 𝜑 count({1, 3, 7, 9}) = 4
◦
구하는 방법
▪
𝜑
▪
𝜑
•
p가 소수일 경우
•
𝜑
▪
𝜑 𝜑𝜑
•
m과 n이 서로소일때
▪
𝜑 𝜑
•
p가 소수일 때
◦
𝜑 에 관한 오일러 정리
▪
a와 n이 서로소일 경우,
•
▪
a < n, k 가 정수이면
•
RSA 암호 시스템
•
Revest, Shamir, Adleman 의 이름을 딴 공개키 알고리즘으로 가장 널리 사용된다.
◦
공개키 = (e, n)
◦
기본키 = d
◦
◦
키 생성 알고리즘
RSA_Key_Generation {
p != q 인 두 개의 큰 소수 p와 q를 선택한다 // p와 q는 각각 512비트 이상
n <- p x q // n은 1024비트(309자리) 이상
𝜑(n) <- (p - 1) x (q - 1)
1 < e < 𝜑(n) 이면서 𝜑(n)과 서로소인 e를 선택한다.
d <- e^-1 mod 𝜑(n) // d는 modulo 𝜑(n)으로 e의 역원 (e*d mod 𝜑(n) == 1)
Public_Key <- (e, n) // 공개키
Private_Key <- d // 개인키
return Public_Key and Private_Key
}
Python
복사
•
e 의 역원인 d를 구하기 위하여 Extended Euclidian 알고리즘을 이용
def extendedEuclidanAlgorithm(n, b) :
r1 = n; r2 = b
t1 = 0; t2 = 1
while r2 > 0 :
q = math.floor(r1 / r2)
r = r1 - q * r2
r1 = r2; r2 = r
t = t1 - q * t2
t1 = t2; t2 = t
if r1 != 1 :
raise Exception('역원이 없습니다')
return t1
Python
복사
RSA의 정확성 증명
RSA 예(1)
RSA 예(2)
•
암호화와 복호화 과정
RSA에 대한 공격 : 소인수분해 공격
→ 𝜑 x
→ x 𝜑
•
매우 큰 n으로부터 (1024비트 이상) p와 q를 찾는 것은 infeasible
•
RSA가 안전해지기 위한 권장사항
◦
n은 1024비트 이상 (4096비트까지도 권고)
◦
두 개의 소수 p와 q는 적어도 512비트 이상
◦
p와 q는 너무 가까이 있는 수가 되지 않도록 설정
◦
p-1 과 q-1은 적어도 하나의 큰 소인수를 가져야 한다.
◦
n 값을 공동으로 사용해서는 안된다.
◦
e 값은 이거나 이 값에 가까운 정수를 사용
▪
e를 먼저 정한 후, 𝜑이 서로소가 되도록 p, q를 선택한다.
타원 곡선 암호 시스템
•
RSA의 문제점
◦
보안을 위해서는 키의 길이가 매우 커야한다. (n은 최소 1024비트 이상)
•
타원 곡선 암호 시스템 (ECC - Elliptic Curve Cryptosystem)
◦
보다 짧은 키의 길이(256비트~)로 동일한 보안 수준을 제공
◦
일반적인 타원 곡선 방정식 : 2개의 변수를 갖는 3차 방정식
실수 상의 타원 곡선
•
모든 근이 실근일 경우, 좌표의 수평선과 곡선이 3지점에서 교차
타원 곡선 상의 덧셈 연산
타원 곡선 상의 두 점 P(x1, y1), Q(x2, y2) 에 대해 R = P + Q 정의
•
P와 Q를 연결하는 직선과 교차하는 곡선 상의 점(-R)에 대해 x축으로 대칭점
•
P와 Q가 동일할 경우에는 P를 지나는 접선을 이용𝝀
→ a의 경우
•
기울기 = 𝝀,
◦
𝝀 =
◦
◦
→ b의 경우
•
𝝀 = (
◦
은 위 식과 동일
GF(p) 상의 타원 곡선
•
Modulo p를 이용한 타원 곡선
◦
x의 값 = 0부터 p-1 범위에 존재
◦
덧셈 연산 = 덧셈의 결과를 mod p
•
역원 구하기 : 의 역원 →
◦
ㄷ단, 는 의 덧셈에 대한 역원
ex) p=13일 경우, (4, 2)의 역원 → (4, -2) → (4, 11)
•
곡선 상의 점 찾기
타원 곡선 의 예
•
위에 정의된 점들
ex) P = (4, 2), Q = (10, 6) 일 때, P + Q = R 이다. R의 좌표는?
𝝀 = ( 은 Extended Euclidian 알고리즘 활용)
=
=
=
따라서 R = (11, 2) → 의 곡선 상의 점이다
비트코인에서 사용하는 타원 곡선 : Secp256k1
•
비트코인에서는 전자서명을 위해서 타원곡선을 사용한다 (ECDSA)
•
Secp256k1 타원곡선 : %
◦
p는 아주 큰 소수이다
•
공개키, K = K * G
◦
k: 개인키 (256비트)
◦
G: 타원 곡선 상의 고정된 점 (공개)
공개키로부터 개인키를 유추하기 위해서는 적어도 k번의 덧셈이 필요하다
→ 거의 불가능
마찬가지로 공개키를 만들기 위해서도 G를 k번 더해야하지 않나?
→ Double-and-Add 알고리즘 이용
Double-and-Add 알고리즘
•
left-to-right 로 k의 비트를 조사
•
1 : Double and Add
•
0 : Double