https://dreamhack.io/lecture/roadmaps/3
Cryptography
암호학을 공부하기 위한 로드맵입니다.
dreamhack.io
[ Crypto: Stage 4: 공개키 암호와 키 교환 알고리즘 ]
[ Diffie-Hellman 알고리즘 ]
→ 배경: 공개된 채널을 통해 키를 교환해도 외부인은 키를 알 수 없게 하는 공개 키 교환 알고리즘 고안
→ 디피헬만 알고리즘의 안전성은 이산 로그 문제의 어려움에 바탕을 둠. 키를 모르는 공격자가 키를 구하려면 m이
22048 정도 되는 이산 로그 문제를 풀어야 하는데, 이는 현재의 연산능력으로는 불가능함
* 수학적 원리
1. 모듈러 연산에서의 거듭제곱
: 임의의 합동 항등식에 대해, 양변에 동일한 값을 곱해도 식은 성립한다. 따라서 아래와 같은 식이 성립한다.
이를 이용하여 큰 지수에 대한 합동식을 빠르게 연산하는 알고리즘을 square and multiply라고 부름
diffie-hellman 키 교환 알고리즘을 사용하려면 22048
번 가까이 제곱된 어떤 수의 모듈러 값을 구해야 하는데, 이 방법을 사용하면 2048번 정도만 연산해도 그 값을 구할 수 있다.
2. 페르마의 소정리(Fermat’s Little Theorem)
: “소수 p와 정수 a에 대해 ap-1=1(mod p)
이 성립한다”
à 예를 들어, 소수 37과 2,3,17은 페르마의 소정리에 따라 236=336=1736=1mod 37
을 만족함
3. 이산 로그 문제(Discrete Logarithm Problem)
: “자연수 a, m, 정수 b에 대해 ax=b(mod m)
을 만족하는 정수 x를 구하는 문제”
[ 키 교환 절차 ]
[1] 키를 교환하고자 하는 alice는 소수 p와 1≤g≤p-1을 만족하는 적당한 수 g를 정해 bob에게 전송함
P는 보통 21024 이상의 큰 소수로 설정함
[2] 다시 alice는 1≤a≤p-1 을 만족하는 적당한 수 a를 정하여 A=g(^a)mod p를 bob에게 전송함
[3] alice로부터 g와 p를 받은 bob은 1≤b≤p-1 을 만족하는 적당한 수 b를 정해 B=g(^b)mod p를 alice에게 전송함
[4] alice는 bob이 보낸 B를 a제곱하여 K=B(^a)=(g(^b))(^a)=g(^ba) mod p 를 계산
Bob은 alice가 보낸 A를 b제곱하여 K=A(^b)=(g(^a))(^b)=g(^ab) mod p 를 계산
[5] alice와 bob은 계산한 K를 통신의 키로 사용
→ 공격자는 통신을 도청하여 p, g, g(^a) mod p, g(^b) mod p 를 알아낼 수 있음.
그러나 이산 로그 문제의 어려움으로 인해 a를 알아내거나 b를 알아내는 것은 불가능하며, 결과적으로 K를 구할 수 없다.
[ 중간자 공격(Man In The Middle attack(MITM) ]
: 능동적 공격(통신을 도청하면서 중간에 데이터 위변조 가능)
→ alice와 bob이 통신할 때, 공격자는 alice에게 자신을 bob이라고 하고, 그리고 bob에게는 자신을 alice라고 속임
그러면 alice와 bob은 통신하는 상대방이 공격자인지, 아니면 신뢰하는 상대방인지 알 수 없음
[ 공개키암호: RSA ]
→ RSA 암호 알고리즘의 안전성은 아주 큰 두 소수의 곱으로 이루어진 합성수를 인수분해하기 어렵다는
'인수분해 문제의 어려움’에 기반
→ 따라서 RSA로 암호화할 때는 합성수의 소인수분해가 어려워지도록 각 인자를 적절히 설정해야 함
→ RSA는 대칭키 암호 알고리즘보다 많은 연산이 필요하므로, 많은 데이터를 여러 번 암호화해야 하는 네트워크
통신에서는 잘 사용되지 않음
→ 공개키: 모든 사용자에게 공개, 평문을 암호화 / 개인키: 타인에게 노출되어서는 안되며, 암호문을 복호화
* 오일러 정리
: n과 서로소인 양의 정수 m이 다음의 식을 만족한다는 정리
mφ(n)≡1 (mod n)
여기에서 φ(n) 은 오일러 파이 함수라고 하며, n 이하의 양의 정수 중에서 n과 서로소인 수의 개수를 뜻함
* 키 생성
[1] 서로 다른 두 소수 p와 q를 선택.
일반적으로 1024비트 이상에서 비트 길이가 같은 수로 생성,
그 뒤 p와 q를 곱하여 n을 구하고 φ(n)을 계산함
[2] n = p x q
: n = pxq인데 p와 q가 소수이므로, φ(n)은 n보다 작으면서 p와 q의 배수가 아닌 수들의 개수가 된다.
n 이하의 수 중, p의 배수는 q개, q의 배수는 p개 존재하며, 이 중 같은 수는 두 수의 최소공배수인 n뿐임
따라서 φ(n)은 아래처럼 표현될 수 있음
[3] φn=p*q-p-q+1=(p-1)(q-1)
φ(n)을 구한 뒤, φ(n) 보다 작은 수 중 φ(n)와 서로소인 e를 선택하고, d= e-1 mod φ(n)인 d를 구함
[4] e< φ(n), gcde,φn=1
[5] d= e-1 mod φn
→ 위 과정으로 생성한 값들 중, n과 e는 공개키로, d는 개인키로 사용됨
n은 modulus, e는 공개 지수, d는 비밀지수라고 불림
* 암호화
: 공개키 (n,e)로 n보다 작은 평문 m을 암호화할 때, 암호문 c는 다음 식으로 구해짐
c = m(^e) (mod n)
* 복호화
: 암호문 c를 개인키 d로 복호화할 때, 평문 m은 다음과 같이 구해짐
m= e(^d) (mod n)
e(^d)= (m(^e))(^d)= m(^ed) (mod n)
오일러 정리에 따르면 d= e(^-1) mod φ(n)이므로ed=kφ(n)+1 을 만족하는 자연수 k가 존재함
따라서 아래와 같은 식이 성립함
m(^ed) = (mφ(n))km (mod n)
오일러 정리에 따라 mφ(n)=1(mod n) 이므로 (m(^φ(n)))(^k)m=m(mod n)이다.
* RSA 공격
1. 작은 e
: e를 너무 작게 설정하면 Coppersmith 공격과 Hastad’s Broadcast 공격 등에 취약해질 수 있음
1) Coppersmith 공격
2) Hastad’s Broadcast 공격
: 한 송신자가 다수의 수신자에게 동일한 평문을 전송할 때, 수신자들에게 모두 동일한 작은 e 값을 사용할 경우 가능한 공격 방법
2. 공통 n
1) Common Modulus Attack
: 같은 n과 서로소인 두 공개 지수 e1, e2를 사용하여 같은 평문 m을 암호화해서 두 암호문 c1, c2를 만들었을 때, 이를 공격하는 기법
3. 작은 d
: 비밀 지수를 설정할 때는 n보다 적당히 큰 수가 되도록 해야 함
'Crypto' 카테고리의 다른 글
[Crypto] Dreamhack STAGE 5 (0) | 2022.08.26 |
---|---|
[Crypto] Dreamhack STAGE 3 (0) | 2022.08.25 |
[Crypto] Dreamhack STAGE 1 ~ 2 (0) | 2022.08.25 |