暴力强迫私钥

时间:2018-04-08 01:22:57

标签: python cryptography private-key brute-force

我需要从下面的等式中找到x

h = pow(g,x,p)

我有

的值
h = 400 digit number
g = 400 digit number
p = 400 digit number

我需要找到x的值。

所有的价值都非常大。

我有不完整的x,其中有10个缺失的数字,并且它们不是连续缺失的数字。所有缺失数字的索引是不同的。

我正在使用10 for循环 每次都要取代那个值来获得H.在python中花费太多时间才能做到这一点。无论如何,我可以更快地完成它。

1 个答案:

答案 0 :(得分:2)

不要拨打pow()一百亿次。相反,使用它来计算h的第一个值,然后通过将前一个值乘以g(或g在该情况下提升到适当的幂10来计算每个连续值缺少的数字不在x)的末尾。

这是一个有效的例子,可以在几秒钟内找到7个缺失的数字。它应该在几个小时内给出10个缺失数字的答案。但正如其他人所指出的那样,通过将此代码移植到另一种语言(如C语言),您将获得更好的性能。

h = 27029080272084173153635398406622455117429159185281491773519587480106092289627
g = 26376362132555166607008315364046996472951702119314003469217622667073785183917
p = 81593331324697655999776287731387256090095437693547587289127550085992860325943
x = 31952256647378403805884540140134925446045889939629675712565170000000381638216
                                 # The missing digits (3897858): ^^^^^^^
z = pow(g, x, p)                 # Initial value of h
d = pow(g, 10**9, p)             # Multiplier to get next value of h
while z != h:
    z = (z * d) % p
    x += 10**9                   # Increment x at position of last unknown digit

print(x)

修改

如果丢失的数字不是连续的,那么您仍然可以使用类似的方法,但不是每次都将x递增相同的数量,而是需要密切关注每一步中哪些数字正在变化。例如,给定一个数字.0.....0...0..,其中0表示缺少的数字,而.表示已知数字,您需要在递增最后一个未知数时添加100数字,9999100当最后一个未知数字达到9时,999990999100当最后两个未知数字都是9时。对于任何模式都不应该太难找出正确的增量未知数字。

.0.....0...0.. + 100
.0.....0...1.. + 100
.0.....0...2.. + 100
  :   :   :
.0.....0...8.. + 100
.0.....0...9.. + 9999100
.0.....1...0.. + 100
.0.....1...1.. + 100
  :   :   :
.0.....1...9.. + 9999100
.0.....2...0.. + 100
  :   :   :
.0.....9...9.. + 999990999100
.1.....0...0.. + 100
  :   :   :

这应该在可行的时间内以10个未知数字运行,但是对于更快的解决方案,请使用James K Polk在下面的评论中建议的中间会合方法。