HSCTF-部分writeup

1.XORed

根據題意,我們很容易發現這是一個異或加密,根據異或的運算法則,我們很容易解密,下面是我們的writeup

Key1 = 0x5dcec311ab1a88ff66b69ef46d4aba1aee814fe00a4342055c146533
Key13 = 0x9a13ea39f27a12000e083a860f1bd26e4a126e68965cc48bee3fa11b
Key235 = 0x557ce6335808f3b812ce31c7230ddea9fb32bbaeaf8f0d4a540b4f05
Key145 = 0x7b33428eb14e4b54f2f4a3acaeab1c2733e4ab6bebc68436177128eb
Key34 = 0x996e59a867c171397fc8342b5f9a61d90bda51403ff6326303cb865a
FlagKey12345= 0x306d34c5b6dda0f53c7a0f5a2ce4596cfea5ecb676169dd7d5931139
Key45=Key1^Key145
key12345=Key1^Key13^Key235^Key145^Key34^Key45
Flag=FlagKey12345^key12345
print hex(Flag)[2:-1].decode("hex")

2.Chonky E

題目中提到一種加密算法Schmidt-Samoa cryptosystem。我們查詢其原理大致是選擇兩個素數p,q,令N=pow(p,2)*q,c=pow(m,N,N)。其解密公式也是先算出d=pow(N,-1,lcm(p-1,q-1)),再解密m=pow(c,d,p*q)。由於Schmidt-Samoa cryptosystem和開始的RSA使用相同的p,q。而RSA宮要不已知且e接近n。所以我們先使用winner-attack計算出d,phin。再將n分解。然後根據RSA的p,q對Schmidt-Samoa cryptosystem解密

import gmpy2
e = 91043118409828550796773745518585981151180206101005135117565865602978722878478494447048783557571813980525643725323377488249838860897784683927029906188947001149632101513367258267329961684034661252866484981926055087386190015432964608927947646476193251820354738640453947833718397360834701566765504916472450194494897616371452996381159817427887623703639133290358520498419049175941584678802701606995099241245926884172985004839801270005583030514286561971825047719421487004569752638468907609110285739083279629747310953086535889932550905065172805818862336335628248528993024112446002398466115161473573451161053837400091893285717
n = 156749047558583013960513267351769479915110440411448078412590565797031533622509813352093119636835511977253033854388466854142753776146092587825440445182008237325262012698034419137157047927918635897378973846177552961727126115560551970797370239385129543828686170774323306933202481728884019420422360360849592983818405154473369790181636472137741865440233383956571081122982223602667853668754338360008279002325576495573847568301584365514417593244726435632222027817410359417329310347952169273512510934251453361933794586716533950489973436393834189505450956622286216819440777162804798432330933357058175885674184582816364542591313
#winner-attack算得
d= 0x5baecf6f9f0a1bd295e9650b4a10b4a717db030223e803f8e964a18ab9bcfc0954a8f410cc00177ad9f6a0d581e12c6dfd0672dd6e5c3ef37e108e91d39ba4fdL
phi= 0x4d9b10f2117ddad53727e6ce6599681f7275049e10057e06a66272a5c384f8f6c1f259836af50469b66c560e7d6999ed7071ccf5ff8e199e286ad18118d2a289b76861b73f1bebb3b2dde9ceee3e2b702695ccbd76a42f2c9f05f799e2f8b692eb1dc66c3b3ae3ea9e82d80bb9de3bb2c78df34641dc4b914e648db89ed9159b932a6aeee2b18b80205d08951091b4c422c8bfc2c7112d408519a0bfe846213eb7203e7a26f431f1cab48a2be9e694bf460a68adbe8a7e9f7a45a78c4c1f4a7939c585aa8282ce40d7e456819edfa3d65b1e2288db85c2eb8faf573e785273c79a0746706e3a047b5ec3b6ce6c302336df9e0f2f7e0adff5535dc96e452d70840L
cc=16267540901004879123859424672087486188548628828063789528428674467464407443871599865993337555869530486241139138650641838377419734897801380883629894166353225288006148210453677023750688175192317241440457768788267270422857060534261674538755743244831152470995124962736526978165448560149498403762447372653982922113772190234143253450918953235222315161964539311032659628670417496174123483045439359846360048774164337257829398345686635091862306204455687347443958931441225500856408331795261329035072585605404416473987280037959184981453888701567175803979981461050532113072292714696752692872526424122826696681194705563391161137426703690900733706866842363055967856443765215723398555522126909749236759332964873221973970368877565410624895160438695006432021529071866881905134494489266801004903504121740435965696128048690741210812963902631391765192187570107372453917327060678806282122942318369245760773848604249664378721970318257356486696764545
a=1
b=(phi-1-n)
c=n
delat=pow(b,2)-4*a*c
ii=gmpy2.iroot(delat,2)
p=(ii[0]-b)/(2*a)
q=n//p
assert p*q==n
NN=pow(p,2)*q
d=gmpy2.invert(NN,gmpy2.lcm((p-1),(q-1)))
m=pow(cc,d,n)
print hex(m)[2:].decode("hex")

