Wolfram可以分解300位RSA号码吗?

问题描述

每个人都知道很难分解超过100位数字的公钥,但是250 digits RSA number have already been factored 和Wolfram能够分解出300位数字的数字。

Wolfram can Factorize

我尝试了因式分解公钥n = 14496598555178967259529875348043420619810024370384386991273213976907277081319202717666478017371559740175352155288518927927266505412408364042476014439462979859090288305837000500511459216934897712396132290503696250639978538579463472460382654654940382683654654382其产生的作用

import math
i = 0 n=144965985551789672595298753480434206198100243703843869912732139769072770813192027176664780173715597401753521552885189279272665054124083640424760144394629798590902883058370807005114592169348977123961322905036962506399782515793487504942876237605818689905761084423626547637902556832944887103223814087385426838463

    p = math.floor(math.sqrt(n))
    while n % p != 0:
        p -= 1
        i += 1
        q = int(n / p)
        print( p,q)

和结果:

Prime Factorization

接下来,我尝试了Eratosthenes筛网

import time
import math

def sieve(b):
global prime_list
for a in prime_list:
    if (a % prime_list[b] == 0 and a != prime_list[b]):
        prime_list.remove(a)

inp = 144965985551789672595298753480434206198100243703843869912732139769072770813192027176664780173715597401753521552885189279272665054124083640424760144394629798590902883058370807005114592169348977123961322905036962506399782515793487504942876237605818689905761084423626547637902556832944887103223814087385426838463

prime_list = []
i = 2
b = 0 
t = time.time()

while i <= int(inp):
prime_list.append(i)
i += 1
while b < len(prime_list):
sieve(b)
b += 1

print(prime_list)
print("length of list: " + str(len(prime_list)))
print("time took: " + str((time.time()-t)))

那也不行。但是,我相信300位数是可以考虑的。我只是不明白为什么这么多放弃的程序员很容易地说这是不可能的。

Sieve of Eratosthenes

解决方法

如果因数较小,则因数分解更容易。这是一个适合您的300位大数字:

100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

显而易见的是什么因素,对吧?主要因素是2 299 5 299 ,从数量上可以明显看出。

因此,某些数字比其他数字容易分解。

RSA密钥是由两个质数相乘而成的,且系数不小。。对于309位数字,这些因子可能各自超过150位数字。因此,如果您尝试使用Eratosthenes的筛子来分解大质数,那么您的程序将尝试计算所有质数(最多150个数字),这就是太多质数 >进行计算。

少于150个数字的质数为:

Evaluation of PrimePi in Wolfram Alpha

大约10 147 ,因此您的程序至少需要花费这么多的处理器周期才能完成。这个数字是如此之大,以至于如果我们使用了全世界的所有计算机(每秒可能进行10 21 或10 22 操作),那么您的程序所花费的时间将超过运行10 117 年(再次使用全世界的所有计算机)。

我只是不明白为什么这么多放弃的程序员很容易地说这是不可能的。

这是因为众所周知,分解因数是一个非常棘手的问题-放弃的人之所以放弃是因为他们知道先进的算法可以分解大数(General Number Field Sieve),并且知道没有算法,计算机或工程学方面的一些根本性新发展,仅靠300位数字是不可行的。