본문으로 바로가기

RSA Exploit

category CryptographyTechniques 5년 전

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 |pq|

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

 

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

pq의 차이가 작다면 두 수는 N 에 인접한 위치에 있다. N 보다 큰 x 에 대해서, x2N 이 제곱수가 되는 경우 N을 분해할 수 있다.

x2N=y2,N=(x+y)(xy)

 

2. Pollard's p-1 Algorithm

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

다음과 같은 수 M=primes qBqlogqB 이 있다고 가정한다. Mp1의 배수이므로, FLT에 의해 p와 서로소인 a에 대해서 aM1=aK(p1)10(modp) 가 성립한다. aM1N의 공약수를 구하면 N의 소인수를 찾을 수도 있다.

 

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

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

3. g=gcd(aM1,N) 을 계산한다.

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

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

4-3. 1<g<N 인 경우, gN의 인수이다.

 

3. Williams' p+1 Algorithm

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

 

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

V0=2,V1=A,Vi=AVi1Vi2 (mod N)

2. p(Dp)M 이면 pgcd(N,VM2) 이다. 여기서 D=A24 이고, (Dp) 는 Jacobi 기호다. 여기에 사용되는 Mk! 형태로 나타내어지며, VMVM1 로 구성되는 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=d2n+1 이 pseudoprime to base a일 때, 아래와 같은 수열 xn을 가정한다.

xn=ad2n

어떤 수 i에 대해서 xi는 아래 식을 만족한다.

xi=ad2i1 (mod N)

이 때 x0:=xi1x021 (mod N)x0±1 (mod N) 을 만족하므로 gcd(x01,N)gcd(x0+1,N)N의 인수가 된다.

 

6. Common Modulus Attack

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

한 평문 m을 아래와 같이 두 공개키 (e1, N), (e2, N) 으로 각각 암호화한다고 가정한다.

c1=me1 (mod N)c2=me2 (mod N)

e1e2가 서로소라면, re1+se2=1 를 만족하는 r, s에 대해서 아래의 식이 성립한다.

c1rc2sm(re1+se2)m (mod N)

 

7. Small e (e=3 Representatively)

N이 충분히 크거나 m이 충분히 작다면, 적당히 작은 수 k에 대해 m3kN 을 만족해 Brute-Force로 k를 증가시키면서 c+kN3 이 정수일 때 값을 취해 평문을 복구할 수 있다.

 

8. Wiener's Attack

d<13N14 인 경우 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