基于N分解的RSA 题目,如何分解N

一、分解N的方法

1.在线查询网站

factordb.comicon-default.png?t=O83Ahttps://factordb.com/index.php

2.使用yafu工具分解

https://sourceforge.net/projects/yafu/

yafu使用方法:

#分解数字:

.\yafu-x64.exe factor(1213465437867)

#导入文件进行分解(注意文本结尾要换行,要不然不能用)

.\yafu-x64.exe "factor(@)" -batchfile Key.txt

(分解之后会自动把Key.txt删掉,Key.txt就是你的文件名)

3.p和q都为素数并且是上一个数和下一个数之间的关系的话可以使用费马分解
'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)
 
'''开始破解'''
temp=gmpy2.iroot(n,2)[0]  #乘积开根号得到的结果一定在P和q之间
p=gmpy2.next_prime(temp)
q=n//p
print(p)
print(q)

接下来说说gmpy2.iroot()这个函数

它专门用于大数开根号,gmpy2.iroot(n,t),n是你要开的大数,t是你要开几次幂

要注意结果的形式:前面是开根号的结果,后面的true或false表示是否是整开的。

4.平方差遍历法

n=p*q

令p=a-b,q=a+b,那么n=a^2-b^2,即b^2=a^2-n.

再令a是n的"中间值"(\sqrt{n}),然后让a以步长为1自增遍历,直到pow(a,2)-n的结果可以正好开方为止。那个结果开方就是b。

原则上是可以爆出符合条件的所有解,即便解不是质数也可以得到结果.

'''生成两个挨得近的素数p,q'''
p = getPrime(512)
q = gmpy2.next_prime(p)
n=p*q
print(p)
print(q)
print(n)
 
 
 
print('开始破解')
'''开始破解'''
a=gmpy2.iroot(n,2)[0]
while 1:   #破解出来一组就行了,一般也就一组,挨得很近的话很快就出来了,如果长时间还没出来就可以换方法了,不要指望着他遍历所有的,到死也弄不完。
    B2=pow(a,2)-n
    a+=1
    if gmpy2.is_square(B2):
        b=gmpy2.iroot(B2,2)[0]
        p=a+b
        q=a-b
        print(p)
        print(q)
        break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值