RSA Attack with Fermat's Factorization

헌지박사·2023년 12월 21일
0

(※ 기본적인 RSA 암호 알고리즘에 대한 이해가 필요한 게시글입니다.)
(1. RSA 암호 알고리즘과 Hastad's Broadcast Attack)
(2. Common Modulus Attack)

Fermat's Factorization

개요

Fermat's Factorization (직역하자면 페르마 인수분해) 는 어떠한 두 홀수가 근접한 수일 때, 그 둘을 곱한 수에서 빠르게 두 홀수를 인수분해할 수 있는 방법이다.
이론적 배경은 아래와 같다.

Fermat's Factorization

우선, 두 소수 p,qp,q의 곱으로 이루어진 n=pqn= pq이라는 수가 있다고 가정하자, 이 때, nn은 당연히 홀수이다. 당연히 p,qp,q 도 소수이므로 홀수이다.
여기서 a=12×(p+q),  b=12×(qp)a=\frac{1}{2}\times(p+q),\ \ b=\frac{1}{2}\times(q-p)라고 가정하면, p=(ab),  q=(a+b)p = (a-b),\ \ q = (a+b)이다.
즉, n=pq=(ab)(a+b)=a2b2n=pq=(a-b)(a+b)=a^2-b^2 이다. 이말인 즉 a,ba,b쌍을 찾으면 nn이 인수분해 되었음을 말한다. 해당 식에서 적절히 이항을 한다면 a2n=b2a^2-n=b^2라는 식을 만들 수 있다.
여기서 NN이상인 제곱수 a2a^2에 대해서 aaN\lceil\sqrt{N}\rceil부터 시작하여 1씩 증가시키며 NN을 빼고, 그 값이 제곱 수가 된다면 aabb값을 찾을 수 있으며 aba-ba+ba+bNN의 인수가 된다는 사실을 알 수 있다.

RSA Attack?

RSA가 인수분해의 어려움에 기초해있으므로, 당연히 Fermat's Factorization이 먹히는 경우도 있다. 일정 수 이하로 p,qp,q 분포가 붙어있으면 Fermat's Factorization을 돌려서 인수분해를 끌어낼 수 있다. 무슨 말인지는 아래와 같은 경우를 생각해보자.
RSA는 NNp,qp,q 인수분해의 어려움에 기초하고 있다. 만약, N=p×qN=p\times q 이므로 pp 와 가까운 소수가 qq 라면, 위 Fermat's Factorization을 통해서 N=pq=(ab)(a+b)N=pq=(a-b)(a+b)를 통해서 b2=a2nb^2=a^2-n 이라는 식에서 aa자리에 N\lceil\sqrt{N}\rceil 부터 브루트포스를 통해 bb가 정수가 나오는지 유무를 통해서 인수분해 가능여부를 검사해볼 수 있을 것이다.
해당 Algorithm을 pseudo code로 나타내면 다음과 같이 나타낼 수 있을 것이다.

다만, 연산속도는 자릿수가 늘어남에 따라 기하급수적으로 늘어나게 된다.

실습

Fermat's Factorization을 수행할 수 있게끔 p,qp,q의 소수 간격을 점점 늘여주면서 RSA 암호화와 복호화하는 간단한 코드를 구현하자. 해당 코드에서 소수의 간격은 sympy의 nextprime 함수에서 2i2^i 간격 만큼 점점 늘이면서 구하는 것으로 구현했다.

우선, ii값이 20일 때 까지는 유의미한 변화를 보이진 않는다.

그러나 ii값이 25를 넘어가자 연산속도는 기하급수적으로 느려지기 시작한다.

ii값이 29에 도달하자 10분넘게 연산을 해야 해를 구할 수 있음을 볼 수 있다. 또한, ii값이 30에 도달하면 20분가까이 연산을 해야 해를 구할 수 있다(2302^{30}정도 되면 약 10자리 정도 된다.).

영향력?

알고리즘의 구조를 보면 알겠지만, Fermat's Factorization Method를 사용하는 것은 매우 저렴한 비용으로 행할 수 있는 공격이다.
매우 간단한 공격이라 CTF에나 잠깐씩 나올 것 같지만, 놀랍게도 최근에 해당 공격이 성공한 실사례가 있다. CVE-2022-26320 이 해당 방법으로 RSA 암호 모듈의 위험성을 발견한 사례인데, Rambus SafeZone Basic Crypto Module 의 10.4.0 이전 버전에서, 키 생성 알고리즘이 Fermat's factorization method에 의해서 깨질 위험성이 있었다고 한다. Fermat's factorization 으로 NN을 인수분해할 수 있다면, TLS Certificate 에 있는 공개키를 통해서 private key를 쉽게 추출 (ed1(modϕ(N))e \equiv d^{-1}\pmod {\phi(N)})할 수 있다.
비록, 키 생성 로직의 미흡이긴 하지만, 1643년에 나온 Fermat's Factorization Algorithm을 1977년에 나온 RSA 암호 공격에 사용할 수 있다는 사실이 어이가 없기도 하면서 재밌기도 하다.

대처 방안

RSA key generator는 p,qp,q 라는 소수를 골라야하지만, 가까운 소수(neighboring primes)를 고르면 안된다. 일반적인 RSA의 키 크기인 2048비트를 사용하여 생성된 키는 100Round의 Fermat Factorization Attack으로 25172^{517}까지 차이나는 숫자를 안정적으로 인수분해 한다고 한다. 즉, 하위 64바이트 내에서만 차이가 난다면 취약할 수도 있다고 한다(출처: https://fermatattack.secvuln.info/).
물론 소수가 독립적으로 무작위 생성될 경우, 취약한 키가 우연히 생성될 수 있을 확률은 1:25001:2^{500} 보다 작으므로 거의 불가능하다고 한다.


출처:
https://fermatattack.secvuln.info/
https://eprint.iacr.org/2023/026.pdf
https://asecuritysite.com/rsa/rsa_01
https://vulners.com/cve/CVE-2022-26320

profile
복습을 위한 블로그

0개의 댓글