DOI QR코드

DOI QR Code

Cycle Detection of Discrete Logarithm using an Array

배열을 이용한 이산대수의 사이클 검출

  • Sang-Un Lee (Dept. of Multimedia Eng., Gangneung-Wonju National University)
  • 이상운 (강릉원주대학교 과학기술대학 멀티미디어공학과)
  • Received : 2023.02.01
  • Accepted : 2023.10.06
  • Published : 2023.10.31

Abstract

Until now, Pollard's Rho algorithm has been known as the most efficient way for discrete algebraic problems to decrypt symmetric keys. However, the algorithm is being studied on how to further reduce the complexity of O(${\sqrt{p}}$) performance, along with the disadvantage of having to store the giant stride m=⌈${\sqrt{p}}$⌉ data. This paper proposes an array method for cycle detection in discrete logarithms. The proposed method reduces the number of updates of stack memory by at least 73%. This is done by only updating the array when (xi<0.5xi-1)∩(xi<0.5(p-1)). The proposed array method undergoes the same number of modular calculation as stack method, but significantly reduces the number of updates and the execution time for array through the use of a binary search method.

지금까지는 Pollard의 Rho 알고리즘이 대칭키의 암호를 해독하는 이산대수 문제에 대해 가장 효율적인 방법으로 알려져 있다. 그러나 이 알고리즘은 거인걸음 보폭 m=⌈${\sqrt{p}}$⌉개의 데이터를 저장해야 하는 단점과 더불어 O(${\sqrt{p}}$) 수행 복잡도를 보다 감소시킬 수 있는 방법에 대한 연구가 진행되고 있다. 본 논문은 이산대수의 사이클 검출을 위한 Nivasch의 스택 법의 데이터 갱신 횟수를 73% 이상 감소시키는 배열법을 제안하였다. 제안된 방법은 배열을 적용하였으며, (xi<0.5xi-1)∩(xi<0.5(p-1))인 경우에 한해 배열 값을 갱신하는 방법을 적용하였다. 제안된 방법은 스택법과 동일한 모듈러 연산횟수를 보였지만 스택 법에 비해 이진탐색 법을 적용하여 배열 갱신 횟수와 탐색 시간을 획기적으로 감소시켰다.

Keywords

Ⅰ. 서론

대칭암호 비밀 키는 소수(prime number, p)를 사용하며, αγ ≡ β(mod p)에서 α,β,p가 주어졌을 때 비밀 키 γ을 구하는 이산대수(discrete logarithm)의 수학적 난제에 기반하고 있다.[1,2]

이산대수 알고리즘에는 아기걸음-거인걸음(Baby-step Giant-step), Pollard의 캥거루와 Rho (ρ), Pohlig-Hellman, Index calcurus, Number Field Sieves, Function Field Sieve 등 다양하게 존재하고 있다.[2] 지금까지는 Pollard의 Rho 알고리즘[3]이 대칭키의 암호를 해독하는 이산대수 문제에 대해 가장 효율적인 방법으로 알려져 있어 이 방법에 대한 후속 연구가 진행되고 있다.[4-8]

Shank의 아기걸음-거인걸음 알고리즘[9]은 거인걸음 보폭 \(\begin{aligned}m=\lceil\sqrt{p}\rceil\end{aligned}\)개의 데이터를 저장해야 하는 단점을 갖고 있으며, 수행 복잡도는 \(\begin{aligned}O(\sqrt{p})\end{aligned}\)이다.[10] 반면에, Pollard의 Rho 알고리즘[3]은 단지 2개의 포인터만 사용하여 충돌을 검출하는 방법으로 메모리 문제를 해결하였으나 수행 복잡도는 \(\begin{aligned}O(\sqrt{p})\end{aligned}\)이다. Pollard의 Rho (ρ) 알고리즘에 대한 후속 연구가 Brent[4,5], Teske[6], Nivasch[7]와 Cheon et al.[8]에 의해 수행되었다. Teske[6]는 일반화된 Rho 알고리즘을 제안하였으며, Brent[4,5]와 Nivasch[7]는 Pollard의 Rho 알고리즘의 효율적 수행 방법을 제안하였다. 또한 Lee[11]은 다중 ρ 알고리즘을 제안하기도 하였다. 사이클 검출에 있어 Lee[12]는 큐(queue)를 이용하여 Pollard ρ 알고리즘의 수행횟수를 65.02%, Brent 알고리즘의 수행횟수를 47.80% 감소시키는 결과를 얻었다.