3.Morbid 

經查詢,我們發現這是一個首先將數字對應到摩斯電碼,再將摩斯電碼轉爲明文的解密過程。其中數字[1,2,3,4,5,6,7,8,9]對應字符['..', '.-', '.x', '-.', '--', '-x', 'x.', 'x-', 'xx'],但是我們不知道具體那個數字對應哪一個字符。然後摩斯密碼中一個x表示字母之間的分割符,兩個x表示單詞之間的分隔符。我們據此對密文解密——首先對[1,2,3,4,5,6,7,8,9]和['..', '.-', '.x', '-.', '--', '-x', 'x.', 'x-', 'xx']之間的關係進行爆破。將不同的對應關係一一帶入嘗試解密,知道可以正確解密且密文中有flag字樣表明我們爆破成功

import itertools
c="118289293938434193849271464117429364476994241473157664969879696938145689474393647294392739247721652822414624317164228466"
zimucodebook  = {
    "a": ".-",
    "b": "-...",
    "c": "-.-.",
    "d": "-..",
    "e": ".",
    "f": "..-.",
    "g": "--.",
    "h": "....",
    "i": "..",
    "j": ".---",
    "k": "-.-",
    "l": ".-..",
    "m": "--",
    "n": "-.",
    "o": "---",
    "p": ".--.",
    "q": "--.-",
    "r": ".-.",
    "s": "...",
    "t": "-",
    "u": "..-",
    "v": "...-",
    "w": ".--",
    "x": "-..-",
    "y": "-.--",
    "z": "--..",
    "0": "-----",
    "1": ".----",
    "2": "..---",
    "3": "...--",
    "4": "....-",
    "5": ".....",
    "6": "-....",
    "7": "--...",
    "8": "---..",
    "9": "----.",
    ".": ".-.-.-",
    ",": "--..--",
    "?": "..--..",
    "'": ".----.",
    "!": "-.-.--",
    "/": "-..-.",
    "(": "-.--.",
    ")": "-.--.-",
    "&": ".-...",
    ":": "---...",
    ";": "-.-.-.",
    "=": "-...-",
    "+": ".-.-.",
    "-": "-....-",
    "_": "..--.-",
    "\"": ".-..-.",
    "$": "...-..-",
    "@": ".--.-.",
    " ": ""
}
zhuan1=['..', '.-', '.x', '-.', '--', '-x', 'x.', 'x-', 'xx']
revzimucodebook={}
for key, value in zimucodebook.items():
    revzimucodebook[value] = key
for perm in itertools.permutations(range(9)):
    m1=c
    for i in range(9):
        m1=m1.replace(str(i+1),zhuan1[perm[i]])
    words = m1.split('x')
    try:
        mm="".join(revzimucodebook[word] for word in words)
        if "flag" in mm:
            print mm
            break
    except KeyError:
        continue

