HGAME2021-week3-writeup

Crypto

LikiPrime

打开文件,注意到n巨大,无法直接分解,就安装下RsaCtfTool

把n,e转换为pem格式

然后将公钥复制进公钥文件里,根据公钥生成私钥

复制生成私钥文件

这个时候我们得到了私钥的pem格式,这个也就是说包含了d的信息,就可以把pem文件转化为n,d的信息

把d复制出来,就可以使用普通的rsa解密脚本了,这里有个小知识是,此时尽管我们得到了p和q,但是在产生n且生成公钥后,p和q就对解密没有作用了,只需n,e,d,m即可知三求四

exp

1
2
3
4
5
6
7
8
9
10
11
from libnum import *
import gmpy2
n=4642849048052035496503633704895293631217710721048480643093066273453539020606503262957979920725495980644474381582401987659483845087785158995583524801974411600660004469521606043828464398381268385741839106107679152285268052785693531737782078311412427416352729645020533101979297815795100035083401887319200662906616821028586789590684789335443762752043629342084834798459618090474753253355410561025472128675037918666523107644910740766105028826314730599018497495492862063800728778692600588195828882048829807212192836385765558385158246669780622288906919083808249111381934780442102461915714453842511870245498903113416571527386297776743000577518964642712819636358630943232264563917498926813595742655374586197861677713568434392710229546068989680236075964913194705687047171077181794254991201877951298787735833716867844575889175057579515311685026867586635553290478360204470269221020803623311502253981426403357439672206326373095909967452469101986678489532087651064918868164697149776944867269827599290237695205317934537972522935809557398527602978413852968190796168743729293895475224641537
e=65537
c=3709687551802386646797745785768157879027050609328977568885694731790584712579460465408758306613418567415962830795763454102850272567805909067742475171434530819531323376762844483425142978584670535444556910298311158785244674346185024586744190434166742125402447427024641211299910710700413830069657814167275425086366608186529488973158968024470128222042394722196376369742747012091512362855985796568473133834299704823506724715371622279556576084964319045329385472170502455939280390354138230655997516781374667410921562926248428641624886673723671977041119253922097666216435834216534775971559961023171740810001108875247411400798441332102418344668326564692867689781292248240788343422559465238855056753381648550466898132110941192653170182675007266069504079999064268167773997215580322970078352817713636962794995378965132037968244297009426849367741958926566007286341995187592351353620716142926816093473621244503025516637410519157727321213682617984888429087571356484732639348442588172026432665938014397255748542136399980171709114519127932101071316178153942329339451067510373501385994955068
d=770773725419322614736096170243691269170830105818201464773373225127401384625459747943647428742441617245401548310367176186508144018723812958663789154912211395321434435942979900771376362274565513173798151799007418357015371687876247391657674474391064746477832347190493921747024737718398589830285373667285704448235210839541392964991539252172484836691253600895417895345234673914968878595402017952065468371953229793264961110654093070865344182897907601093245813936874030965739554262217795080183921897180793596028747028738137662679597765188531565728887340986161397150246232036553519792079001163180694624897916603106343065963758602553926821994399899387763161456806939859495324306883688456099721430769144536235331619886299618985907519204331418792099350868416283322724256163197443146202212692357518249688129160250090117488224473364207648003633976797404611385404362182887064564770724540482831043005176387272197349168925019470641628096392062982237553509096120775879454378983657609664663657876869899429824195166894468110681582491514529961338691940192460421091657400961588382452823337473

m=pow(c,d,n)
print(hex(m))
m=n2s(m)
print(m)

HappyNewYear!!

打开output发现是7组e,n,c,且e相同,可以推测是低加密指数广播攻击,用普通的脚本试了下发现是堆乱码

推测7组信息并非由同一个message得来,就加个循环,排列组合,每次用三组明文求密文

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import random
from gmpy2 import invert, iroot
from libnum import *

n1=...
c1=...
n2=...
c2=...
...
... #篇幅过长省略,把output复制进来
e=3

def broadcast(n1, n2 ,n3, c1, c2, c3):
n = [n1, n2, n3]
C = [c1, c2, c3]
N = 1
for i in n:
N *= i

Ni = []
for i in n:
Ni.append(N / i)

T = []
for i in xrange(3):
if(gcd(Ni[i],n[i]) == 1):
T.append(long(invert(Ni[i], n[i])))
else:
return 0

X = 0
for i in xrange(3):
X += C[i] * Ni[i] * T[i]

m3 = X % N
m = iroot(m3, 3)
return m[0]

def main():
e = 3
n=[n1,n2,n3,n4,n5,n6,n7]
c=[c1,c2,c3,c4,c5,c6,c7]
for i in range(0,5):
for j in range(i,6):
for z in range(j,7):
m = broadcast(n[i],n[j],n[z],c[i],c[j],c[z])
print m
m=n2s(m)
print m

if __name__=="__main__":
main()

然后就在一大堆乱码中得出一点点信息

@ind3r~YOu^9ot=i7}

hgame{!f+y0u-pl4y_rem

就得到了flag


HGAME2021-week3-writeup
http://example.com/2021/03/02/HGAME2021-week3-writeup/
作者
Magnesium
发布于
2021年3月2日
许可协议