Math 问题分解99位长的大素数

Math 问题分解99位长的大素数,math,encryption,cryptography,rsa,prime-factoring,Math,Encryption,Cryptography,Rsa,Prime Factoring,电话号码是112887987371630998208146033619591342348211436696007401429072377238341647882152698281999652360869 我的代码在下面 def getfactors(数字): 因子=[] 对于范围内的电位因子(1,int(数学sqrt(数字))+1): 如果数字%potentialFactor==0: 因子。附加(潜在因子) 回报率 输入是 getfactors(112887987371630998408146

电话号码是112887987371630998208146033619591342348211436696007401429072377238341647882152698281999652360869 我的代码在下面

def getfactors(数字):
因子=[]
对于范围内的电位因子(1,int(数学sqrt(数字))+1):
如果数字%potentialFactor==0:
因子。附加(潜在因子)
回报率
输入是

getfactors(1128879873716309984081460333619591342348211436696007401429072377238341647882152698281999652360869)

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

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

两个辅助功能也很有用。首先筛选埃拉托斯烯,以建立一个高达50000或某种方便限制的素数列表。第二个是大数素数测试,如Miller-Rabin,用来检查余数是否为素数

使用埃拉托斯烯筛,将所有的小素数筛到一个方便的极限。依次测试每个素数,直到目标数的平方根。当你发现一个素数除以测试数时,把测试数除以使它变小。素数可以分裂不止一次。完成所有分割后,将基本限制重置为较小数字的平方根

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

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

使用现有库,如

  • CADO-NFS
  • NFS分解:
  • 作为服务的保理

实验

  • 我已经试过了,仍然跑了一天半,还没有结果。这是由于必须在
    2^55
    左右,且成功概率
    1/27
    而预期的结果。在CADO-NFS成功后,我停止了实验。这是自实现的Pollard的
    p-1
    ,您可以在

  • 尝试了CADO-NFS。对于新机器来说,稳定版本可能不容易编译,因此更喜欢从中选择活动版本

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

    echo-n“素数x”| openssl sha512


  • 实验细节

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

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

    • 专用磁芯:4

    • 测试机器Ubuntu 20.04.1 LTS

    • 库达-不

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

    • cmake版本3.16.3

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

    • CODA-NFS版本:克隆于2021年1月23日的GitLab开发版本

    • 钻头尺寸

      • n有326位(challenge有330位,1991年被Lenstra打破)
      • p有165位
      • q有162位

    cado-nfs-2.3.0
    未编译并给出有关HWLOC-
    HWLOC\u拓扑\u标志\u IO\u设备的错误。请一位朋友测试编译,结果对他们有效。这是一个较旧的Linux版本。因此,我决定使用。

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

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

    下面是我在普通
    R
    控制台(无特殊IDE)中的测试运行:

    RcppBigIntAlgos::quadraticSieve
    中实现的算法是。二次筛有一个更有效的版本,称为二次筛,然而,在野外没有那么多的文献可用

    以下是我的机器规格:

    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  
    

    我不是因子分解算法的专家,但我知道整数因子分解是一个非常困难的问题(虽然还没有数学证明)。实际上,像RSA这样的许多加密函数都取决于它的硬度。您提供的数字大约是329位,这可能需要一些时间才能完成。1。只测试可以将速度提高2倍的素数。每次你找到一个因子,用它除以这个数,然后再次测试它(因为它也可以被素数的幂除),这将极大地提高速度,因为你找到的每个因子的数字都会变小。4.记住所有因素以及它们被使用了多少次。5.通过素因子分解,您可以将所有可能的因子构造为所用素因子的任意数量的组合。IIRC有一些基于FFT的方法。5.如果你的数字是素数,那么它除了自身和1之外没有其他因素!!!美好的我建议您在答案中添加一些关于设置和操作方式的细节:CPU、RAM、OS、使用的确切GitLab版本、externa版本
    system(sprintf("printf %s | openssl sha512", prime_fac[1]))
    faebc6b3645d45f76c1944c6bd0c51f4e0d276ca750b6b5bc82c162e1e9364e01aab42a85245658d0053af526ba718ec006774b7084235d166e93015fac7733d
    
    system(sprintf("printf %s | openssl sha512", prime_fac[2]))
    27c64b5b944146aa1e40b35bd09307d04afa8d5fa2a93df9c5e13dc19ab032980ad6d564ab23bfe9484f64c4c43a993c09360f62f6d70a5759dfeabf59f18386
    
    MacBook Pro (15-inch, 2017)
    Processor: 2.8 GHz Quad-Core Intel Core i7
    Memory; 16 GB 2133 MHz LPDDR3
    
    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