记一次RSA的学习(1)

目录

dp泄露

共用素数


关于rsa的基本原理,一些运算法则可以参考 RSA0-1,网络安全爱好者中心-神域博客网 (godyu.com)

有许多模运算的法则需要知道,方便原理推导。

dp泄露

通常已知n,c,e,dp

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657

c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

原理介绍

 dp=d mod (p-1)     // 这里可以看出dp<p-1

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

得出 k(p-1)+dp*e =de  

de = 1 (mod phi)

得出 de = 1 + h(p-1)(q-1)

结合两个式子可以推导出

dp*e = 1+ (p-1)[h(q-1)-k]  //1相对于其他数太小,可以忽略

dp<p-1,所以 0<h(p-1)(q-1)<e。

因此,我们用 i 遍历(0,e),找到一个 i 满足 (dpe-1)%i =0 ,此时 (dpe-1)%i的值 就是 p-1。由此可以编写脚本:

from Crypto.Util.number import *
import gmpy2

for i in range(1,e):
    if (dp*e-1) % i == 0:   
        if n % ((dp*e-1)// i+1) == 0:    #n//p==0,即p*q=n
            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))ssh       
实例解决

见buuctf平台Rsa2,运行拿到flag

from Crypto.Util.number import *
import gmpy2
e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657

c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

for i in range(1,e):
    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))

共用素数

通常已知n1,n2,c1,c2,e

n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
e = 65537
 原理介绍

m是相同的,我们通过求n1,n2的最大公约数可以求出p,进而可以求出q1,q2。通常使用一组即可解出flag。也有的题目m不相同,这时求一组会得到 一半flag,再利用另外一组即可求出完整的flag。

import libnum

p=gmpy2.gcd(n1,n2)  #求最大公约数,即p
q1=n1//p

phi=(q1-1)*(p-1)
d=gmpy2.invert(e,phi)

m=pow(c1,d,n1)
print(libnum.n2s(int(m)))
实例解决

见nssctf平台LitCTF2024 common_primes

给出一个加密脚本,我们利用上面脚本解密,运行拿到flag

import libnum

n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
e = 65537

p=gmpy2.gcd(n1,n2)
q1=n1//p

phi=(q1-1)*(p-1)
d=gmpy2.invert(e,phi)

m=pow(c1,d,n1)
print(libnum.n2s(int(m)))

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值