본 논문은 Lee[12]의 큐 이용 방법이나 Nivasch의 스택 이용 알고리즘[7]에 비해 보다 알고리즘 수행횟수를 감소시켜 사이클을 검출할 수 있는 알고리즘을 제안한다. 2장에서는 사이클 검출 방법을 고찰한다. 3장에서는 배열을 이용한 사이클 검출 방법을 제안한다. 4장에서는 실험을 통해 제안된 알고리즘의 사이클 검출 성능을 검증하여 본다.

Ⅱ. 이산대수의 사이클 검출

이산대수 문제를 풀기 위해 사이클 검출 기법을 적용한 방법에는 Pollard의 ρ 포인터 이용법[3], Brent의 포인터 이용법[4,5], Nivasch의 스택 이용법[7] 등이 있다

Pollard의 ρ 방법은 사이클 검출에 있어서 가장 효율적인 방법으로 알려진 Floyd 알고리즘에 기반하고 있다.[13,14] 또한, 사이클을 검출하는 방법이 그리스 문자 Rho(ρ)와 유사하여 Rho 알고리즘이라 명명하였다. ρ 알고리즘[4]은 αγ ≡ β(mod p)에서 γ을 구하기 위해 식 (1)을 찾으며, αaβb ≡ αAβB의 충돌을 찾기 위해 x0 = y0 = 1, 즉 a = b = A = B = 0에서 거북이와 토끼가 동시에 출발하여 거북이는 정상 속도인 xi←f(xi-1)로, 토끼는 거북이의 2배 속도인 yi←f(f(yi-1)) = x2i로 달려가면서 xi = x2i이면 충돌이 발생하여 종료하는 방식으로 수행된다. 여기서 xi와 yi는 식 (2)로 계산되며, yi = x2i 값이다.

αaβb ≡ αAβB, (B-b)γ = (α-4)

αaγ)b ≡ αAγB, αa+γb ≡ αA+γB,

(a+γb) = (A+γB), γ(B-b) = (a-A)       (1)

