万字解析,RSA基础攻击方式(实战因数分解、共享素数、低加密指数攻击等情况)

一、RSA基础知识

RSA算法是一种非对称加密算法,对极大整数做因数分解的难度决定了RSA算法的可靠性。

1. 公钥和私钥的产生

(1)选择两个大素数p、q:
随意选择两个大的素数p和q,p不等于q。
(2)计算模数 N: N=pq
(3)计算欧拉函数 φ(N):
根据欧拉函数,求得r =φ(N) = φ ( p ) * φ ( q )= (p-1) * (q-1)
(4)选择公钥指数e:
选择一个与r(即 φ(N) )互质且小于r(即 φ(N) )的整数作为公钥指数,记为e。
(5)选择私钥指数d:
d 需要满足 d × e ≡ 1 (mod φ(N))

其中, (N,e)是公钥,(N,d)是私钥。

举个例子:
(1)选择两个大素数p、q:
p = 11 q = 13
(2)计算模数 N:
N = p × q = 11 × 13 = 143
(3)计算欧拉函数 φ(N):
φ(N) = (p - 1) × (q - 1) = 10 × 12 = 120
(4)选择公钥指数 e:
例如 e = 7
(5)选择私钥指数d:
使用扩展欧几里得算法,我们可以找到 d = 103,因为 7 × 103 ≡ 1 (mod 120)
得到: (N,e)= (143, 7)是公钥,(N,d)= (143,103)是私钥。

2. 加密过程

假设我们要加密的明文是一个 整数 M = 9
使用公钥 (e, N) = (7, 143)进行加密:
C = M e mod N = 97 mod 143

计算过程如下:
97 = 4782969
4782969 mod 143 = 12
因此,加密后的密文是 C = 12

3. 解密过程

接收到密文 C = 12 后,我们使用私钥 (d, N) = (103,143)进行解密:
M = Cd mod N = 12103 mod 143 = 9
解密后的明文是 M = 9,与原始明文一致。
(说明: 这个示例中的数字非常小,主要是为了便于理解RSA加密的原理,通常会选择非常大的素数,如2048位或更长来计算密钥和进行加密解密操作。)

二、RSA攻击产生原因

知道原理,我们就明白,RSA在一些特定的情况下,如 素数选择不当、不合适的加密操作、内容泄露等 ,就存在很多攻击方式。

三、实战——因数分解N

当N比较小时,可以分解N获得p,q,从而获得RSA的私钥。对于整数分解,可以使用factordb、yafu1、Sagemath等工具进行。

例题:
N: 30578675145816634962204467309994126955968568987449100734690153203822106214253
C:2185230269250013039761352535922862335793759116114747 1234750883538062728964508
e:65537

可以看出N比较小,可以分解因数。
factordb分解N结果如下:
在这里插入图片描述使用yafu分解得到p、q(如果遇到N特别大的情况,记得新建txt):
在这里插入图片描述
python脚本如下(需要安装Crypto、gmpy2依赖库,后续实战题也是):

from Crypto.Util.number import *
from gmpy2 import *
p = 8767867843568934765983476584376578389
q = 3487583947589437589237958723892346254777
c = 21852302692500130397613525359228623357937591161147471234750883538062728964508 
e = 65537

d = invert(e,(p-1)*(q-1))
m = powmod(c,d,p*q)

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

四、实战——共享素数pq

当同时生成了多个公钥,如果生成的公钥中有两组N使用了相同的素数,而这两组N不互素,那我们可以通过求这两组N的最大公因数得到p、q,从而获得RSA的私钥。

