Pollard's Rho에 대하여

두비니

·

2020. 9. 9. 02:29

 

 

 

. Pollard’s Rho에 대하여

 

Pollard’s Rho는 공개키 암호알고리즘에서 가장 많이 사용되는 계산 문제 중 하나인 인수분해 문제를 해결하기 위한 알고리즘 중 하나이다. Pollard’s Rho 알고리즘은 보통 10자리 이하의 수에 대한 수인수분해에 최적으로 알려져있는 알고리즘이다.

Pollard’s Rho에서 사용되는 이론은 다음과 같다.

 

1. 두 정수 xy는 다음과 같은 경우에 mod n에 대하여 합동이다.

1) 그들의 차가 n의 배수이다.

2) 각 숫자가 n으로 나누었을 때 같은 나머지를 갖는다.

2. GCD(Greatest Common Divisor), 즉 최대공약수는 각각 숫자들을 나누는 인수 중 가장 큰 숫자이다.

3. Birthday Paradox(생일 역설), 즉 두 사람이 같은 생일을 가질 확률은 적은 수의 사람(23)만 있어도 매우 높다(50%).

4. Floyd’s cycle-finding algorithm: 거북이와 토끼가 원형 트랙에서 같이 시작하되, 토끼가 거북이의 2배로 달릴 경우 그 둘은 한 점에서 만날 수밖에 없다.

 

이 두 이론을 사용하게 된다. 이론을 간단히 설명하자면, 로 소인수의 개수가 2인 반소수(semi-prime) 또는 소인수의 개수가 3 이상인 카마이클 수(Carmichael number)인 합성수(composite number)라고 가정하자. 반소수 에서 의 배수는 , 의 배수는 , 개의 소인수 배수들 중에서 하나를 를 통해 찾는 것이다. 여기서 위에서 설명한 플로이드 순환 찾기 알고리즘을 같이 적용하면 두 수열이 동시에 순환하면서 1 또는 n의 약수를 찾아내기 때문에 이 원리를 이용하여 소인수를 찾아낸다.

 

 

 

위 그림과 같이 그리스 문자 를 닮았기 때문에 Pollard’s “Rho”라고 불린다. 이러한 Pollard’s Rho 알고리즘은 다음과 같다.

 

1. 무작위한 xc를 설정한다. yx와 동일하게 설정하고, 로 설정한다.

2. 약수를 찾지 못한 경우

1) xf(x)로 업데이트한다. (, mod n)

이 과정은 Floyd’s cycle-finding algorithm에서 “tortoise move”를 하는 것과 같다.

2) yf(f(y))로 업데이트한다. (, mod n)

이 과정은 Floyd’s cycle-finding algorithm에서 “hare move”를 하는 것과 같다.

3) |x-y|n의 최대공약수를 찾는다.

4) 최대공약수가 1이 아닌 다른 값일 경우:

(1) 최대공약수가 n인 경우, 새로운 x, y, 그리고 c값을 가지고 다시 모든 과정을 진행한다.

(2) 아니라면 그 최대공약수가 답이다.

 

이렇게 Pollard’s Rho가 진행된다. 이제 이를 기반으로 python code를 작성해보았다.

 

import  math
import  random

def  PollardRho (n ):
    if  (n==1 ):
        return  1
    elif  (n % 2  == 0 ):
        return  2
    #set x, y, and c
    x = random.randint(0 , 2 ) 
    y = x 
    c = random.randint(0 , 1 )
    #d is cadidate divisor
    d = 1
    while (d==1 ):
        x = (x**2  + c) % n  #tortoise move
        y = ((y**2  + c)**2  + c) %n
        d = math.gcd(abs (x-y), n)
        if  (d==n):
            return  PollardRho(n)       

    return  d
if  __name__ == "__main__":
    n = 10967535067
    print ("One of the divisors for ", str (n), " is ", PollardRho(n))

 