\(\begin{aligned}\begin{array}{l}f(x)=\left\{\begin{array}{l}x_{i-1}^{2}(\bmod p), a_{i}=2 a_{i-1}(\bmod G), b_{i}=2 b_{i-1}(\bmod G) \\ \alpha x_{i-1}(\bmod p), a_{i}=a_{i-1}+1(\bmod G), b_{i}=b_{i-1} \\ \beta x_{i-1}(\bmod p), a_{i}=a_{i-1}, b_{i}=b_{i-1}+1(\bmod G)\end{array}\right. \\ f(y)=\left\{\begin{array}{l}y_{i-1}^{2}(\bmod p), A_{i}=2 A_{i-1}(\bmod G), B_{i}=2 B_{i-1}(\bmod G) \\ \alpha y_{i-1}(\bmod p), A_{i}=A_{i-1}+1(\bmod G), B_{i}=B_{i-1} \\ \beta y_{i-1}(\bmod p), A_{i}=A_{i-1}, B_{i}=B_{i-1}+1(\bmod G)\end{array}\right.\end{array}\end{aligned}\)       (2)

ρ 알고리즘의 일반형은 식 (3)과 같다.[6] 여기서 M = αm, N = βn으로 m, n을 임의로 설정한다.

\(\begin{aligned}f(x)=\left\{\begin{array}{l}x_{i-1}^{2}(\bmod p), \quad a_{i}=2 a_{i-1}(\bmod G), b_{i}=2 b_{i-1}(\bmod G) \\ \left.M x_{i-1}(\bmod p), a_{i}=a_{i-1}+\bmod G\right), b_{i}=b_{i-1} \\ N x_{i-1}(\bmod p), a_{i}=a_{i-1}, b_{i}=b_{i-1}+n(\bmod G)\end{array}\right.\end{aligned}\)       (3)

Brent 알고리즘[4,5]은 ρ 알고리즘에서 y←f(f(y))를 적용하지 않고, 단지 x←f(x)만 활용한다. 이 방법은 y←xi, (i=2k)로 수행횟수 i가 2의 배수일 때 xi의 값을 y에 저장하여 비교하는 방식이다. 이로 인해 ρ 알고리즘은 1회 수행에 x←f(x)와 y←f(f(y))의 3회 모듈러 연산을 수행하는 것을 1회로 감소시켜 Floyd의 사이클 검출 알고리즘에 비해 약 36% 빠르며, ρ 알고리즘의 수행시간을 24% 향상시켰다.[14]

Pollard와 Brent는 사이클 검출을 위해 2개 포인터(pointer)만을 활용하였다. Brent 알고리즘[4,5]의 경우 y를 1개 포인터만 적용함에 따라 이전 y값과 동일하여 수행횟수를 줄일 수 있음에도 불구하고 수행횟수가 많아지는 경우가 발생할 수도 있다.

Brent 알고리즘[4,5]의 문제점을 개선한 방법이 Nivasch[7]의 스택(stack)을 활용하는 방법이다. 이 방법은 Brent 알고리즘과 같이 x←f(x)만을 적용하며, i번째 수행횟수에서의 xi 값이 스택의 최대치로 Top에 위치하도록 한다. 즉, 스택에는 오름차순으로 값이 저장된다. 이 방법은 Brent 알고리즘에 비해 20% 빠른 것으로 증명되었다.[7] 그러나 스택의 크기 뿐 아니라 값을 갱신하는데 많은 시간이 소요될 수 있다. Nivasch[7]는 p = 5×108의 경우 스택 크기가 [44,53]임을 제시하였다.

크기 k, Top(T)와 Bottom(B)를 갖고 있는 스택을 가정하여 보자. 만약, xi > T이면 포인터를 k←k+1로 증가시켜 xi 값을 push하면 되지만 xi < T이면 역 탐색(backward search)을 수행하여 xi < sj 인 j 위치까지 pop을 수행하여 j 위치에 xi 값을 push해야 한다. 만약, 최악의 경우인 xi < B라면 O(k)의 수행시간이 필요하다. 이 방법은 비록 데이터가 정렬되어 있음에도 불구하고 반드시 역 탐색 방법을 수행하야 한다. 스택의 역탐색법은 선형 탐색(linear search) 또는 Brute-force 탐색 법만을 적용할 수 있다.

Ⅲ. 배열 이용 알고리즘

본 장에서 제안하는 방법은 배열(array)을 이용해 다음과 같이 수행한다.

Step 1.식 (4)의 x←f(x)를 계산한다.

αγ ≡ β(mod p), x0 = αβ (a = b = 1).

\(\begin{aligned}x_{i-1}(\bmod 3)=\left\{\begin{array}{l}0, x_{i}=x_{i-1}^{2}(\bmod p) \\ 1, x_{i}=\alpha x_{i-1}(\bmod p) \\ 2, x_{i}=\beta x_{i-1}(\bmod p)\end{array}\right.\end{aligned}\)       (4)

f(x)는 식 (4)의 random walks 형태인 Pollard의 기본형 ρ 함수 이외에 식 (3)의 일반형 ρ 함수를 적용할 수도 있으나 여기서는 식 (4)의 기본형 ρ 함수를 적용한다.

Step 2. y는 배열 A를 적용한다.

배열 A의 A(1)은 최소치, k번째 A(k)는 최대치가 저장되며, 포인터는 k를 가리킨다. 초기치 x0 = αβ(mod p)가 A(1)에 저장된다.

Step 3. (xi < 0.5xi-1) ∩ (xi < 0.5(p-1))이 한정하여 배열 A값을 갱신한다.

if xi < 0.5xi-1 and xi < 0.5(p-1) then

/* 배열 A 갱신

if xi > A(k) then

k←k+1, A(k)←xi , αmax←xi

else if xi < A(1) then

초기화, k←1, A(1)←xi , αmin←xi

else if xi = A(1) or xi = A(k) then

알고리즘 종료

else if A(1) < xi < A(k) then /* 이진탐색

if xi = A(j) then 알고리즘 종료

else if A(j-1) < xi < A(j) then

A(j)←xi , αmax←xi , k←j.

else skip.

스택 방법은 모든 xi에 대해 스택 값을 갱신하는데 반해 배열 방법은 xi < 0.5xi-1와 xi < 0.5(p-1) 조건을 만족하는 경우에 한정시키는 차이점이 있다. 또한, 배열 갱신 방법에 있어서는 xi > A(k)이면 스택과 동일한 방법으로 k←k+1에 단순히 추가된다. 반면에 xi < A(1)이면 배열을 초기화시키고 A(1)←xi로 추가시키는 단순한 과정을 수행한다. 마지막으로 A(1) < xi < A(k)이면 이진탐색으로 xi와 동일한 값이 존재하는지 검증하며, 만약 동일한 값이 없으면 xi가 배열의 최대치가 되도록 k의 위치를 감소시킨다.

Step 3을 수행함으로서 배열 갱신 횟수를 감소시킬 뿐 아니라 이진탐색을 적용하여 수행시간 복잡도 O(logk)로 배열 탐색 시간도 획기적으로 줄일 수 있다.

만약, xi가 그림 1과 같다고 가정하여 보자. 본 데이터는 Shamir[13]에서 인용되었다. 여기서 최대치는 9로 10을 법으로 하는 경우라고 가정하면 xi < 0.5(p-1) = 4로 배열의 갱신 최대치는 4이다. 이 데이터는 사이클 시작점을 μ, 사이클 길이를 λ라 할 때 μ = 2, λ = 8이며, 사이클에서의 최소치는 1이다. 따라서 스택을 이용하면 사이클 최소치 x5 = 1 = x13을 찾는다.

OTNBBE_2023_v23n5_15_f0001.png 이미지

그림 1. xi = f(x)

Fig. 1. xi = f(x)

그림 1의 데이터에 대해 스택을 적용하는 방법과 배열을 적용하는 방법을 수행하는 과정은 표 1과 같다. 스택을 이용하는 방법은 탐색 및 갱신(search & update) 8회와 추가(add) 5회의 13회를 수행한다. 반면에 배열을 이용하는 방법은 xi < 0.5xi-1와 xi < 0.5(p-1)을 적용하면 단순 추가 2회, 탐색과 갱신 2회의 4회로 감소시킨다.

표 1. 스택과 배열 갱신횟수

OTNBBE_2023_v23n5_15_t0001.png 이미지

Table 1. The number of updates for Stack and Array

Ⅳ. 실험 및 결과 분석

n = 1019에 대해 αγ ≡ β(mod n)에서 α=2.5, γ=10, 100,200,⋯,1000에 대해 Pollard의 Rho, Brent, Nivasch의 스택 이용법과 제안된 배열 이용법에 대한 모듈러 연산 횟수와 메모리 충돌 검증 횟수 (갱신 횟수 포함)를 비교하였다.

2100 ≡ 548(mod 1019)에 대해 각 알고리즘별 수행방법을 비교한 결과는 표 2에 제시되어 있으며, α=2,5, γ = 10, 100, 200,⋯, 1000에 대해 Pollard의 Rho, Brent, Nivasch의 스택 이용법과 제안된 배열 이용법의 경우는 표 3에 제시되어 있다.

표 2. 2100 ≡ 548(mod 1019)의 사이클 검출

OTNBBE_2023_v23n5_15_t0002.png 이미지

Table 2. Cycle Detection of 2100 ≡ 548(mod 1019)

표 3. αγ ≡ β(mod 1019)의 모듈러 연산과 메모리 충돌 검증 횟수

OTNBBE_2023_v23n5_15_t0003.png 이미지

Table 3. The number of Modular computation and collision verification for αγ ≡ β(mod 1019)

2100 ≡ 548(mod 1019) 경우 μ = 1, (x1 = 417), λ = 19이다. 따라서 x1 = 417 = x20가 사이클을 형성하고 있다. Nivasch의 스택 이용법이나 제안된 배열 이용법 모두 대부분은 사이클에서의 최소치 x1 ≤ xmin ≤ x19을 μ+λ < xmin ≤ μ+2λ에서 찾는 방법이다. 즉, xmin (x16 = 42 = x35)로 x←f(x)를 35회 수행한다. Nivasch의 스택 이용법은 35회 모두에 대해 단순 추가나 역 탐색 갱신을 수행하는데 반해 제안된 배열 이용법은 (xi < 0.5xi-1)∩ (xi < 0.5(p-1)의 10회만을 수행하며, 메모리 크기 측면에서도 스택의 4에 비해 배열은 3으로 감소된 효과를 얻는다.

또한, 스택에 단순 추가시키는 경우를 제외한 역추적과 갱신에는 18회를 수행하는데 반해, 배열의 이진 탐색과 갱신에는 4회만을 수행하였다. 결론적으로, Brent의 포인터 방법은 모듈러 연산횟수는 Nivasch의 스택 법에 비해 많이 수행되나 포인터 값 갱신횟수는 매우 적은 장점이 있다. 따라서 2가지 방법 중에서 어떤 것이 보다 좋은지에 대해서는 판단할 수가 없다. 제안된 배열법은 Nivasch의 스택 법과 거의 동일한 모듈러 연산횟수를 수행하지만 배열 값 갱신 횟수는 73% 이상으로 크게 감소시키는 효과를 얻었다. 결론적으로 따라서 단순 추가를 제외한 순수한 배열 값 탐색과 갱신 횟수만을 고려해 볼 때, Brent의 포인터 법보다는 많이 수행되지만 모듈러 연산횟수가 작아 Brent의 포인터 법 보다 좋은 알고리즘이라 할 수 있다.

실제 적용 시에는 αγ ≡ βγ(mod p)의 역함수 αγ-1 ≡ βγ-1 αγ-1 ≡ βγ-1 (modp)을 구하여 이중으로 처리하는 방식을 취할 수 있다. γ+γ-1 = (p-1)로 γ = (p-1)-γ-1로 구할 수 있다. 역함수에 대한 실험 결과는 표 4에 제시되어 있으며, Nivasch의 스택 이용법과 이중-배열 방법의 모듈러 연산횟수와 메모리 탐색 횟수 비교는 표 5에 제시되어 있다. 표에서 역함수와 이중으로 배열 처리하면 스택 이용법에 비해 모듈러 연산횟수를 15.96% 감소시킬 수 있으며, 메모리 탐색 횟수를 77.72% 감소시킬 수 있다.

표 4. αγ-1 ≡ βγ-1(mod 1019)의 모듈러 연산과 메모리 충돌 검증 횟수

OTNBBE_2023_v23n5_15_t0004.png 이미지

Table 4. The number of Modular computation and Collision verification for αγ-1 ≡ βγ-1(mod 1019)

표 5. 스택과 이중-배열의 모듈러 연산과 메모리 충돌 검증 횟수

OTNBBE_2023_v23n5_15_t0005.png 이미지

Table 5. The number of modular computation and collision verification for Stack and dual-Array method

Ⅴ. 결론

본 논문은 이산대수 문제에 있어서 사이클을 검출하는 Nivasch의 스택 법의 문제점을 개선하기 위해 배열을 적용하는 방법을 제안하였다. 제안된 방법은 (xi < 0.5xi-1) ∩ (xi < 0.5(p-1)) 조건을 만족하는 경우에 한해 배열의 데이터에 대해 추가 또는 갱신하는 방법을 적용하였다. 이러한 방법을 적용함으로 인해 배열의 최대 크기도 스택에 비해 감소시켰다. 또한, xi < A(1) 인 경우 스택에 비해 단순 추가가 용이하였으며, A(1) < xi < A(k)의 경우 이진탐색 법을 적용할 수 있어 xi를 배열의 최대치로 하는 배열 데이터 갱신도 빠르게 수행할 수 있었다. 제안된 알고리즘을 적용한 결과 Nivasch의 스택 법에 비해 배열 추가와 탐색 수행횟수를 73% 이상 줄일 수 있음을 보였다.

References

  1. T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein, "Introduction to Algorithms, Section 31.7 The RSA Public-key Cryptosystem", 2nd Ed., MIT Press and McGraw-Hill. pp. 881-887, 2001.
  2. D. R. Stinson, "Cryptography: Theory and Practice," 3rd ed., London, CRC Press, 2006.
  3. J. M. Pollard, "Monte Carlo Methods for Index Computation(mod p)", Mathematics of Computation, Vol. 32, No. 143, pp. 918-924, Jul. 1978, https://doi.org/10.1090/S0025-5718-1978-0491431-9
  4. R. P. Brent, "An Improved Monte Carlo Factorization Algorithm", Bit Numerical Mathematics, Vol. 20, No. 2, pp. 176-184, Jun. 1980, https://doi.org/ 10.1007/BF01933190
  5. S. Bai and R. P. Brent, "On the Efficiency of Pollard's RhoMethod for Discrete Logarithms", Proceedings of the Fourteenth Symposium on Computing: The Australasian Theory Symposium, Vol. 77, pp. 125-131, Jan. 2008.
  6. E. Teske, "Speeding Up Pollard's Rho Method for Computing Discrete Logarithms", Lecture Notes in Computer Science, Vol. 1423, pp. 541-554, Jun. 1998, https://doi.org/10.1007/BFb0054891
  7. G. Nivasch, "Cycle Detection Using a Stack", Information Processing Letters, Vol. 90, No. 3, pp. 135-140, May 2004, https://doi.org/10.1016/j.ipl.2004.01.016
  8. J. H. Cheon, J. Hong, and M. K. Kim, "Speeding Up the Pollard Rho Method on Finite Fields", 14th International Conference on the Theory and Application of Cryptology and Information Security, pp. 471-488, Dec. 2008, https://doi.org/10.1007/978-3-540-89255-7_29
  9. D. Shanks, "The Infrastructure of a Real Quadratic Field and its Applications", Proceedings of the 1972 Number Theory Conference, University of Colorado, Boulder, 1972.
  10. S. U. Lee, "Baby-Step Adult-Step Algorithm for Discrete Logarithm," Journal of KIIT, Vol. 11, No. 10, pp. 121-128, Oct. 2013. https://doi.org/10.14801/kiitr.2013.11.10.121
  11. S. U. Lee, "Multiple Parallel-Pollard's Rho Discrete Logarithm Algorithm," Journal of The Korea Society of Computer and Information, Vol. 20 No. 8, pp. 29-33, Aug. 2015, https://doi.org/ 10.9708/jksci.2015.20.8.029
  12. S. U. Lee, "Cycle Detection in Discrete Logarithm Using a Queue," The Journal of The Institute of Internet, Broadcasting and Communication, Vol. 17, No. 3, pp. 1-7, Jun. 2017, https://doi.org/10. 7236/JIIBC.2017.17.3.1 https://doi.org/10.7236/JIIBC.2017.17.3.1
  13. A. Shamir, "Random Graphs in Cryptography", 7th Haifa Workshop on Interdisciplinary Applications of Graph Theory, Combinatorics and Algorithms, 2007.
  14. Wikipedia, "Cycle Detection", http://en.wikipedia.org/wiki/Cycle_detection, Wikimedia Foundation, Inc, Retrieved Jan. 2023.