3.Randomization 1,Randomization 2

比較簡單得逆向,使用了線性方程產生隨機數列,根據逆向得到的線性方程和題目中給出得初始數,直接對後面得數字進行預測即可

4.Unexpected

根據題目易知不同的RSA機密公鑰的n之間最大公約數不爲1.根據這一點我們很快就可以對RSA做分解,解出私鑰對密文求解

import gmpy2
N1 = 3895738302299059518129198422310169628530536557191890566210939781698372336257482186582163630847612416277492034959243510457939210010336159061758606919109259916143600981918456942199762738624796190838889500238780675229383463267807384154074134251073572174392024892486431125499446924573006208711810847272390619510395812856188247531815920797526102562723333957594242603466996229335924848954210939152042149332307810693239925149256224795031982752752336401872520016106145667479144091130160998875256860809091721275069193773739370057334041922519998813268278574260846083883264261920589114740823464192397850923545998904365370408113
N2 = 3036683903819675505741091164945461947189004916494633766372176282409409694958701211748277050499101511956962003835932755555293255586827283990400451317444723234406968971873530093281591689832798646915816609347861047534121792409030834659241904646743453387504496246791081682741245482378149293399372654558929658582070853972454887854658545741800574343930155288517185535533201220281739954820271979667081052363406511938025061398551356675540358212449132781674832812796443378476387659729623581274433769056775163718782871879747276327458473970177451591251859530403032170215968101310739004163533767679394201611410832974546802038041
N3 = 4793455677299549137382284585015750073239112414361680529255951318217960300841340399094743130287927996565298160174555422185410320841942637374406558835150138631140265626020072464652973386772727192540062051929655235552439145036105501434801984612127808829810146844869487529177642676245549299371487478280457673839725488195812744535928488844735950540356920273038857127652414836352483913807655170699520816765863272825856765769043174406026964068017257738085400965661973681558654658747878342173984592411085018242201038877382766239487564503728442821348064764166024851080258629751476765613997512620274759264076272801682962144457
E = 65537
C1 = 396708474546125804352894757436683688457291028695044217325853929491171136935487190613513217479209066321213697066977005912522338337419604329864854419961723570625025089500459612736934675744115710978556346050350466970024450696226499749911198313775828281699871502987873199226066403667788132060336882800770615332190939846610876881382430101512212915247532319827304296610854802037475047119525110795533529161852951539770153761419387662527094415537933400873451490021233979268224054475360645920086811082803271848565851436058022797610887635287190533293980480191482625531855511415716253479184799509403767653927424232672209598509
C2 = 355006513750551550798931713354683491263062473879176656452255051848683497534660576981575518851351256702360823676609578259232763677292692743319345273559085724516350773319337226043634439282120083618718026203533033564167432280901197175559735572797382863132012675404876908914335941746393221402727788260354881773319480220225939283398326940847106630716629330817737251316474369640273632208347751866683363389016722969822345738247486942531821199790024647950924227337611907877819668593060172268197128413003269501597578146759488894526193598933152416894414296396043283131502951693668167550687432080480619240585408701379144341703
C3 = 924835278307680480966328618545268895077532556525413716080960421925985654497130329688156219485942736928562517552888163928270855659413958949301590302010862666331053838345196518237383846281768395909801043955047640003147798786793258813501366000503338638933238548605016169865688228297750780710248359326295693845663887055907900967535999885217905972006140096240831305484619796964713673839223632057905454213937054336962510051529266336629730913756688411854427999570223208667606703681762027957427028839409594591627448224813082072169775916331655060221445546199171668136050686471357710989346885039441000083764142021784018773006

