【CTF WriteUp】2020天翼杯Crypto题解

(开会没赶上,赛后做的,部分内容搬运自其他大佬)

Crypto

easyRSA

根据题目,e<20000,加密为逐字符加密,所以可以通过爆破得到e,然后再依次解密。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gmpy2
from libnum import n2s, s2n

n = 53868412634233045090369153437747412878975425992040754576346754596620347350784422917543759897936684646663150893442998869763798006729979997564587680875175995309635877031073898192380128134509976889005408768734374216063639902277690308505919178272615191163114645916867249827856751349851814346547505622471483949937
c = [36143793706265337073034755285680078528436882895525190723507534395950828118997628925090404438993072380573400767902990067482880570130224609722931177274849457403547171263972983019187913817796665882873998616231519206734202450449317963141346836996876520731298139484504046340552763094411316198407383338208856130870L, 30485289317489122513627424533258350515279207179552977911285197688270281245828407217991247923748564161409175076285380310289577344106125220128702373704159801265509969544840793736965464878414914537483701234228629064639374176394892003747894000649142798022157683437062596618574582761554787284372511226003550269371L, 3230183840782130132728550718879398529949011218584590214219970581894471595561557004203362354709970356734066395359248387914135714547693183197530370374482377328163905611411567039058080693820629261772459519178070810812194846437468479192532415093386483496307005949701166752528549311380452280458293080276726829603L, 25710430894158079311830714889718580974171581911002161989735153974074319352353008048142133029367435263698163394834768816086041815027231628825846495139208493868114079735178838159083476440613688096615701599646904740303121960899627887799112605887484922771885397056359474573599547493670021831421281871544848617729L, 19732968894700182005170322933853544733918556507218610879172101330791135258760048103574784092873604313932829411687518781796870112528816456829131236447610238430534513141439255353077893832475969071823784414902688155677656081948848412872244494057776570244585895585353001527113887752049634607310624731379054225973L, 49603823166275212373225350577680850241791038694173725226894961732112441988775475186232426203286108859938201515004660268704496760935793272426803644906304390902690585052664086332034549639604388540879672250182582474531712807630874468538276983688370936840051189314399257931504052240291478721105604232683571965735L, 3230183840782130132728550718879398529949011218584590214219970581894471595561557004203362354709970356734066395359248387914135714547693183197530370374482377328163905611411567039058080693820629261772459519178070810812194846437468479192532415093386483496307005949701166752528549311380452280458293080276726829603L, 36143793706265337073034755285680078528436882895525190723507534395950828118997628925090404438993072380573400767902990067482880570130224609722931177274849457403547171263972983019187913817796665882873998616231519206734202450449317963141346836996876520731298139484504046340552763094411316198407383338208856130870L, 30959931770895661365773662470290660506825261406067897465047950420463062950618600456650627514353480704138525843506175906147163722415875078456195887237951065474208725566820929688439489181815653581366068782107495855200442175091769300191401276169525885040982173400894816740864495713267532055984024720558728143611L, 10474662672025033041773365514312335540902032242267504195623117415683501726504952603558055485682046183041535826673296800918383074606402787027709571720464778282861332844110321181367277759299138792649236387268813934955882087855452773130837737108740698574126516301715777091874051282126020284661182410257231179753L, 39111600477742118705806395027906988208445577416201550388650540742347022379939784851496417589057003798020634385485932858409451138352913390310896030166781799764397194165567776360446226818994394507391829127511769351762441609027121311846867992195447845664286406943953929567958814340505351947630455475804285727484L, 36143793706265337073034755285680078528436882895525190723507534395950828118997628925090404438993072380573400767902990067482880570130224609722931177274849457403547171263972983019187913817796665882873998616231519206734202450449317963141346836996876520731298139484504046340552763094411316198407383338208856130870L, 20410654833843880836232625906280502202859672782729125051826685074510132406319832186711328043576717168143926086499155426957562863035893608063763496001467692730847514246434999398419384281899893374238711551517649464555301605989912669722238859406226125066118408050493138139068479714147539973518962897827574079593L, 36143793706265337073034755285680078528436882895525190723507534395950828118997628925090404438993072380573400767902990067482880570130224609722931177274849457403547171263972983019187913817796665882873998616231519206734202450449317963141346836996876520731298139484504046340552763094411316198407383338208856130870L, 7921134582753161322624290128634847155380402724851782664296670731383021765698194698795488878351754017043009294851033981478038403743577671361192735771763306447070861526914346664563552250711401128380349734350523225717871629577515929322968751140532497166587257175822120828394599888045317806403391547870859918022L, 10474662672025033041773365514312335540902032242267504195623117415683501726504952603558055485682046183041535826673296800918383074606402787027709571720464778282861332844110321181367277759299138792649236387268813934955882087855452773130837737108740698574126516301715777091874051282126020284661182410257231179753L, 37809519162220134190794179869071656253660637222651595716890486816819198670240449273217219092611534466839003562406526012393170182490664346796859412314807051075958172496172197098653619849179731703176156384686342627654694902901988586296739592097270627294547101302528720466472915869502035253270880461930808493388L, 37809519162220134190794179869071656253660637222651595716890486816819198670240449273217219092611534466839003562406526012393170182490664346796859412314807051075958172496172197098653619849179731703176156384686342627654694902901988586296739592097270627294547101302528720466472915869502035253270880461930808493388L, 3230183840782130132728550718879398529949011218584590214219970581894471595561557004203362354709970356734066395359248387914135714547693183197530370374482377328163905611411567039058080693820629261772459519178070810812194846437468479192532415093386483496307005949701166752528549311380452280458293080276726829603L, 39111600477742118705806395027906988208445577416201550388650540742347022379939784851496417589057003798020634385485932858409451138352913390310896030166781799764397194165567776360446226818994394507391829127511769351762441609027121311846867992195447845664286406943953929567958814340505351947630455475804285727484L, 30959931770895661365773662470290660506825261406067897465047950420463062950618600456650627514353480704138525843506175906147163722415875078456195887237951065474208725566820929688439489181815653581366068782107495855200442175091769300191401276169525885040982173400894816740864495713267532055984024720558728143611L, 15747738389149130546683323352487624099130536202521411140249777871780143886920854454890229471824528461849537673346295452973409717079527784378744780352239762449801001678008011753760911978134166483356246071627173861470601418554748959055745539267882513648338847817602838808623857409763494613906204746380746041743L, 37809519162220134190794179869071656253660637222651595716890486816819198670240449273217219092611534466839003562406526012393170182490664346796859412314807051075958172496172197098653619849179731703176156384686342627654694902901988586296739592097270627294547101302528720466472915869502035253270880461930808493388L, 49603823166275212373225350577680850241791038694173725226894961732112441988775475186232426203286108859938201515004660268704496760935793272426803644906304390902690585052664086332034549639604388540879672250182582474531712807630874468538276983688370936840051189314399257931504052240291478721105604232683571965735L, 37809519162220134190794179869071656253660637222651595716890486816819198670240449273217219092611534466839003562406526012393170182490664346796859412314807051075958172496172197098653619849179731703176156384686342627654694902901988586296739592097270627294547101302528720466472915869502035253270880461930808493388L, 41816082923294550015345177100947705941041384208212791124911658070475546413503648718489777663979623501758652560264344194036417126974018212069759723298990493830911260380987927219778671357273815320923993066160279132764029408453741387628321086125359271717932477562073380143941135757967992556738856891243384983881L, 2289661747463432904864726014469820089868859807681341604602724331315868027626911256942237265741150662379120096087503128257053991282511669446600149018298385954324456893093185337113453867043111379604256625373327695708031540726940582948952961996209717576768629087376812686254364929371492740503955614801880755029L, 4769150487876088158092207801833930492410418508766701697944250605734573379553037277899162828229262014063643323820460512403565006283703666233290157946979202583798598785822720156680345481949741468336883744252416349425692863975145641191695837839335637368844322856886906613050961753097516258566929761607581854452L, 30959931770895661365773662470290660506825261406067897465047950420463062950618600456650627514353480704138525843506175906147163722415875078456195887237951065474208725566820929688439489181815653581366068782107495855200442175091769300191401276169525885040982173400894816740864495713267532055984024720558728143611L, 10474662672025033041773365514312335540902032242267504195623117415683501726504952603558055485682046183041535826673296800918383074606402787027709571720464778282861332844110321181367277759299138792649236387268813934955882087855452773130837737108740698574126516301715777091874051282126020284661182410257231179753L, 7921134582753161322624290128634847155380402724851782664296670731383021765698194698795488878351754017043009294851033981478038403743577671361192735771763306447070861526914346664563552250711401128380349734350523225717871629577515929322968751140532497166587257175822120828394599888045317806403391547870859918022L, 30959931770895661365773662470290660506825261406067897465047950420463062950618600456650627514353480704138525843506175906147163722415875078456195887237951065474208725566820929688439489181815653581366068782107495855200442175091769300191401276169525885040982173400894816740864495713267532055984024720558728143611L, 36143793706265337073034755285680078528436882895525190723507534395950828118997628925090404438993072380573400767902990067482880570130224609722931177274849457403547171263972983019187913817796665882873998616231519206734202450449317963141346836996876520731298139484504046340552763094411316198407383338208856130870L, 17682515232429855272035901906772793825487721364344744362854466453245309632533244423538397321529685198664897252467080139806066355278301576555901412750048173484094398286014082522669828578258761701764108260931807262691138889541639002660481520728386113333127824444193307376521294377427870384102128500516960684947L, 4769150487876088158092207801833930492410418508766701697944250605734573379553037277899162828229262014063643323820460512403565006283703666233290157946979202583798598785822720156680345481949741468336883744252416349425692863975145641191695837839335637368844322856886906613050961753097516258566929761607581854452L, 30959931770895661365773662470290660506825261406067897465047950420463062950618600456650627514353480704138525843506175906147163722415875078456195887237951065474208725566820929688439489181815653581366068782107495855200442175091769300191401276169525885040982173400894816740864495713267532055984024720558728143611L, 33837532960782971009791077799738764896858649583072963199517227302081393621122306404955447605996320839470145314998033425661115068801570111325727613277035152575774982876149450313082012824128743218000149252557836744280911674724684003561337786214393597090329060449104920400289411467319248511722415235332423804311L, 30030303315850134541983623762793648940576863243875408346383336740002014977915867166596483716837565090899781937786444667011603255898645014579568163387075249462739655058635864271192704361549774337456607506026964549661765427917083344151333423310742416015343716142879418000874164534510255100626106244640607206741L]
e = 0
for tmpe in range(2, 20000):
    if(tmpe%1000==0):
        print tmpe
    for i in range(256):
        if pow(i, tmpe, n) == c[0]:
            print i, tmpe
            e = tmpe
            break
    if e!=0:
        break