다음은 예시로 작성한 코드이고, 결과는 다음과 같다.

 

 

정상적으로 잘 구해지는 걸 확인할 수 있다. 추가로 Pollard’s Rho의 시간복잡도는 의 시간복잡도를 가진 나눗셈시행법보다 훨씬 더 효율적인 것을 알 수 있다.

 

. Pollard’s Rho의 문제점

 

Pollard’s Rho는 확실히 나눗셈시행법이나 제곱합동법에 비해서 훨씬 빠르게 소인수를 찾을 수 있다는 장점이 있지만 특정 합성수에 대해서는 합성수를 찾지 못한다는 단점이 존재한다. 예를 들어 1027의 경우를 보자. 10271379의 곱으로, 합성수이지만, 1을 참고하면 Pollard’s Rho기법을 이용해서는 소인수를 찾아낼 수 없다는 것을 알 수 있다.

 

 

다음과 같이 소인수를 찾을 수 없는 경우, 초기값을 다시 설정해주어야 한다. 이러한 값들이 네자리수 안에서 총 15개가 발견된다. , 에서 Pollard’s Rho 알고리즘의 오차율은 1.69%이다.

 

. Pollard’s Rho의 개선점

 

Pollard’s Rho에 다양한 개선점이 있지만, 가장 효율적인 다중 초기치 방법에 관해서만 서술하겠다. 기존의 Pollard’s Rho 알고리즘에서는 초기치를 로 초기화하여 알고리즘을 수행했다. 그러나, 1.69%의 반소수에 대해서는 소인수 분해 실패 확률을 가지고 있으며, 수행횟수도 번 수행된다. 이러한 소인수 분해 실패시 주어진 수 n이 합성수라면 값을 변경시키면서 다시 수행해야 한다.

이러한 문제점을 개선하기 위해 선행 논문[1]에서는 이 아닌 를 이용한다(, ). 대신 기존 식인 는 변경되지 않으며, 초기치만 바꾼다.

 

 

 

실제로 다중 초기치 Pollard’s Rho를 적용시킨 결과, 앞서 기존의 Pollard’s Rho 알고리즘으로 구해낼 수 없었던 값들도 4번 이내로 소인수들을 찾아내었고, 추가로 Pollard’s Rho 알고리즘의 수행횟수 또한 67.94%를 감소시킬 수 있었음을 알 수 있다. 이외에도 다른 방법들이 있었지만, 다중 초기치 방법이 가장 수행횟수를 줄일 수 있었음을 시사한다.

 

 

. 결론

 

본 보고서에서는 Pollard’s Rho라는 알고리즘에 대해서 탐구해 보았다. Pollard’s Rho는 다른 소인수분해 알고리즘보다 탁월한 성능을 가지고 있다는 것을 알 수 있지만, 특정 합성수에 대해서는 소인수를 찾아내지 못한다는 단점과 이럴 경우 시간 손해가 심하다는 단점 또한 있었다. 이러한 단점을 해결하기 위해 다중 초기치 방법이 있다는 것을 알 수 있었으며, 다중 초기치 기법은 기존의 Pollard’s Rho가 분해하지 못했던 합성수들 뿐만아니라, 전반적으로 Pollard’s Rho 알고리즘의 수행횟수를 67.94% 감소시켰다는 점을 알 수 있었다.

 

 

 

 

 

 

===============

 

 

 

동아리에서 공부한 내용인데, 추후에 다중초기치 Pollard's Rho에 대해서 따로 구현해볼 계획이다.

 

 

 

 

 

'Crypto' 카테고리의 다른 글

[RSA] RSA 공격법  (0) 2020.09.27
[RSA] 이론적인 접근으로  (0) 2020.09.26
[LC] Toy Cipher Key Decryption code  (0) 2020.05.22
[AES] Encryption Optimization code  (0) 2020.04.16
[AES] 이론적인 접근으로  (0) 2020.04.11