q=gmpy2.gcd(N1,N2)
r=gmpy2.gcd(N2,N3)
p=gmpy2.gcd(N1,N3)
d1=gmpy2.invert(E,(p-1)*(q-1))
d2=gmpy2.invert(E,(r-1)*(q-1))
d3=gmpy2.invert(E,(p-1)*(r-1))
m1=pow(C1,d1,N1)
m2=pow(C2,d2,N2)
m3=pow(C3,d3,N3)
print hex(m1)[2:].decode("hex")+ hex(m2)[2:].decode("hex")+ hex(m3)[2:].decode("hex")

5.smolE 

本題使用相同的RSA加密體系對有着不同填充的明文加密。這裏我們可以首先使用Random Padding Attack計算兩個明文之間的差值是多少,然後使用Related Message Attacks計算出明文。注意這裏由於對明文進行的填充,但我們不知道填充有多少位,所以我們需要爆破明文左移1位到8位的情況

Random Padding Attack:

Related Message Attacks:

writeup如下——我們首先使用Random Padding Attack計算兩個明文之間的差,再使用Related Message Attacks計算出明文的值

N = 163741039289512913448211316444208415089696281156598707546239939060930005300801050041110593445808590019811244791595198691653105173667082682192119631702680644123546329907362913533410257711393278981293987091294252121612050351292239086354120710656815218407878832422193841935690159084860401941224426397820742950923
E = 3
C1 = 110524539798470366613834133888472781069399552085868942087632499354651575111511036068021885688092481936060366815322764760005015342876190750877958695168393505027738910101191528175868547818851667359542590042073677436170569507102025782872063324950368166532649021589734367946954269468844281238141036170008727208883

C2 = 42406837735093367941682857892181550522346220427504754988544140886997339709785380303682471368168102002682892652577294324286913907635616629790484019421641636805493203989143298536257296680179745122126655008200829607192191208919525797616523271426092158734972067387818678258432674493723618035248340048171787246777

PR.<x> = PolynomialRing(Zmod(N))
f = x^9+(3*C1-3*C2)*x^6+(3*C1^2+21*C1*C2+3*C2^2)*x^3+(C1-C2)^3
x0 = f.small_roots(X=2^64, beta=0.2)[0]

b=x0
fenzi=b*(C2+2*C1-b^3)
fenmu=C2-C1+2*(b^3)
m1=(fenzi/fenmu)%N
m2=m1+b
print m1
print m2

接下來我們去掉明文填充

import gmpy2
def shuchu(mingwenstr):
    if mingwenstr[len(mingwenstr)-1]=='L':
        mingwenstr=mingwenstr[2:len(mingwenstr)-1]
    else:
        mingwenstr=mingwenstr[2:len(mingwenstr)]
    if not len(mingwenstr)%2==0:
            mingwenstr='0'+mingwenstr
    i=len(mingwenstr)
    mingwen=""
    while i>=1:
        str1=mingwenstr[i-2:i]
        if int(str1,16)>33 and int(str1,16)<128:
            mingwen=chr(int(str1,16))+mingwen
        else :
            mingwen=" "+mingwen
        i=i-2
    print mingwen


m1=1426051161596273413795556654328320105145439332147585418507576775870780450590379567453641429082640842935901398525237698534587016076610446383728128936582478631369081375319103785503713430762835018940932512662482247881629813321166872870577809910090459052486979919351413039719867069160
shuchu(hex(m1<<7))

6.Extremely Complex Challenge

我們已知橢圓曲線的b,p和橢圓曲線上的基點P一個Q,求私鑰。我們首先根據點將橢圓曲線的參數a求出。然後我們暴力求解私鑰

b=54575449882
p=404993569381
xp=391109997465
yp=167359562362
xpinv=inverse_mod(xp,p)
a=(((yp)^2-(xp)^3-b)*inverse_mod(xp,p))%p
E=EllipticCurve(GF(p), [a,b])
Ep=E([391109997465, 167359562362])
Eq=E([209038982304, 168517698208])
d1 = discrete_log(Eq, Ep, Ep.order(), operation="+")
print d1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章