target = []
for i in range(256):
    target.append(pow(i, e, n))

m = ''
for i in c:
    m += chr(target.index(i))
print m

flag{caf94ef5f8400ae920c0bd79489f3791}

HardRSA

本题为Coppersmith算法中,已知d的部分低位情况的变种。根据题目,有

e * d = 1 mod ((p-1)*(q-1)*(r-1))
e * d = 1 + k*(p-1)*(q-1)*(r-1)

两边模2^540,得:

e * d0 = 1 + k*(p-1)*(q-1)*(r-1)  mod 2^540

两边乘以q

(e * d0 - 1) * q = k*(p-1)*(q-1)*(r-1) * q  mod 2^540
(e*d0-1) * q = k*(p-1)*(qr-q-r+1)*q
(e*d0-1) * q = k*(p-1)*q*r*q - k*(p-1)*q*q - k*(p-1)*r*q + k*(p-1)*q
(e*d0-k*(p-1)*(q*r)-k*(p-1))*q + k*(p-1)*q^2 + k*(p-1)*(q*r) = q
e*d0*q-k*(p-1)*(q*r+-q+1)*q + k*(p-1)*(q*r) = q

上式可视为关于q的一元二次方程,其中的每一项系数均可求,所以可以通过修改原始Coppersmith代码来分解q*r。此处step1求解后得到的q已经满足条件,所以不需要进行step2。完整代码如下:

