buuctf [WUSTCTF2020]dp_leaking_1s_very_d@angerous

文件下载下来,把后缀名改为txt,发现

是一个已知e,n,c,dp的rsa题

那就用python写一个来解

#已知e,n,dp,c
#dp × e= x × (p−1)+1
#dp < p−1
#x < e 
#x ∈ ( 0 , e )
#p-1=(e*dp-1)/x

import gmpy2
e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825

for x in range(1,e):
    if((e*dp-1)%x==0):
        p=(e*dp-1)//x+1
        if(n%p!=0):
            continue
        q=n//p
        phin=(p-1)*(q-1)
        d=gmpy2.invert(e, phin)      #求逆反
        m=pow(c,d,n)                 #表示c的的次方再取余n

        print('m:',m)           #十进制明文
        print('hex(m):',hex(m)[2:])  #十六进制明文
        print('flag:',bytes.fromhex(hex(m)[2:])) #十六进制转文本

 得出dp*e=x8(p-1)+1可以看这个

之所以用//是因为不能让数字太大导致无法输出,小数点对最终结果无影响

buuctf的RSA2也是这个类型的,也可以如法炮制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值