例题:
e: 65537
N1:97651955426214592033572365773920057508427271716707728935577093505679682172372037636450110482557482581706749399826008020235313113944314376784907620141813540662534339234459496768240479220230957160400392913463409022293150429520768318670419503933186212191126307407839258074528684084840185308927331947537145829447
N2:66614608752278705185634904394365361979042404918604096433974094458632279000060400427645038515243709686328401390645112697979593615158483692603354348148482259753616268091570444012203646513399123035447707361637792128736541860728977309005359893376233152775475579396612879271884234088653699303606533505374905232923
C1:63953261435394891069612549636244603374173902686957436699829372333004288757335171873681401446375646490812908682109590243996379898870002800896829966763855784343173371142195534847739577115446177220108666069599165923313053697108515804761639807236996792227009426406166247412285289649024825203381481266356972774150
C2:57194972314389051543512820205703581413440756041185322107796772858205215016985575901911128530044596380489776006585803175505500161134431388478575594371310142237309980755948653414728132043884818377338689153219237884062208507665330097950793748413372319469773142224317762978585059400442666153359320918649028613087

求解N1、N2的最大公因数,python脚本如下:

import math

def find_gcd(n1, n2):
    return math.gcd(n1, n2)
n1 = 97651955426214592033572365773920057508427271716707728935577093505679682172372037636450110482557482581706749399826008020235313113944314376784907620141813540662534339234459496768240479220230957160400392913463409022293150429520768318670419503933186212191126307407839258074528684084840185308927331947537145829447
n2 = 66614608752278705185634904394365361979042404918604096433974094458632279000060400427645038515243709686328401390645112697979593615158483692603354348148482259753616268091570444012203646513399123035447707361637792128736541860728977309005359893376233152775475579396612879271884234088653699303606533505374905232923

gcd_result = find_gcd(n1, n2)
print(f"{n1}{n2} 的最大公因数是: {gcd_result}")

得到N1、N2的最大公因数为 :9662274146235452611486011387634788609876462168648034337042073986486515802989637840834001788018559826897806133626674529519447810890788145032423417594968101
能求出N1、N2的最大公因数,说明N1和N2用了相同的素数。
所以现在要做的就是对N1、N2进行分解,然后再求解明文,python脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

n1 = 97651955426214592033572365773920057508427271716707728935577093505679682172372037636450110482557482581706749399826008020235313113944314376784907620141813540662534339234459496768240479220230957160400392913463409022293150429520768318670419503933186212191126307407839258074528684084840185308927331947537145829447
n2 = 66614608752278705185634904394365361979042404918604096433974094458632279000060400427645038515243709686328401390645112697979593615158483692603354348148482259753616268091570444012203646513399123035447707361637792128736541860728977309005359893376233152775475579396612879271884234088653699303606533505374905232923
c1 = 63953261435394891069612549636244603374173902686957436699829372333004288757335171873681401446375646490812908682109590243996379898870002800896829966763855784343173371142195534847739577115446177220108666069599165923313053697108515804761639807236996792227009426406166247412285289649024825203381481266356972774150
c2 = 57194972314389051543512820205703581413440756041185322107796772858205215016985575901911128530044596380489776006585803175505500161134431388478575594371310142237309980755948653414728132043884818377338689153219237884062208507665330097950793748413372319469773142224317762978585059400442666153359320918649028613087
e = 65537

p = gcd(n1,n2)
q = n1 // p

d = invert(e,(p-1)*(q-1))
m = powmod(c1,d,n1)

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

五、实战——低加密指数攻击

是指如果公钥中的e获得明文m足够小,以至于加密时得到的值 me 小于N,这样再对N取模的结果不变,则可以直接对密文进行开根操作,从而得到明文。

例题:
N: 107076603604182223826851170174434892978582719385404713147138224009105723501181029360030492376047404346624280253944730481693452056018928685630455710616497238474110308024028380957786873219663155718219933562756918968811833547088840811225526139569594679161346440625466263114471780279999350745826806399205841494983
C:286156272900301068872474009457602197919224290322169618419358936750640270928572593974677954855339895514309134458578485770973560277045835207520097
e:3

显然, 题目给的e很小,python脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

c = 286156272900301068872474009457602197919224290322169618419358936750640270928572593974677954855339895514309134458578485770973560277045835207520097
e = 3

m = iroot(c,e)[0]

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

六、实战——低加密指数攻击(2)

当在生成p,q时如果选取的素数不当,造成两个素数的值过于接近,那么可以尝试对其进行分解。对N进行开根号操作,则有
p < N \sqrt N N < q
所以我们爆破 N \sqrt N N 附近的值,就可以枚举得到p或者q,从而完成N的分解,生成私钥。

