sage中求解离散对数我目前知道的四个函数:
(1)discrete_log:通用的求离散对数的方法:discrete_log(a,base,ord,operation)
(2)discrete_log_rho:求离散对数的Pollard-Rho算法:discrete_log_rho(a,base,ord,operation)
(3)discrete_log_lambda:求离散对数的Pollard-kangaroo算法(也称为lambda算法):discrete_log_lambda(a,base,bounds,operation)
(4)bsgs:小步大步法:bsgs(base,a,bounds,operation)
参数说明:求解以base为底,a的对数;ord为base的阶,可以缺省,operation可以是'+'与'*',默认为'*';bounds是一个区间(ld,ud),需要保证所计算的对数在此区间内。
下面分别举例使用这些函数对ElGamal的分析与Ecc的分析。
#生成64位的素数p作为模数,int为32位,超过int要在数字后加L
p=random_prime(2L**64)
#定义有限域GF(p)
G=GF(p)
#找一个模p的原根
gp ('znprimroot('+str(p)+')')
#输出Mod(rt,p),则x是模p的原根
g=G(rt)
#生成私钥
x=G(ZZ.random_element(p-1))
#公钥y=g^x mod p,由于已经定义在GF(p)上,因此g**x就是g^x mod p
y=g**x
#计算离散对数的通用方法
discrete_log(y,g)==x
#计算离散对数的lambda方法
discrete_log_lambda(y,g,(floor(ZZ(x)/2),2*ZZ(x)))==x
#小步大步法计算离散对数
bsgs(g,y,(floor(ZZ(x)/2),2*ZZ(x)))==x
上面是以discrete_log举例,discrete_log_rho参数列表与discrete_log一致,因此用法相同;只不过,由于discrete_log_rho是基于随机性的概率型算法,因此不一定每次都能找到,不过多一个方法总归是好的;其次,https://xz.aliyun.com/t/2780里面详细介绍了Pollard Rho算法,这个算法起作用是有条件的。
此算法适用于生成元的阶的素因子都是大数的情形,计算元素的阶的函数如下。
#加法阶
n=g.order();n
#乘法阶
n=g.multiplicative_order();n
可以看到加法阶比乘法阶大1。
下面介绍在椭圆曲线上求解离散对数。下例为2013年SECCON CTF quals 中的 Cryptanalysis。
a = 1234577
b = 3213242
n = 7654319
#有限域GF(n)上的椭圆曲线y^2 = x^3 + a*x + b mod n
E = EllipticCurve(GF(n), [0, 0, 0, a, b])
#生成元
base = E([5234568, 2287747])
#公钥
pub = E([2366653, 1424308])
#求解私钥,通用方法;注意这里的运算要换成加法
discrete_log(pub,base,operation='+')
#求解私钥,Rho方法;此情形Rho方法也可以求解,而且可以感觉到比通用方法要快
discrete_log_rho(pub,base,operation='+')
#求解私钥,lambda方法
discrete_log_lambda(pub,base,(floor(1584718/2),2*1584718),operation='+')
#小步大步法计算离散对数
bsgs(base,pub,(floor(1584718/2),2*1584718),operation='+')