【发布时间】:2019-06-13 14:53:48
【问题描述】:
我正在编写一个脚本来破解小型 RSA 密钥。我已经想到了一种在我使用的方法中节省大量时间的方法。为此,我需要知道如何找到一定大小的数字的最大可能素因数。例如:
N = 9868690954602957859
N_MAX_FACTOR_BITSIZE = 64
然后,我通过这个算法运行N:
p = floor(sqrt(n))
if p mod 2 == 0:
p += 1
while p < N: # Referenced above
if p mod n == 0:
return p
p += 2
该算法的工作原理是,floor(sqrt(N)) 上方只有两个素数可以将N 整除。由于这两个数字都是素数,因此算法只检查奇数。
为了缩短此算法所需的时间,我想将while p < N 中的 N 与可以乘以 N 的最大 64 位奇数交换。
EG 一个将N 和N_MAX_FACTOR_BITSIZE 作为参数并返回N 的最大奇数因子的算法,即N_MAX_FACTOR_BITSIZE long。
它返回的数字必须是N_MAX_FACTOR_BITSIZE 位长。
任何帮助将不胜感激。
【问题讨论】:
-
您能否重新表述您的问题,以便更清楚地说明您想要实现的目标、已经实现的目标以及无效的目标?否则它看起来像是为我做的问题。
-
最多有 一个 N 的质因子大于 sqrt(N)。但可能没有。
-
RSA 密钥与数值属性无关。如果
n可以被i和j整除,而i和j甚至相对互为质数,那么i*j也必须能整除n。如果两个除数都大于sqrt(n),则它们的乘积大于n。你的前提会立即导致矛盾。 -
对于随机整数,找到最大素数的最简单方法是先找到最小的素数。去掉所有最小的因子后,就剩下最大的了。然而,RSA 模被选择为两个大小大致相同的素数的乘积。对于这些模数,找到最小和最大的工作量大致相同。
-
最简单的方法可能是调用
factorprogram。它将为您完成工作,并且还支持大整数。另见Running shell command and capturing the output in Python。
标签: python algorithm cryptography primes factors