본문으로 바로가기

RSA Exploit

category Cryptography/Techniques 2020. 1. 28. 16:05

c ≡ me mod N, m ≡ cd mod N

N = pq (p, q are prime numbers)  /  d e−1 (mod λ(n))

e, N: Public Key, d: Private Key

 

1-1. Improper Selection of p, q - Large \(\left| p-q \right|\)

\(p\)와 \(q\)의 차이가 매우 크다면 Brute-Force로 비교적 짧은 시간 내에 소인수분해를 할 수 있다.

 

1-2. Improper Selection of p, q - Small \(\left| p-q \right|\) (Fermat Factorization)

\(p\)와 \(q\)의 차이가 작다면 두 수는 \(\sqrt{N}\) 에 인접한 위치에 있다. \(\sqrt{N}\) 보다 큰 \(x\) 에 대해서, \(x^{2}-N\) 이 제곱수가 되는 경우 \(N\)을 분해할 수 있다.

\[x^{2}-N=y^{2}, \quad N=(x+y)(x-y) \]

 

2. Pollard's p-1 Algorithm

\(p-1\)이 적당히 작은 수 \(B\)에 대해서 \(B\)-powersmooth number일 때 \(N\) 의 소인수를 구할 수 있는 알고리즘이다.

다음과 같은 수 \(M=\displaystyle \prod_{primes\ q \leq B} q^{\lfloor{log_{q}B}\rfloor}\) 이 있다고 가정한다. \(M\)은 \(p-1\)의 배수이므로, FLT에 의해 \(p\)와 서로소인 \(a\)에 대해서 \(a^{M}-1=a^{K(p-1)}-1 \equiv 0 \pmod{p}\) 가 성립한다. \(a^{M}-1\) 과 \(N\)의 공약수를 구하면 \(N\)의 소인수를 찾을 수도 있다.

 

1. Smoothness bound \(B\)를 정하고, \(M\)을 계산한다.

2. \(N\)과 서로소인 수 \(a\)를 임의로 정한다.

3. \(g=\mathrm{gcd}\left(a^{M}-1, N\right)\) 을 계산한다.

4-1. \(g=1\) 인 경우, \(B\)를 증가시킨 뒤 다시 시도한다.

4-2. \(g=N\) 인 경우, \(B\)를 감소시킨 뒤 다시 시도한다.

4-3. \(1<g<N\) 인 경우, \(g\)는 \(N\)의 인수이다.

 

3. Williams' p+1 Algorithm

Pollard's p-1 Algorithm의 변형 알고리즘이며, \(p+1\)이 \(B\)-powersmooth number일 때 \(N\)의 소인수를 구할 수 있는 알고리즘이다.

 

1. 2보다 큰 자연수 A로 아래와 같은 Lucas sequence를 정의한다.

\[V_{0}=2,\quad V_{1}=A,\quad V_{i}=AV_{i-1}-V_{i-2}\ (\mathrm{mod}\ N)\]

2. \(p-\left(\frac{D}{p}\right)\mid M\) 이면 \(p\mid \mathrm{gcd}\left(N, V_{M}-2\right)\) 이다. 여기서 \(D=A^{2}-4\) 이고, \(\left(\frac{D}{p}\right)\) 는 Jacobi 기호다. 여기에 사용되는 \(M\)은 \(k!\) 형태로 나타내어지며, \(V_{M}\)은 \(V_{M-1}\) 로 구성되는 Lucas sequence의 \(M\)번째 원소다.

 

t로 구성되는 수열의 \(M\)번째 원소는 아래 방법으로 구한다. (Python, SageMath)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sage.all import *
 
= random_prime(512, proof=False)
= random_prime(512, proof=False)
= p*q
= 5
 
= A
= (A^2-2)%N
= factorial(7)
 
for b in M.bits()[-2::-1] :
    if b == 1 :
        x = (x*y-A)%N
        y = (y^2-2)%N
    else :
        y = (x*y-A)%N
        x = (x^2-2)%N
 
= x

 

4. Common Factors in Public Keys

여러 개의 공개키가 주어질 때, 공개키들 사이에 1이 아닌 공약수가 있다면 \(N\)을 빠르게 분해할 수 있다.

 

5. Miller-Rabin Primality Test

이 알고리즘은 어떤 수가 소수인지 판별하기 위한 알고리즘이지만, \(N\)이 유사 소수일 경우, 소인수를 구할 수 있다.

\(N=d\cdot 2^{n}+1\) 이 pseudoprime to base \(a\)일 때, 아래와 같은 수열 \(x_{n}\)을 가정한다.

\[x_{n}=a^{d\cdot 2^{n}}\]

어떤 수 \(i\)에 대해서 \(x_{i}\)는 아래 식을 만족한다.

\[x_{i}=a^{d\cdot 2^{i}}\equiv 1\ (\mathrm{mod}\ N)\]

이 때 \(x_{0}:=x_{i-1}\)은 \(x_{0}^{2}\equiv 1\ (\mathrm{mod}\ N)\) 과 \(x_{0}\not\equiv\pm 1\ (\mathrm{mod}\ N)\) 을 만족하므로 \(\mathrm{gcd}(x_{0}-1, N)\) 과 \(\mathrm{gcd}(x_{0}+1, N)\) 은 \(N\)의 인수가 된다.

 

6. Common Modulus Attack

Modulus 값이 같은 두 공개키로 두 평문을 암호화하면 원문을 복구할 수도 있다.

한 평문 \(m\)을 아래와 같이 두 공개키 (\(e_{1}\), \(N\)), (\(e_{2}\), \(N\)) 으로 각각 암호화한다고 가정한다.

$$ \begin{align} c_{1}=m^{e_{1}}\ (\mathrm{mod}\ N) \\ c_{2}=m^{e_{2}}\ (\mathrm{mod}\ N) \end{align} $$

\(e_{1}\)과 \(e_{2}\)가 서로소라면, \(re_{1}+se_{2}=1\) 를 만족하는 \(r\), \(s\)에 대해서 아래의 식이 성립한다.

$$ c_{1}^{r}c_{2}^{s} \equiv m^{\left(re_{1}+se_{2}\right)}\equiv m\ (\mathrm{mod}\ N) $$

 

7. Small e (e=3 Representatively)

\(N\)이 충분히 크거나 \(m\)이 충분히 작다면, 적당히 작은 수 \(k\)에 대해 \(m^{3}\leq kN\) 을 만족해 Brute-Force로 \(k\)를 증가시키면서 \(\sqrt[3]{c+kN}\) 이 정수일 때 값을 취해 평문을 복구할 수 있다.

 

8. Wiener's Attack

\(d<\frac{1}{3}N^{\frac{1}{4}}\) 인 경우 \(d\)를 복구할 수 있다.

증명과 알고리즘은 나중에 추가예정

 

9. 

 

Reference

ctf-wiki

https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/rsa/rsa_module_attack-zh/

https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/rsa/rsa_e_attack-zh/

https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/rsa/rsa_d_attack-zh/

Wikipedia

https://en.wikipedia.org/wiki/Pollard%27s_p_%E2%88%92_1_algorithm

https://en.wikipedia.org/wiki/Williams%27s_p_%2B_1_algorithm

https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

 

 

 

 

 

'Cryptography > Techniques' 카테고리의 다른 글

Implicit Factoring with Shared MSBs & Middle Bits  (0) 2020.06.16