【问题标题】:Issues factoring large prime that is 99 digits long分解 99 位长的大素数的问题
【发布时间】:2021-01-21 05:59:13
【问题描述】:

号码是112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869 我的代码如下

def getfactors(number):
    factors = []
    for potentialFactor in range(1 , int(math.sqrt(number)) + 1):
        if number % potentialFactor == 0:
            factors.append(potentialFactor)
    return factors    

输入是

getfactors(112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869)

该程序已经运行了至少 3 个小时,但我仍然没有任何结果。该代码也适用于其他数字。有什么算法或方法可以用来加快速度吗?

【问题讨论】:

  • 我不是因式分解算法方面的专家,但我知道整数分解是一个非常困难的问题(尽管尚未经过数学证明)实际上许多加密函数(如 RSA)取决于它的硬度,您提供的数字大约是329 位可能需要一些时间才能完成。
  • 1.只测试能大大提高速度的素数 2. 每次你发现一个因子除以它并再次测试它(因为它也可以除以素数的幂),这将大大提高速度,因为你的数字会得到发现的每个因素都较小。 4. 记住所有因素以及使用了多少次。 5. 从素因数分解中,您可以将所有可能的因数构造为使用素因数的任意数量的组合。 IIRC 那里有一些基于 FFT 的方法。 5. 如果你的数是素数,那么它除了它自己和 1 之外没有其他因子!!!

标签: math encryption cryptography rsa prime-factoring


【解决方案1】:

由于 RSA 素数彼此接近,因此您的方法将花费大量时间来考虑给定的数字。即使sieving 使用埃拉托色尼筛法也无济于事,因为您有一个 326 位数字。你能不能筛到163位,没办法。这比第一个 300 位的 RSA challenge RSA-100 略大。

使用现有的库,如


实验

  1. 我尝试了Pollard's p-1 algorithm,仍然运行了一天半,但还没有产生结果。这是预期的,因为B bound 必须在2^55 附近,成功概率为1/27。 CADO-NFS 成功后我停止了实验。这是自己实现的 Pollard 的p-1,可以在GMP-ECM 中找到优化的

  2. 尝试了 CADO-NFS。稳定版可能不容易为新机器编译,所以更喜欢GitLab中的活跃版本。

    使用 4 个内核大约 6 小时后,CADO-NFS 产生了结果。正如预期的那样,这是一个 RSA CTF/挑战。因为我不想破坏乐趣;这里使用 SHA-512 的哈希承诺,使用 OpenSSL 执行;

    echo -n "prime x" | openssl sha512

27c64b5b944146aa1e40b35bd09307d04afa8d5fa2a93df9c5e13dc19ab032980ad6d564ab23bfe9484f64c4c43a993c09360f62f6d70a5759dfeabf59f18386

faebc6b3645d45f76c1944c6bd0c51f4e0d276ca750b6b5bc82c162e1e9364e01aab42a85245658d0053af526ba718ec006774b7084235d166e93015fac7733d

实验详情

  • CPU : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

  • 内存:32GB - 不需要太多内存,至少在多项式选择和筛选期间。

  • 专用核心:4

  • 测试机Ubuntu 20.04.1 LTS

  • CUDA - 没有

  • gcc 版本 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

  • cmake 版本 3.16.3

  • 外部库:Ubuntu 规范中没有任何内容

  • CODA-NFS 版本:GitLab 开发版本克隆于 23-01-2021

  • 位大小;

    • n 有 326 位(RSA-100 挑战有 330 位,并在 1991 年被 Lenstra 打破)
    • p 有 165 位
    • q 有 162 位

cado-nfs-2.3.0 未编译并给出有关 HWLOC 的错误-HWLOC_TOPOLOGY_FLAG_IO_DEVICES。请朋友测试编译,它对他们有用。这是一个较旧的 Linux 版本。所以我决定使用GitLab version

【讨论】:

  • 不错。我建议您在答案中添加有关设置和操作方式的一些详细信息:CPU、RAM、操作系统、使用的确切 GitLab 版本、外部库的版本、编译器版本、使用的参数,以及您必须解决的任何问题。另外,因子的位大小
【解决方案2】:

你对这个号码了解多少?如果它是 RSA 公钥,那么它只有两个大素数。如果它是一个随机数,那么它很可能有小的素因数。数字的类型将决定您要如何对其进行因式分解。

两个辅助功能也将很有用。首先是一个埃拉托色尼筛,以建立一个质数列表,例如 50,000 或一些方便的限制。第二个大数素数检验,如 Miller-Rabin,检查余数是否为素数。

使用 Eratosthenes 的筛子为您提供所有小素数,直至达到方便的极限。依次测试每个素数,直至目标数的平方根。当你找到一个除以测试数的素数时,将测试数除以使其更小。一个素数可以分裂不止一次。完成所有除法后,将质数限制重置为较小数字的平方根。

