buu RSA2

拿到压缩包,解压后得到一个txt文件
在这里插入图片描述
文件中一共有3个条件,除明钥(n,e)外还多给了一个dp,似乎条件有点多余,但是发现题目所给的n的值过大,很难得到分解的两个素数.需要借助dp来求解素数p,然后求得素数q
推导过程如下
先列出所有的条件
dp=d%(p-1)
ed☰1 mod (p-1)(q-1)
所以 k1(p-1)+dp=d
k2(p-1)(q-1)+ed=1
从而可以可以得到
k2(p-1)(q-1)+ek1(p-1)+edp=1
两边对p-1取余得
edp%(p-1)=1
所以edp=k(p-1)+1
所以k=(edp-1)/(p-1)=e
(dp/(p-1))-1/(p-1)
由dp=d%(p-1)我们可以知道dp<p-1,因此我们很容易得到k的上限要小于e
因此只需要遍历range(1,e) ,若n整除p,即可得到p,从而结束循环.

import  gmpy2
import  rsa
import  binascii
p=0
e=65537
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
dp=905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
n=248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
temp=dp*e
for i in range(1,e) :
    if (temp-1)%i==0:
        x=(temp-1)//i+1
        y=n%x
        if y==0:
            p=x
            break
q=n//p#'//'代表向下取整,'/'得到的是浮点数
d=gmpy2.invert(e,(p-1)*(q-1))
key=rsa.PrivateKey(n,e,d,p,q)
m=pow(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))#unhexlify()的作用是返回16进制数对应的字符串




运行结果如下
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值