from sage.all import *

def find_p(d0, kbits, e, n, p):
    X = var('X')
    for k in xrange(1, e+1):
        results = solve_mod([e*d0*X - k*(p-1)*X*(n-X+1) + k*(p-1)*n == X], 2^kbits)
        for x in results:
            q = ZZ(x[0])
            if n % q == 0:
                return q
    return None

if __name__ == '__main__':
    # n = q * r
    n = 0x5c44cf1cc8b3c0ef4bd76abbb5236f772edf728c59ea29ee8af3fe9e2d3a44a004c2694a398f02be6480c2b418fcf0c8e2180577318fa9eeb80a6c11d1a7ee6c6945912eaac23322f6c1a0609bddc7e012e58163ed6eb3e13a88e880ee1e77e7aa0aac4b2e364b2df5609a4ece180c539126f60c0fff7ff4f325e49a0caad4f
    p = 0x3bfd387720814dd8952e73745e96cb270964a35f7d5c6a0b23b200d7e64bcf95e3c8a2850dd3842dcc90f6fc236332b1b85492aca5f9373d12b75e9aaf867271
    e = 7
    c = 0xec76baaf15a5c04bf857155374da8408ff0c142c79b7bf1a9359244e8f3a1b046543dd2e74be16746cc7fde06c876380618d87d3027ebc0345deb34d884bb24ba8536ca981433d4d3ed66285b155820bd5e1a626f5ba4eda57ffbdd2cbc7422a9baa2c5b486bdacd9abd1bfd5452110b41d0859585924feb57890dfb0a18cfd649b203a40f361da4604e6c01663c1e7fd81db9033e07cf327b5bb2e09bd23a5bc1bf49ea21e79fa2ecce7f57035d9f9ebd795d5bb11a7e2c2a16abf6937884
    tempd = 0x414946b9c40728f9801e61e98ec6d17525cbe4163a5ffb8367b65c652ae4cc3abce62e70afbfb84fcf937b3119953b48922be19ef4312c4f3a88313368ca6c9b1d658b7
    kbits = 540
    d0 = tempd & (2^kbits-1)

    q = find_p(d0, kbits, e, n, p)
    print q