if (numToTest MOD trialFactor = 0)
  repeat
    listOfFactors.add(trialFactor)
    numToTest <- numToTest/trialFactor
  until (numToTest MOD trialFactor != 0)
  primeLimit <- sqrt(numTotest)
endif

一旦您要测试的数字减少到 1,您就已经完全考虑了它。

如果您在完全分解目标之前用完了素数,则值得运行 Miller-Rabin 检验 64 次以查看余数本身是否为素数;这可能会为您节省大量试图找到不存在的大素数因子的工作。如果剩余部分是复合的,那么您可以使用更大的筛子再试一次,或者使用其中一种重型分解方法:二次筛、椭圆曲线等。

【讨论】:

    【解决方案3】:

    我为R 编程语言编写了一个库,名为RcppBigIntAlgos,它可以在合理的时间内分解这些类型的数字(不像@kelalaka 的答案中使用的优秀的CADO-NFS 库那样快)。

    正如其他人所指出的,除非您投入大量时间,否则您自己推出的任何程序都很难计算您的数字。就我个人而言,我已经投入了数千小时。您的里程可能会有所不同。

    这是我在原版 R 控制台(无特殊 IDE)中运行的测试:

    numDig99 <- "112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869"
    ## install.packages("RcppBigIntAlgos") if necessary
    library(RcppBigIntAlgos)
    
    prime_fac <- quadraticSieve(numDig99, showStats=TRUE, nThreads=8)
    
    Summary Statistics for Factoring:
        112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869
    
    |      MPQS Time     | Complete | Polynomials |   Smooths  |  Partials  |
    |--------------------|----------|-------------|------------|------------|
    |  11h 13m 25s 121ms |   100%   |   11591331  |    8768    |    15707   |
    
    |  Mat Algebra Time  |    Mat Dimension   |
    |--------------------|--------------------|
    |    1m 39s 519ms    |    24393 x 24475   |
    
    |     Total Time     |
    |--------------------|
    |  11h 15m 12s 573ms |
    

    就像@kelalaka 一​​样,我们获得了相同的哈希值(同样,在R 控制台中运行):

    system(sprintf("printf %s | openssl sha512", prime_fac[1]))
    faebc6b3645d45f76c1944c6bd0c51f4e0d276ca750b6b5bc82c162e1e9364e01aab42a85245658d0053af526ba718ec006774b7084235d166e93015fac7733d
    
    system(sprintf("printf %s | openssl sha512", prime_fac[2]))
    27c64b5b944146aa1e40b35bd09307d04afa8d5fa2a93df9c5e13dc19ab032980ad6d564ab23bfe9484f64c4c43a993c09360f62f6d70a5759dfeabf59f18386
    

    RcppBigIntAlgos::quadraticSieve 中实现的算法是Multiple Polynomial Quadratic Sieve。有一个更有效的二次筛版本,称为Self Initializing Quadratic Sieve,但是,在野外没有那么多文献可用。

    这是我的机器规格:

    MacBook Pro (15-inch, 2017)
    Processor: 2.8 GHz Quad-Core Intel Core i7
    Memory; 16 GB 2133 MHz LPDDR3
    

    这是我的R 信息:

    sessionInfo()
    R version 4.0.3 (2020-10-10)
    Platform: x86_64-apple-darwin17.0 (64-bit)
    Running under: macOS Catalina 10.15.7
    
    Matrix products: default
    BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
    LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] RcppBigIntAlgos_1.0.1 gmp_0.6-0            
    
    loaded via a namespace (and not attached):
    [1] compiler_4.0.3 tools_4.0.3    Rcpp_1.0.5  
    

    【讨论】:

    • 很好,库在计算过程中是否使用了所有 8 个线程?请注意,CADO-NFS 也可以通过网络工作。
    • @kelalaka,首先,感谢您的编辑。那是一个粗心的疏忽。关于实现:对于算法的筛选部分,无论用户指定多少线程都将被使用(直到该机器上可用的最大线程数)。在这个阶段,每个线程筛选不同的多项式并收集信息。每个线程都会定期暂停并将信息转储到一个中心位置。
    • @kelalaka,我应该注意,在我的机器上,我有 4 个可用于超线程的内核,所以我可以使用 8 个线程。通常,您将看到最大化内核数量的最大性能优势。在那之后,会有一些好处,但由于缓存污染(即多个线程共享同一个缓存)而没有那么明显。
    • 没有问题。在我的机器(4x2)上也是这样,我选择了 4 核但没有将性能与 8 进行比较。现在想知道,我会检查一下,然后也会通知你。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 2021-12-24
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多