Поскольку дубликат этого вопроса был задан под тегом Python, здесь приведена реализация на Python гигантского шага baby step, который, как указывает @MarkBeyers, является разумным подходом (если модуль не слишком большой):
def baby_steps_giant_steps(a,b,p,N = None):
if not N: N = 1 + int(math.sqrt(p))
#initialize baby_steps table
baby_steps = {}
baby_step = 1
for r in range(N+1):
baby_steps[baby_step] = r
baby_step = baby_step * a % p
#now take the giant steps
giant_stride = pow(a,(p-2)*N,p)
giant_step = b
for q in range(N+1):
if giant_step in baby_steps:
return q*N + baby_steps[giant_step]
else:
giant_step = giant_step * giant_stride % p
return "No Match"
В приведенной выше реализации явный N
может быть передан в fish для небольшого показателя степени, даже если p
криптографически велик. Он будет находить показатель степени, пока показатель меньше, чем N**2
. Если N
опущен, показатель всегда будет найден, но не обязательно в вашей жизни или в памяти вашей машины, если p
слишком велик.
Например, если
p = 70606432933607
a = 100001
b = 54696545758787
тогда 'pow (a, b, p)' оценивается как 67385023448517
и
>>> baby_steps_giant_steps(a,67385023448517,p)
54696545758787
Это заняло около 5 секунд на моей машине. Для показателя степени и модуля этих размеров я оцениваю (основываясь на временных экспериментах), что грубая сила заняла бы несколько месяцев.