例题:
e: 65537
N:145361143088137368699796462320730855062463020779323698477792694803159106138141725011423469347088987542460282148194800425189859183047413175832331798718208202679468004703784684748415142640766657055115592904301293708676459749413933645198729424559630273925417009918020260501161121867947943985644430805278568295931
C:104072567009158954346955086782848984523522473254904683269880460911274339957079607180791174632391279966818046631608200628314427997654355105822835052674066382450449843393075054609830248214784738635695966418342514905315646190408258943686848288331468068172698190136731641280141170779816909529774013855935597383547

当我们拿到这样的题,没有明显提示,可以试着考虑p、q过近的情况,用该情况的python脚本爆破一下:

from Crypto.Util.number import *
from gmpy2 import *

n = 145361143088137368699796462320730855062463020779323698477792694803159106138141725011423469347088987542460282148194800425189859183047413175832331798718208202679468004703784684748415142640766657055115592904301293708676459749413933645198729424559630273925417009918020260501161121867947943985644430805278568295931
c = 104072567009158954346955086782848984523522473254904683269880460911274339957079607180791174632391279966818046631608200628314427997654355105822835052674066382450449843393075054609830248214784738635695966418342514905315646190408258943686848288331468068172698190136731641280141170779816909529774013855935597383547
e = 65537

sqr = iroot (n,2)[0]
for i in range(10000):
    if n %(sqr + i) == 0:
        p = sqr + i
        q = n // p
        break

d = invert(e,(p-1)*(q-1))
m = powmod(c,d,n)


print(long_to_bytes(m))

得到flag:
在这里插入图片描述

七、实战——共模攻击

例题:
e1: 65537
e2: 123123
n: 85999854958767959554784116688332018521455063421943587755368471383304578228792567660774571877905741286056067289890541571091855908678849916185854888968821607814818640208047279995507161148266054523381304011525647728747707818431001911666953029766636074021720647966519758884392967535424552761111268097116111462901
c1:9433143107026358064391515635964202417308876133890005758988889931862218290781054744707379577326012522458662286597332929605122824536562485647300105455627793954094295846653031256284325264604759686045656307275756794396697873867363469305371738498084775601501173822178589694803568115145678280724873047855524442385
c2:42446857502457030112230146270021298111025798717943720761082326671733270594681259539969045440718063967428503620991186621408906241321633523187251528315149722016740488445095537099063668916419127271324939716734085315365160642297644233070839887445518800006824122942167475395816587702204864436693519262350299925121
给了两组公钥C1、C2和密文e1、e2,但是N是相同的,同时e1、e2互为素数。因此,使用共模攻击,在不对N进行分解的情况下,进行对明文的解密。

python脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

e1 = 65537
e2 = 123123
n = 85999854958767959554784116688332018521455063421943587755368471383304578228792567660774571877905741286056067289890541571091855908678849916185854888968821607814818640208047279995507161148266054523381304011525647728747707818431001911666953029766636074021720647966519758884392967535424552761111268097116111462901
c1 = 9433143107026358064391515635964202417308876133890005758988889931862218290781054744707379577326012522458662286597332929605122824536562485647300105455627793954094295846653031256284325264604759686045656307275756794396697873867363469305371738498084775601501173822178589694803568115145678280724873047855524442385
c2 = 42446857502457030112230146270021298111025798717943720761082326671733270594681259539969045440718063967428503620991186621408906241321633523187251528315149722016740488445095537099063668916419127271324939716734085315365160642297644233070839887445518800006824122942167475395816587702204864436693519262350299925121

s = gcdext(e1,e2)
s1 = s[1]
s2 = s[2]

m = powmod(c1,s1,n) * powmod(c2,s2,n) % n

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

八、实战——低加密指数广播攻击

当使用多组公钥加密同一消息,且公钥中加密指数e相同时,就可能受到低加密指数广播攻击。

