【问题标题】:How to find the largest possible odd factor of a number如何找到一个数的最大可能奇数
【发布时间】: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 &lt; N 中的 N 与可以乘以 N 的最大 64 位奇数交换。

EG 一个将NN_MAX_FACTOR_BITSIZE 作为参数并返回N 的最大奇数因子的算法,即N_MAX_FACTOR_BITSIZE long。

它返回的数字必须是N_MAX_FACTOR_BITSIZE 位长。

任何帮助将不胜感激。

【问题讨论】:

  • 您能否重新表述您的问题,以便更清楚地说明您想要实现的目标、已经实现的目标以及无效的目标?否则它看起来像是为我做的问题。
  • 最多有 一个 N 的质因子大于 sqrt(N)。但可能没有。
  • RSA 密钥与数值属性无关。如果n 可以被ij 整除,而ij 甚至相对互为质数,那么i*j 也必须能整除n。如果两个除数都大于sqrt(n),则它们的乘积大于n。你的前提会立即导致矛盾。
  • 对于随机整数,找到最大素数的最简单方法是先找到最小的素数。去掉所有最小的因子后,就剩下最大的了。然而,RSA 模被选择为两个大小大致相同的素数的乘积。对于这些模数,找到最小和最大的工作量大致相同。
  • 最简单的方法可能是调用factor program。它将为您完成工作,并且还支持大整数。另见Running shell command and capturing the output in Python

标签: python algorithm cryptography primes factors


【解决方案1】:
def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1

    return factors

n = 9868690954602957859

primes =prime_factors(n)[-1]

print(primes)

【讨论】:

  • 这个算法可以通过一些调整来工作。会试试看。
  • 此算法返回小于n 的所有素数因子的列表。我需要一种算法,它返回所有小于 n 且位大小为 s 或例如 64 位的素数。
  • @Legorooj 看看这个算法Sieve_of_Eratosthenes 它会帮助你
猜你喜欢
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2014-11-28
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多