解得
q = 1717685499864896197775907037273683013533693547213627442234351497698466603787416145193085531100353655867384681748218717546880918920992536675836375071473317
然后就可解得明文

import gmpy2
from libnum import n2s, s2n

qr = 4049584030002970545664080823848129582938411034556792600914380229461546791772327894437844974694562804322320098597200821632361860404029749610290918822378230751309535193434791281064861182569710224863795884931806318447090299326829551214573212997789976022379378237846483710647686355658059931581771863291348036943
p = 3141886348112988339174865432179206412942588390228169645162293920470188882447855208783220899752887620221059861467348059334030873350571979462363834615231089
c = 8696771272015513736887843395612361647314297287781507609196936354183211655364744684164300710583625473872942712063309507651496314800393009480421886926137403759228421858414833429980059903049311837014449093365911603108158352871851677457256058510822509157407703210866317472894586087554001158540951787167699161720491198674848526093644131709561995379565643716017359731201935855247285498574923656191121426618306186331615280461405913653781283860760013215603007314688132
q = 1717685499864896197775907037273683013533693547213627442234351497698466603787416145193085531100353655867384681748218717546880918920992536675836375071473317
r = qr//q
d = gmpy2.invert(7, (p-1)*(q-1)*(r-1))
print n2s(pow(c, d, p*q*r))

flag{6809781d08e120627e623dcdafe26b8a}

polycrypto

本题为NTRUEncrypt,参照wiki
https://en.wikipedia.org/wiki/NTRUEncrypt
看了看基本没啥区别,尝试照着做
第一步计算 a = e(密文)* f(私钥)

from sage.all import *
import random

def randomseq(N):
    return [randint(-1, 1) for _ in range(N)]

N = 61
p = 11
q = 5039
Ip = Integers(p)
Iq = Integers(q)
Rp = PolynomialRing(Ip, "x")
Rq = PolynomialRing(Iq, "y")
xp = Rp.gen()
xq = Rq.gen()
Sp = Rp.quotient(xp ^ N - 1, "x")
Sq = Rq.quotient(xq ^ N - 1, "y")