例题:
e: 66
N1:119121769301518368845794718919671993654866733452500635654897878290134654053525326323431078337969969799019267359311630307693231652437019657271070808881061234914792573940209704431930893007130218784789129628118174107530365963924713378836917676748173639617016078698196855902649715186446119049632882034064426307961
c1:65809670364005660919487930275712763981462574482844456704463641508675030596875121266268442889621086029848274337434417261197718575526373292499067042264634379254464845434162152933896113724853720502244098952049664997504481260560197503615640455874926744252021208987009450769588765905545554721135156365408354127806
N2:61566186989108648087416300713362112278899764336693876058459160266013125711319287023130470479677492361897176386933378510296253217497637077073380801285351720869599526467374766145998153803504733849848604084634651491161784374455431755730479983664183758338753000194705214689982392319657046639209576835502147667037
c2:18115640205116501705317897825685529616909607082926385394483386354114757190297813816634024391310034998634363199107263855395213222666209246729706790489666870667858157971452889316287713441243954970519480288407304588221367033667123438099684005390552527841793685576357398155728428068684443438517466992583270786127
N3:49620601251587487125794843250068355033366769115263317289571926701388354523775712535979072271377271193974631440599171766325666313148513015791734100817069816300041692142266535982235676202572289636401488831577138246100726048967727040512044104774134629062544550558359813957976997743249501859251552702735064713687
c3:20364551273681999294192219339422116302034809693463183300482896653538283331993131969988691606265882556683096226676587592788170379969499383217301366185026531161375199684493173814963347571110673161762110717226798673655139195202698236793103775569353384039792555128423824292553968745259900764497340831105893270668
N4:133768952546673974479267370043541821144327252413845057783412528835180467846794140834703340900450314588506064435986442748604490312840370944318831808038247604353142259774616789531310532099928688408187901346284844605463451751550642385234492519392161741592575670083174919697609061113010796634206284575928757770347
c4:22335147582261003096647361522544076689364215203577454506488628401661580234233487251113839217854903668779299757152861854671534567147471797316820888992633912660481204658071146602886247900634407701930940651893906501617828267768494421662988585157809528901989990526581772462692969725469920335864514415298683981152
N5:104238024627494572746286964408730592545438306156311797513852804744729437956789203459026451862359528868190073408381414599237366462763241253878521105956224668414556141866393372950736873591172081402165238904932429122534093530878197642654777864463461868631230091763766134406081081720779921003747961997853491818709
c5:61107680391468684099981865276084215683172351113581670204727453862376840773256630839617142751881760857118348248250665317785917421351743397747894492411488165649401344879494773021769753591034395672465464320101652438687007539489378513821420800168510776217853333899011972317527520705236204176156830739081757405010
N6:118093066310605305095178937425517218630920226424744215661148532092308033934450073432943193635177662130252180103285721213804150321735225466812961622185616533145516398760950723892924696182721299397022483621950837139563238753686038378878896091768848068910135093028294780235384684673963857093300627549709837724191
c6:101256774269533055751457908208739377897424415487989206153587587300686603196557467291720330319232901633692785986681754036193235741811711502795701089320073392059949682466544065711958098750432374898558703333440618699807232864181819519679629167853668660602661341767124570492408045291007778414318130631983777295722
N7:117266185117654060034588324842366454222593927099393980357544774885629794379293166947229056918034459043108797074800162507024079391634502468534298624692449903107493118323020446890562744571191659344011645864382773946531469367984674369644899983010063210039853704185508764560001673741477659408982947064250518468251
c7:21894778019803458880260502198065610444404240072805403208023426906088005779594929836443213559388796713650945356366966043756862672829855657911990319072200008974506146871357573453019048449580079826767546217579688605917001867071164255859862228831932900353755873078336344643599953154397168889370495902677409294153
N8:99847214607089521961572435869957506429243606231877563380090692185420163672773289159042830799683260860597767443996073308175724597182454633588936213254523487111523733480984498586740358607988160025505687559762411862688601742397266945003398123269294496360100900034452611602146601714399455590585410132690396673369
c8:11128692723492689091233850419200963897271177985178577230436424149628046051146025178276383119267304777164785849951881090840591723497899208506838095610670693372018592133149773642812004657103063248374199581071604408292558846603838509738685590699272289726570262682986682351416702749398587242245473894462138900648
N9:73427226276805128656380869285386076721624609211443253475771428129504719457080180710705115744294619063551381264408504585408453508098823007044451551756211573562886310458270583742465979942941865777506724593733211095696183935690743247534548446509454942543803005250835909564142934138252786381937066184736196312879
c9:60193454951754852266094357956076086266071986040245653496529985198812436356863824995533097435342514985019627989807883105986263640682220256055428754363731882409970562687108383307540077970131766447280258179403586275956059172183226613848213900224857274285495001205557394336770529098104967590355473696826791159828
N10:99650442092528521150438911689808375993056822587606174829817567886601559468699368030195401941419824519727962816960977430480509904789178542213483386082107556343628416294902342864312889447653789084402767394237032107269596219826822529277688614898127656366069731819304375099356344677466185988432876228367727625953
c10:90419774897115225091366412014190084386457096921784011494379232133660413968111145130899089066669099521330755985696967486931277095415375171113368395860214365412786048972643171579220518548850903517117393998100848799427493429304884036350416671209777072844176863411890909720103357069783802064257545060602175751149
题目中的e比较小,且用同一个e、不同的n进行加密。因此为低解密指数广播攻击。

