本算法要解决的问题是离散对数问题(discrete logarithm problem,DLP)。问题的描述如下:
G是一个乘法循环群,其中有一个元素h,且其生成元为g。要求求得一个x,使得h=g
x。
对于这样一个问题,有如下的几种情况考虑:
- 如果我们对x没有任何的信息,只知道x满足0<x<n=ord(g),可以使用如下的算法来解决:
- Shanks' baby step-gaint step method:时间和空间的需求是一个const*n1/2;
- Pollard's rho method:需要的时间约等于(PI*n/2)1/2,并且可以使用并行算法来加速解决的过程;
- 如果我们知道x满足0<a<=x<=b<n=ord(g):
- Shanks' baby step-gaint step method同样可以解决:时间和空间的需求是一个const*(b-a)1/2;
- Pollard's rho method不能利用到这个信息;
- Pollard’s Kangaroo算法:就是我们将要具体讲解的算法,它的预期操作步骤为2*(b-a)1/2个群元素的计算步骤。
形象的来说,Pollard's Kangaroo算法就是使得两只袋鼠在解空间里面各自跳跃,其中一只为驯化的袋鼠,它的参数都是确定的,而另一只为野生的袋鼠,它的参数是要求的。驯化袋鼠每次跳跃之后都会做一个陷阱,如果野生袋鼠的某次跳跃碰到了这个陷阱,则表明他们的参数是一致的。这样,就可以使用驯化袋鼠的参数来推导出野生袋鼠的参数。由于这样一个过程是两条不同的路径经过变化得到一个交点,路径看起来有点像希腊字母lambda,所以该算法也称为lambda算法。
下面开始具体的介绍算法的过程。
由于该问题是要解决一个离散对数问题,则两只袋鼠就可以设置为群G里面的两个元素,由生成元的定义,二者都可以用g的某个幂来表示,驯化袋鼠的幂次是已知的,而野生袋鼠的幂次是包含x的式子。二者相遇时,通过两只袋鼠的幂次的等式可以求出x。
算法首先定义两只袋鼠,tame和wild。tame的初始位置是T=g
(a+b)/2,wild的初始位置是W=h(即g
x)。然后定义一个跳跃的集合S={g
s0,g
s1,...,g
sr: s
i=O((b-a)
1/2), r=O(log(b-a))};以及一个映射v:G→{0,1,...,r}。这样,袋鼠的跳跃过程可以使用如下的式子表示:
对于k=0,1,...:
Tame Kangaroo:t
k+1=t
k*g
si ,其中i=v(t
k) ;
Wild Kangaroo :w
k+1=w
k*g
sj,其中j=v(w
k) ;
为了以后计算的需要,在袋鼠跳跃的过程中记录下每次跳跃的距离:
D
0(T) = D
0(W) = 0;
D
k+1(T) = D
k(T) + s
i 其中i=v(t
k) ;
D
k+1(W) = D
k(W) + s
j 其中j=v(w
k) ;
如果够幸运的话,在某几次跳跃之后,wild落入了tame的陷阱,二者相遇了,则可以知道:
t
k = w
l
g
(a+b)/2 * g
Dk(T) = g
x * g
Dl(W)
即:
x = (a+b)/2 + D
k(T) - D
l(W) (mod n)
这样,就求出了x值。
在S设置恰当的情况下,期望的跳数为(b-a)
1/2+const ,单位为jumps/kangaroo。
在s
i=2
i,i=0,1,...,r时,可以达到以上的效果。
分析可知,假设Tame的路径上有N个点,且s
i的中间值(mean value)为m的情况下,在Tame路径的每个点上成功的概率为1/m,且各个点的事件都是独立事件。这样,整个过程成功的概率为PS=1-(1-1/m)
N≈1-e
-ß,其中ß=N/m,且m是一个较大的数。为了达到最好的性能,可以设置m=µ* (b-a)
1/2。例如,在ß=4,PS=0.98,并且在µ=1/4时,执行的总步骤数N+m,在数量级上为O((b-a)
1/2)。更一般的,对于一个ß,如果µ=1/(2ß
1/2),总共的执行步骤将为2(ß(b-a))
1/2。
最后这一点性能方面的分析取自:
J.M. Pollard,"Monte Carlo methods for index computation ( mod p)", Math. Comp., vol.32. no.143(July, 1978), pp918-924