pubkey = Sq([2002, 3371, 2744, 363, 4617, 4767, 4447, 490, 2348, 909, 4739, 4766, 1417, 4776, 1606, 4383, 699, 3445, 1989, 986, 2450, 971, 2890, 1050, 3887, 2624, 3083, 329, 1917, 1014, 2189, 4843, 4982, 3708, 4094, 535, 2942, 1807, 4643, 3876, 2191, 476, 844, 1352, 4079, 637, 402, 4037, 2576, 2803, 1949, 3704, 4828, 2502, 526, 2032, 1145, 976, 2078, 3566, 2447])
prikey = Sq([12, 0, 5028, 0, 11, 0, 5028, 11, 5028, 11, 11, 5028, 0, 5028, 11, 0, 0, 0, 0, 5028, 5028, 0, 5028, 11, 0, 0, 0, 11, 0, 5028, 0, 0, 5028, 0, 11, 0, 5028, 5028, 0, 0, 0, 11, 0, 11, 0, 0, 5028, 0, 11, 5028, 0, 0, 0, 11, 0, 5028, 11, 0, 0, 5028, 5028])
ciphers = [[221, 4761, 791, 4565, 163, 2959, 2174, 2402, 3083, 4464, 340, 752, 4898, 709, 3085, 4393, 156, 3680, 600, 2074, 3058, 4331, 1621, 2977, 2420, 891, 429, 4304, 3811, 2672, 3615, 3592, 1069, 561, 3183, 1197, 931, 1625, 89, 4118, 1214, 2147, 3542, 3305, 1192, 2768, 4519, 2672, 1548, 2598, 4075, 1667, 577, 924, 810, 1239, 4033, 2198, 2742, 4197, 2069], [1249, 2762, 483, 3324, 449, 1647, 1024, 3292, 285, 83, 1144, 1818, 2323, 2215, 1157, 2370, 3735, 1712, 3278, 1118, 3073, 4803, 783, 4765, 3120, 4709, 3304, 199, 987, 4939, 3969, 1749, 1045, 450, 40, 1644, 1143, 2642, 1464, 3462, 1990, 1235, 4756, 2240, 2808, 4728, 3874, 3746, 2106, 926, 778, 1071, 3488, 3469, 926, 4497, 2220, 1425, 4549, 3130, 4937], [4287, 3659, 4672, 521, 3387, 1631, 674, 1739, 1927, 1655, 4653, 4772, 245, 216, 845, 3161, 2756, 1752, 2562, 2893, 443, 1195, 2430, 2438, 152, 4567, 965, 1200, 1709, 1109, 3349, 2988, 147, 3214, 4391, 2726, 1531, 251, 2685, 1624, 2963, 2385, 4992, 4995, 3296, 3262, 4337, 1002, 63, 959, 2631, 315, 4114, 1292, 3588, 1867, 3349, 3928, 3886, 1258, 2783], [834, 3120, 1420, 3534, 3926, 2862, 1840, 1083, 3258, 3146, 1080, 145, 119, 3348, 4115, 1551, 3426, 2077, 3493, 4002, 3008, 1321, 2182, 4197, 3047, 3349, 1555, 709, 2803, 63, 2792, 538, 4943, 1081, 2204, 2993, 4398, 1007, 3623, 4243, 2276, 2332, 2287, 363, 3920, 2229, 3078, 1438, 1152, 297, 3425, 4381, 3651, 3818, 2970, 159, 3726, 1190, 1645, 632, 2697]]

for cipher in ciphers:
    e = Sq(cipher)
    a = prikey * e
    print list(a)

这样得到四个a,然后进行第二步,计算a%p。注意这里如果大于一半(2519)的话,需要先转换为负数(减5039)再约。代码不连续,见谅

