题目:
('n=', '0x683fe30746a91545a45225e063e8dc64d26dbf98c75658a38a7c9dfd16dd38236c7aae7de5cbbf67056c9c57817fd3da79dc4955217f43caefde3b56a46acf5dL',
'e=', '0x7',
'c=', '0x673c72ace143441c07cba491074163c003f1a550eab56b1255e5ea9fa2bbd68fd6a9ccb48db9fd66d5dfc6a55c79cad3d9de53f700a1e3c2a29731dc56ba43cdL')
('n=', '0xa39292e6ad271bb6a2d1345940dfab8001a53d28bc7468f285d2873d784004c2653549c589dae91c6d8238977ff1c4bea4f17d424a0fc4d5587661cc7dde3a77L',
'e=', '0x7',
'c=', '0x6111357d180d966a495f38566ebe4ea51fa0d54159b22bbd443cde9387687d87c08638483b39221883453a5ad09f6a0e3726b214e8e333037d178a3d0f125343L')
('n=', '0x52c32366d84d34564a5fdc1650fc401c41ad2a63a2d6ef57c32c7887bb25da9d42c0acfb887c6334c938839c9a43aca93b2c7468915d1846576f92c342046d1fL',
'e=', '0x7',
'c=', '0x26cd2225c0229b6a3f1d1d685e53d114aa3d792737d040fbc14189336ac12fb780872792b0c0b259847badffd1427897ede0d60247aa5e79633f27ccb43e7cc2L')
解题思路:
- 加密指数e非常小,一般拿到的是多组n和c,且只有一个e且模数n不同,但使用相同的加密指数e进行多次加密
- 然后CRT求多组模数两两互质的同余方程组(不互素情况参考进阶RSA广播攻击-CRT不互素?)
解答:
import binascii,gmpy2
n = [
0x683fe30746a91545a45225e063e8dc64d26dbf98c75658a38a7c9dfd16dd38236c7aae7de5cbbf67056c9c57817fd3da79dc4955217f43caefde3b56a46acf5d,
0xa39292e6ad271bb6a2d1345940dfab8001a53d28bc7468f285d2873d784004c2653549c589dae91c6d8238977ff1c4bea4f17d424a0fc4d5587661cc7dde3a77,
0x52c32366d84d34564a5fdc1650fc401c41ad2a63a2d6ef57c32c7887bb25da9d42c0acfb887c6334c938839c9a43aca93b2c7468915d1846576f92c342046d1f
]
c = [
0x673c72ace143441c07cba491074163c003f1a550eab56b1255e5ea9fa2bbd68fd6a9ccb48db9fd66d5dfc6a55c79cad3d9de53f700a1e3c2a29731dc56ba43cd,
0x6111357d180d966a495f38566ebe4ea51fa0d54159b22bbd443cde9387687d87c08638483b39221883453a5ad09f6a0e3726b214e8e333037d178a3d0f125343,
0x26cd2225c0229b6a3f1d1d685e53d114aa3d792737d040fbc14189336ac12fb780872792b0c0b259847badffd1427897ede0d60247aa5e79633f27ccb43e7cc2
]
def CRT(mi, ai):
assert(reduce(gmpy2.gcd,mi)==1)
assert (isinstance(mi, list) and isinstance(ai, list))
M = reduce(lambda x, y: x * y, mi)
ai_ti_Mi = [a * (M / m) * gmpy2.invert(M / m, m) for (m, a) in zip(mi, ai)]
return reduce(lambda x, y: x + y, ai_ti_Mi) % M
e=0x7
m=gmpy2.iroot(CRT(n, c), e)[0]
print(binascii.unhexlify(hex(m)[2:].strip("L")))
#flag is : testflag
题目:
n1 = 15155834512274272214023086908197336756053030242323048048512131680949741780299147739642915275652361208126932446440351058891478042858367410383038003646724877904586542918017377162655592508460664015520802259851733191541675998796977690625295282942487921358909287151891024014877346470774030618403239619473160116278194168652577809272534421739253899557104677104226574616639904574493424733183128587308159599813172995669302313437832700325084051476508569976017575025882273798141537465703201611158966576900748339845393511942859359762627565239827436817587889028229629219758444364576775816395068895690818282079757217830310515978127
c1 = 5494450691753612919737853915132855834096765605332015454640361032239132922012580874164314559884231834880509275803308491515200542216921855164502433282605157652587467862927015599896098323188736626786240688376765596607692289464553811726988171583144094764228322352598666387363126670431878708836399453243810268550215586416145954491987218058298118856157943192348712211081966817634248749541495202512318939478632136696161770495966945450638932386439853171097951854773848427327967005395447258238907517328462920672983843546368459675108565386048378949489538739601026072001299388754859205758045323903197238347844028607154218472306
n2 = 18842210020214893447278433763859917441673856882600914930106127408785094682894162560294377942902234973017097657819902883509747214618845368773090881368216216746436442141249517379544322252470231735357590551576267935271044692518720989544809387378449867873587634822735041718725775776009414593903385600936076275031894097065886553873609364053567942574441788746500339227794273331961537553598880986317346041994268899775773299522416638100324889325019104983092439964265139187515608224052770912315103299888397137605504388974375829966791573157027563210824142575469275327561579105886925938874788629638257034860660599571368175798461
c2 = 15910997684628836933496607822222338379406645512019432640918604219624447480532985768023714301290983608350871071716130518274600127858844679179194328069454410794891098307126961755968252512736349726488491987677072080227591095987989240857878550269813251096259256898342134501777151894253304947523375168108765477110299014857498094854675908649091364944658844775926024330884901188084046387555453089293651895591930508974990924414046626876421817769164530689640853992733514311151493031551639303253742905571602694843664756463426780635078828796848976379807092185402676057091126978898094714606653991907268150256457170921178656805579
n3 = 22226464873913386757133247086672623015441322463594301399173110257747012438384755298599579275470179177267971599252692901999457999425708376414098507189061197532848474420980635398317992526058501486595817545466391929028016230234872629151008606442578311078760628628631854292548829892677873370666324611373525794396390196365594857629571891566579209515557229327990901478393972604155740157773509050015850902188908735565008972678769316888808907105766444447172006423589415974903633898473609776222316128128663502376892785333075688374577344783477685782127745369509949692261461972928113463408930650442450649560710973027693882523477
c3 = 21108131787225755203618640254567084615589153124310726690274308424429723230473335893868276636623072829331045475826942731683413524092293553789570482144460927939891748979823308554622500275336062194855532746429393810887923652148687071388960360136186955257847070345952553820737048718319036485708755833021599297940989696082994353661789743040224669874599312843912069146579704045641485314755494706946042797137677502973218481668477064622319845680167436672625659231570816551826036490125795302674890570995611318268338711707381729921002213050069264691953697777498361151710349062417390509298962684853952003380381791557565960351045
(e1=e2=e3) #e未知
解答:
import gmpy2
from functools import reduce
from Crypto.Util.number import long_to_bytes
def CRT(items):
N = reduce(lambda x, y: x * y, (i[1] for i in items))
result = 0
for a, n in items:
m = N // n
d, r, s = gmpy2.gcdext(n, m)
if d != 1:
raise Exception("Input not pairwise co-prime") #逆元不存在
result += a * s * m
return result % N, N
# e, n, c
e = 1 #e未知
n=[15155834512274272214023086908197336756053030242323048048512131680949741780299147739642915275652361208126932446440351058891478042858367410383038003646724877904586542918017377162655592508460664015520802259851733191541675998796977690625295282942487921358909287151891024014877346470774030618403239619473160116278194168652577809272534421739253899557104677104226574616639904574493424733183128587308159599813172995669302313437832700325084051476508569976017575025882273798141537465703201611158966576900748339845393511942859359762627565239827436817587889028229629219758444364576775816395068895690818282079757217830310515978127,
18842210020214893447278433763859917441673856882600914930106127408785094682894162560294377942902234973017097657819902883509747214618845368773090881368216216746436442141249517379544322252470231735357590551576267935271044692518720989544809387378449867873587634822735041718725775776009414593903385600936076275031894097065886553873609364053567942574441788746500339227794273331961537553598880986317346041994268899775773299522416638100324889325019104983092439964265139187515608224052770912315103299888397137605504388974375829966791573157027563210824142575469275327561579105886925938874788629638257034860660599571368175798461,
22226464873913386757133247086672623015441322463594301399173110257747012438384755298599579275470179177267971599252692901999457999425708376414098507189061197532848474420980635398317992526058501486595817545466391929028016230234872629151008606442578311078760628628631854292548829892677873370666324611373525794396390196365594857629571891566579209515557229327990901478393972604155740157773509050015850902188908735565008972678769316888808907105766444447172006423589415974903633898473609776222316128128663502376892785333075688374577344783477685782127745369509949692261461972928113463408930650442450649560710973027693882523477
]
c=[5494450691753612919737853915132855834096765605332015454640361032239132922012580874164314559884231834880509275803308491515200542216921855164502433282605157652587467862927015599896098323188736626786240688376765596607692289464553811726988171583144094764228322352598666387363126670431878708836399453243810268550215586416145954491987218058298118856157943192348712211081966817634248749541495202512318939478632136696161770495966945450638932386439853171097951854773848427327967005395447258238907517328462920672983843546368459675108565386048378949489538739601026072001299388754859205758045323903197238347844028607154218472306
,15910997684628836933496607822222338379406645512019432640918604219624447480532985768023714301290983608350871071716130518274600127858844679179194328069454410794891098307126961755968252512736349726488491987677072080227591095987989240857878550269813251096259256898342134501777151894253304947523375168108765477110299014857498094854675908649091364944658844775926024330884901188084046387555453089293651895591930508974990924414046626876421817769164530689640853992733514311151493031551639303253742905571602694843664756463426780635078828796848976379807092185402676057091126978898094714606653991907268150256457170921178656805579,
21108131787225755203618640254567084615589153124310726690274308424429723230473335893868276636623072829331045475826942731683413524092293553789570482144460927939891748979823308554622500275336062194855532746429393810887923652148687071388960360136186955257847070345952553820737048718319036485708755833021599297940989696082994353661789743040224669874599312843912069146579704045641485314755494706946042797137677502973218481668477064622319845680167436672625659231570816551826036490125795302674890570995611318268338711707381729921002213050069264691953697777498361151710349062417390509298962684853952003380381791557565960351045
]
data = list(zip(c, n))
x, n = CRT(data)
for i in range(1,30): #遍历e的值
e = i
m = gmpy2.iroot(gmpy2.mpz(x), e)[0]
print(long_to_bytes(m))
#flag{7189cb408174df02ebeae57c4d3ac0e0}