python脚本如下(伪代码,需要读者手动填写数据):

from Crypto.Util.number import *
from gmpy2 import *

e = 66
n_list =[]  #篇幅有限,读者自填
c_list = []  #篇幅有限,读者自填


N = 1
for n in n_list:
    N *= n 
M_list = []
for n in n_list:
    M_list.append(N//n)
t_list = []
for i in range(len(n_list)):
    t_list.append( invert(M_list[i],n_list[i]) )
summary = 0
for i in range(len(n_list)):
   summary = (summary + c_list[i] * t_list[i] * M_list[i]) %N
m = iroot(summary,e)[0]

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

九、实战——Wiener攻击(连分数攻击)

还记得欧拉函数 φ(N): = φ ( p ) * φ ( q )= (p-1) * (q-1) = N - ( p + q) +1
pq远大于p+q ,所以可推出:
φ(N) ≈ \approx N 2
因为: d × e ≡ 1 (mod φ(N))
可以演变为:ed-1 = kφ(N)
所以上述等式可以演变为:
e / N ≈ \approx k / d
对于等式左边的数,将其展开为连分数,遍历每一组近似解,就有可能找到等式右边的数。
设其中一组值为(d , k),则有:
φ(N) = ed -1 / K,
结合上述欧拉函数得:
N - ( p + q) +1 = ed -1 / K
结合上述演变得:
N - ( p + q) +1 = φ(N)
转换得:
p +q = N -φ(N) + 1
这样就可以计算出(p,q),通过验算p * q 是否等于N,可以验证 d 是否正确。
当然,这些数是有范围的:
q < p <2q&d < 1 3 \frac{1}{3} 31N^ 1 4 \frac{1}{4} 41

例题:
N:107820827895585003318160075938897995007771726056433792260306646508197614885172767297860713228269372581388675047053081480259665212535577590049118106812907146179205072239202195537073770739125675017748544703407492971258729480561817875290145208304790655494183395710284259904924825216130329385053835448236320458029
e:89522445598733261357901825227079909455833500144157754746488199484282356592752881911539250096606592386991876444930791131091191645729189063282738620740478951554538143425376616935272546647795666042057430492362510853442637374299569781152667997525016908056524464220471765404748627571107144931587704935347192130747
C:78801382956240362099621219179273906545911347424992980739524362075033074146925440259224069602152252908929563712955805750439181009392136772144489054854771121558867343856732335266122392680114047445081029206150709456363766540038033883249133391765001168831795492173604819457970972375924518104751091565565160890627
可以发现N(1024bits)和e(1023bits)比较近。因此,为Wiener攻击。

python脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

class ContinuedFraction():
    def __init__(self,numerator,denumerator):
        self.numberlist = []
        self.fractionnlist = []
        self.GenerateNumberList(numerator,denumerator)
        self.GenerateFractionList()
    def GenerateNumberList(self,numerator,denumerator):
        while numerator != 1:
            quotient = numerator // denumerator
            remainder = numerator % denumerator
            self.numberlist.append(quotient)
            numerator = denumerator
            denumerator = remainder
    def GenerateFractionList(self):
        self.fractionnlist.append([self.numberlist[0],1])
        for i in range(1,len(self.numberlist)):
            numerator = self.numberlist[i]
            denumerator = 1
            for j in range(i):
                temp = numerator
                numerator = denumerator + numerator * self.numberlist[i-j-1]
                denumerator = temp
            self.fractionnlist.append([numerator,denumerator])

n = 107820827895585003318160075938897995007771726056433792260306646508197614885172767297860713228269372581388675047053081480259665212535577590049118106812907146179205072239202195537073770739125675017748544703407492971258729480561817875290145208304790655494183395710284259904924825216130329385053835448236320458029
e = 89522445598733261357901825227079909455833500144157754746488199484282356592752881911539250096606592386991876444930791131091191645729189063282738620740478951554538143425376616935272546647795666042057430492362510853442637374299569781152667997525016908056524464220471765404748627571107144931587704935347192130747
c = 78801382956240362099621219179273906545911347424992980739524362075033074146925440259224069602152252908929563712955805750439181009392136772144489054854771121558867343856732335266122392680114047445081029206150709456363766540038033883249133391765001168831795492173604819457970972375924518104751091565565160890627
a = ContinuedFraction(e,n)
for k,d in a.fractionnlist:
    s = long_to_bytes(powmod(c,d,n))
    try:
        print(s.decode())
    except Exception:
        pass

得到flag:
在这里插入图片描述

十、实战——Rabin攻击

新的加解密方法,与RSA类似但这个函数不是单射,一个密文能解出4个明文。
取两个大素数(p,q)满足 p≡q≡3(mod4)

例题:
p:7031743260418711566739098073564107978890224227121460343193226960817186184383270087476418117720536015735507487887746435223674467305567985714768646881875443
q:10518469826290824137244071184647466795966232103440910166409726732405364202243942197965652168418478497573810469491020503654343864609715458810525321440541527
e:2
c:135258457853291620572721004024920015499815847845811584839142576985971544135277241259156609029562372968515417947459821107108690546144324

如果我们直接用【五、实战——低加密指数攻击】的方法,提示逆元不存在。
其实就是因为这里p≡q≡3(mod4)
python脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

p = 7031743260418711566739098073564107978890224227121460343193226960817186184383270087476418117720536015735507487887746435223674467305567985714768646881875443
q = 10518469826290824137244071184647466795966232103440910166409726732405364202243942197965652168418478497573810469491020503654343864609715458810525321440541527
c = 135258457853291620572721004024920015499815847845811584839142576985971544135277241259156609029562372968515417947459821107108690546144324
n = p * q


c1 = powmod(c,(p+1)//4,p)
c2 = powmod(c,(q+1)//4,q)
cp1 = p - c1
cp2 = q- c2

t1 = invert(p,q)
t2 = invert(q,p)

m1 = (q*c1*c2 + p*c2*t1) %n
m2 = (q*c1*t2 + p*cp2*t1) %n
m3 = (q*cp1*t2 + p*c2*t1) %n
m4 = (q*cp1*t2 + p*cp2*t1) %n


print(long_to_bytes(m1))
print(long_to_bytes(m2))
print(long_to_bytes(m3))
print(long_to_bytes(m4))

得到m2,为我们要的flag:
在这里插入图片描述

十一、实战—— d p d^p dp & d q d^q dq 泄露攻击3

d p d^p dp = dmod(p-1)
d q d^q dq = dmod(q-1)
当我们知道了 d p d^p dp d q d^q dq 、p、q、c,在不知道e的情况下,也可以求解明文。
即: m = c d c^d cd = ((m2 - m1)p-1modq)p+m1

例题:
p:6762937895135782926498763748093500903517957693478959793109585172135724156416698703948639641002011491236411054468661958154956773034728365975295624983318593
q:9193579688549854152313077351457183988280601300952375492939221862190817097455689647173529878946824165591846181191684720253213363033539478673916832006260847
dp:3929992247321897114638537721097570300259118251350462927971961686870829989227386430498303582931974188206240449088122932249354501230932614047058198903666003
dq:1864062432328528120278118139529143684544215949938270947050466296078351090420149049047389669615997006236296696669206927413888259932213494195659368579021159
c:57769273698170829656070019656907607391081443998015079532480224261138522620568893028987160495644989276704273020863666860917484272747591102208027595648118506467658165959104458476682674059470509189596191797569735975867636687469358456406609684923286750807532060136474002195763657930050756412002467206621652548859
题目没给e,但给了p、q 、 d p d^p dp d q d^q dq 。因此为 d p d^p dp & d q d^q dq 泄露攻击。

脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

p = 6762937895135782926498763748093500903517957693478959793109585172135724156416698703948639641002011491236411054468661958154956773034728365975295624983318593
q = 9193579688549854152313077351457183988280601300952375492939221862190817097455689647173529878946824165591846181191684720253213363033539478673916832006260847
dp = 3929992247321897114638537721097570300259118251350462927971961686870829989227386430498303582931974188206240449088122932249354501230932614047058198903666003
dq = 1864062432328528120278118139529143684544215949938270947050466296078351090420149049047389669615997006236296696669206927413888259932213494195659368579021159
c = 57769273698170829656070019656907607391081443998015079532480224261138522620568893028987160495644989276704273020863666860917484272747591102208027595648118506467658165959104458476682674059470509189596191797569735975867636687469358456406609684923286750807532060136474002195763657930050756412002467206621652548859

invp = invert(p,q)
m1 = powmod(c,dp,p)
m2 = powmod(c,dq,q)
m = (((m2 -m1) * invp) % q) * p + m1

print(long_to_bytes(m))

得到flag:
在这里插入图片描述

十二、实战—— d p d^p dp 泄露攻击

d p d^p dp d q d^q dq 其中之一发生泄露,同时我们也知道公钥,则可能从中得到d。

例题:
dp:9687292937908072147579049250988081775855539044923311720198690573474287641454365358703521064711717420735768778834437976970203559182947746549749603187487505
e: 65537
n:114860131475576868044469322177756019321092670748802897838634438431105851516102018826069834693268285578435739849271988881447945927402667447403384833500315278714996147878560539297329569185401005035910105999777451901595072160624418225507740490655905809156214221980600288418576937959820118735961738522289866521291
c:70797723923120982204288411400549608443905082052553090178532558315985576492738142194219444511546956350978951798116112179012673420261126453679586759941468235108491465752344586472229099273690662486690431877021814800209593236424267788908919445045306451823812524528176545903304014054612347105799277774774383749101
题目给了公钥,还给了 d p d^p dp ,同时e也比较小 。因此为 d p d^p dp 泄露攻击。

脚本如下:

from Crypto.Util.number import *
from gmpy2 import *

dp = 9687292937908072147579049250988081775855539044923311720198690573474287641454365358703521064711717420735768778834437976970203559182947746549749603187487505
e = 65537
n = 114860131475576868044469322177756019321092670748802897838634438431105851516102018826069834693268285578435739849271988881447945927402667447403384833500315278714996147878560539297329569185401005035910105999777451901595072160624418225507740490655905809156214221980600288418576937959820118735961738522289866521291
c = 70797723923120982204288411400549608443905082052553090178532558315985576492738142194219444511546956350978951798116112179012673420261126453679586759941468235108491465752344586472229099273690662486690431877021814800209593236424267788908919445045306451823812524528176545903304014054612347105799277774774383749101

for x in range(1,e) :
    if (e *dp -1) %x == 0:
        p =(e * dp -1) // x+1
        if n%p == 0:
            q = n // p
            d = invert(e,(p-1) * (q-1))
            m = powmod(c,d,n)
            print(long_to_bytes(m))



得到flag:
在这里插入图片描述

参考文献


  1. 大整数因数分解工具——yafu用法 ↩︎

  2. markdown数学公式符号 ↩︎

  3. markdown打出各种数学符号和数学公式 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值