b1 = list(Sp([-121, -22, 133, 45, 10, -22, 122, -67, -67, -32, 32, 121, 100, -66, 43, 23, 166, -67, 65, 67, 33, 78, -45, -78, 89, 66, -33, -23, 32, 154, -34, -65, -43, -21, -22, -44, 22, -98, -43, -1, -1, 21, 175, 54, -45, 10, 76, 87, -144, -12, -34, -111, 32, 21, 65, 54, 21, 21, -78, 142, 32]))
b2 = list(Sp([-1, 164, -78, 21, -21, -1, 44, 165, 21, 12, -43, -1, -131, -32, 110, 43, 22, 12, 54, 34, 111, 34, -44, -99, 67, 67, 21, -122, 78, 10, -12, -22, 76, 34, 12, -44, -143, 34, 78, -56, -23, -111, 32, 65, 43, -34, -100, 21, 21, -45, 65, 54, 43, -100, -67, -34, -1, 10, 21, -100, 76]))
b3 = list(Sp([144, -10, 34, -34, 78, -78, -100, -55, 66, -12, 34, 110, 22, -67, 78, 10, -10, 56, 45, -11, -89, 88, -133, -56, 23, 153, -54, 76, 111, -77, -165, -12, -65, 11, -44, 132, -98, 1, 100, -1, -1, 21, 109, -12, 21, 21, -89, -111, -23, -12, 65, 87, 98, -12, -56, 43, -144, 65, 43, 76, 21]))
b4 = list(Sp([32, -32, 54, 44, -23, -66, -23, 89, 23, -45, 89, 89, 23, -55, 45, 109, -11, 44, -22, -55, 21, 65, -1, 56, 98, -34, 65, 110, 54, -76, 11, -34, -22, 32, 11, 66, -89, 32, 76, 55, -34, 43, -34, -67, -1, -12, 109, -56, 10, -45, 120, 43, -12, 32, 87, -1, -111, 76, 120, -23, -89]))

得到的结果同上,大于一半(5)的转负数(减11)

b01 = [0, 0, 1, 1, -1, 0, 1, -1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -1, -1, 1, 0, 1, -1, -1, 1, 0, 0, -1, -1, 0, -1, 1, 1, 1, 0, 0, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
b02 = [-1, -1, -1, -1, 1, -1, 0, 0, -1, 1, 1, -1, 1, 1, 0, -1, 0, 1, -1, 1, 1, 1, 0, 0, 1, 1, -1, -1, 1, -1, -1, 0, -1, 1, 1, 0, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
b03 = [1, 1, 1, -1, 1, -1, -1, 0, 0, -1, 1, 0, 0, -1, 1, -1, 1, 1, 1, 0, -1, 0, -1, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
b04 = [-1, 1, -1, 0, -1, 0, -1, 1, 1, -1, 1, 1, 1, 0, 1, -1, 0, 0, 0, 0, -1, -1, -1, 1, -1, -1, -1, 0, -1, 1, 0, -1, 0, -1, 0, 0, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

然后花了一上午的时间去找最后一步乘以Fp(说到底还是没能理解算法),结果发现不用乘,这个就是最终解(WHY?)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from libnum import n2s

bs = [[0, 0, 1, 1, -1, 0, 1, -1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -1, -1, 1, 0, 1, -1, -1, 1, 0, 0, -1, -1, 0, -1, 1, 1, 1, 0, 0, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, 1, -1, 0, 0, -1, 1, 1, -1, 1, 1, 0, -1, 0, 1, -1, 1, 1, 1, 0, 0, 1, 1, -1, -1, 1, -1, -1, 0, -1, 1, 1, 0, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[1, 1, 1, -1, 1, -1, -1, 0, 0, -1, 1, 0, 0, -1, 1, -1, 1, 1, 1, 0, -1, 0, -1, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, 1, -1, 0, -1, 0, -1, 1, 1, -1, 1, 1, 1, 0, 1, -1, 0, 0, 0, 0, -1, -1, -1, 1, -1, -1, -1, 0, -1, 1, 0, -1, 0, -1, 0, 0, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]]

m = ''
for b in range(len(bs)):
    count = 0
    for i in range(len(bs[b])):
        count += ((bs[b][i]+1)%3)*3**i
    m += n2s(count)
print m

# 59d34a385e1b59c977eea74e92e0d9dc

再看一下这个哈希值,嗯,md5(md5(ntru)),应该就是没跑了
flag{59d34a385e1b59c977eea74e92e0d9dc}

alicehomework

这题还没看呢,队友就把答案翻出来了,看了大佬解答,嗯。。。我应该做不出来
这里直接搬运了,源地址
https://0xdktb.top/2020/07/31/WriteUp-中国电信2020天翼杯-Crypto/

再一次深感与大佬差距不可以道理计,匿了

你可能感兴趣的:(【CTF WriteUp】2020天翼杯Crypto题解)