rsa - Wolfram 可以分解 300 位 RSA 号码吗?
问题描述
每个人都知道很难分解超过 100 位的公钥,但是250 位的 RSA 号码已经被分解,并且 Wolfram 能够分解一个 300 位的号码。
I tried factorizing public key n=144965985551789672595298753480434206198100243703843869912732139769072770813192027176664780173715597401753521552885189279272665054124083640424760144394629798590902883058370807005114592169348977123961322905036962506399782515793487504942876237605818689905761084423626547637902556832944887103223814087385426838463 using a simple prime factor program but it has encountered an error and it keeps repeating.
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)
结果如下:
接下来我尝试了埃拉托色尼筛法
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 位数字。我只是不明白为什么这么多轻易放弃的程序员说这是不可能的。
解决方案
如果因子很小,则更容易对数字进行因子分解。这是一个不错的 300 位大数字:
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
很明显这些因素是什么,对吧?主要因素是 2 299 5 299,从数字上看应该很明显。
因此,有些数字比其他数字更容易分解。
RSA 密钥是由两个大素数相乘而成的,没有小因数。对于 309 位数字,每个因子可能超过 150 位。因此,如果您尝试使用 Eratosthenes 筛来分解一个大素数,那么您的程序将尝试计算最多 150 位的所有素数,而这实在是太多的素数无法计算。
少于 150 位的素数的个数是:
大约 10 147,因此您的程序至少需要那么多处理器周期才能完成。这个数字是如此之大,以至于如果我们使用全世界所有的计算机(可能每秒 10 21或 10 22次操作),您的程序将需要超过 10 117年才能运行(再次,使用所有计算机整个世界)。
我只是不明白为什么这么多轻易放弃的程序员说这是不可能的。
这是因为众所周知,因数分解是一个非常困难的问题——放弃的人正在放弃,因为他们知道最先进的算法用于分解大数(通用数域筛),并且知道 300 位数只是如果没有算法、计算机或工程方面的某种彻底的新发展,这是不可行的。
推荐阅读
- javascript - 如何计算失败的承诺数量?
- python - 如何将张量从 2D 转换为 4D
- php - WordPress 简单的函数调用阻止页面加载
- flutter - “文本样式?” 不能分配给参数类型“TextStyle”
- kotlin - 运行 Jacoco 覆盖时缺少带有 when 和 enum 的分支
- react-native - 更新应用程序后 React Native fetch() 响应不同
- java - 如何导出包中的文件?
- node.js - JSON Parse 错误:尝试更改值时发生意外的 EOF
- reactjs - 加载包含 jwt-token 的html
- android - 在 Intent 中设置类型以启动 Activity