CTF Crypto---RSA dp泄露

题目

已知n,c,e,dp

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

题目解析

数学解析

已知公钥n,c、密文c以及dp
其中dp = d mod (p-1)
已知

c = m^e mod n
m = c^d mod n
ϕ(n)=(p−1)*(q−1)
d∗e ≡ 1 mod ϕ(n)
dp = d mod (p−1) 

由上述式子可以得到

dp*e ≡ d*e mod (p-1)

进而分解为

d*e = k*(p-1)+dp*e

又因为d∗e ≡ 1 mod ϕ(n)
所以得到k*(p-1)+dp*e ≡ 1 mod ϕ(n)
化简

--->k*(p-1)+dp*e ≡ 1 mod ϕ(n)
--->k*(p-1)+dp*e ≡ 1 mod (p-1)*(q-1)
--->k1*(p-1)+dp*e = 1 + k2*(p-1)*(q-1)
--->dp*e = k2*(p-1)*(q-1)-k1*(p-1)+1
--->dp*e = [k2*(q-1)-k1)]*(p-1)+1

因为dp = d mod (p-1)
即,dp为d%(p-1);所以dp<p-1
那么,e>k2*(q-1)-k1
i = k2*(q-1)-k1
i的范围为(1,e)
上述式子最终化简为
dp*e = i*(p-1)+1
在(1,e)范围内存在一个p可以被n整除并且满足上式

解密脚本
from Crypto.Util.number import *
import gmpy2

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

for i in range(1,e+1):
    if (dp*e-1)%i == 0:
        if n%(((dp*e-1)//i)+1) ==0:
            p = ((dp*e-1)//i)+1
            q = n//p
            phi = (p-1)*(q-1)
            d = gmpy2.invert(e,phi)
            m = pow(c,d,n)
            print(long_to_bytes(m))

【很多时候自顾自的生闷气,就跟会变味的酒一样,自己又喝不掉,一打开酒坛子,谁都不愿意喝。那股子酒气,就是一个人不太好的情绪,积攒多了,看上去谁都闻不着,其实谁都知道,但是只能假装闻不着,不知道。日子久了,看上去好像谁都在照顾对方,其实谁都委屈哩,很累人的。】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值