from Crypto.Util.number import * n = 84957339878841249042661992015318775914153057891067549723671982778975957526984361748735670333426792012519248099265537115315835602057882318543112781196438953840653279029957533208045448649312183873062132255928109150470090982541502003013666939934181416473581073990221728448342533549843710383544743220364127453679761909368982493089369740815066106196444062558446312836612656666434089655206650558129894180991572670565328419648196602807190683488653617068325238542193033423978598565191919683033996144778397817249870630736098769732268174866389943010980427234356604782502318622853423388492983406635687647680770869588481426436811952986075832678887752706507835771052708232550208582584262345437818916577580806059662945066377375408508814381061305598911972399165132279018674832071994673661875185328115121586302490349253912699566783660070599552395205352917554104371784905394477629626963439266490743240318198729049054547013391348516066097465180775402810975266096525722415778248668765855332776864126033830969325570615444114396786906102536716873598804164196155179833683285635189223166238933318740720918827120989416013091102543382987278707392961157272937695585450287755023671116911370689655292160336521776501052329465384315585357461493649222793172462113102463 flag = 45146787828557679140423580221442956925310977371109091853462843177826294442352634580160310989152235297235514141658881390908592470683795245870619319983451904537192781823855678086088663405872526980084960008183831288044960349605168173490367894375757787452024287989993362954206286853190401541606518731317814018817491109177360761859453002792899864984488524864028766239497641048919565458281765487932324396702580026094746189401141448947513512730220423629277692258527951902039531739842965067285622196418171785466236294324572986853688947727117303227689578683403160426800470263102483582737614730930657875098843867256713854784720793138228809768453579721222271047690131897888999884098995408016105397663714102200568327066068146128637742779637777800612639149916508879936573438036837445673606364763612971401591822166427703422764153960398983100036398400304771376839125152709954274549463602659761299411215766075895177151923436509501196662786766042103493713861194722614436307437016043581292216432028543923347478884441934980948114759937955940408027377458938151172837554432746134399838012547867483350557859826433321810794053681726512471838143910118068486851496148663526948219071671481909824342580081675074372829356225227848676981201731545407466857723499918017 primelist = list(factor(n)) p = [fac[0] for fac in primelist] phi = n for i in p phi *= 1- (1/i) e = 65537 d = inverse(e,phi) m = pow(flag,d,n) print(long_to_bytes(m))
from gmpy2 import * from Crypto.Util.number import * N = 0x28f8f1d3384879ece1a0e4fa990fdee59f83bccf5fc41d2783a657e3cad4f181f0a1c2b7f61e0f391b7b11afc502b070e555a39c14d9b3eae6c89e330e0f68fb77892438e93e6c1cc94869ce80525b59d097c0c783161a148d5370fd4ade1e65f49060a78bd722e0fa4ed624f3747a4d6190122fd1b778ca5bbbd85ca04cae13e197be5275d4c5811a2a2df186e374ad5f8b11f6f501c32cdaa6ac11707796395c2a957b5c7398401c9b9be06c18ddb97981c5ebf1ece7564f42b844370506a0bc9dfc2ae54649ab05ef483981e7d7ecd6d6dbbaacdc4e809cc54afac4ce308943c7c5e1 e = 65537 m = gmpy2.iroot(int(N),2)[0] print(long_to_bytes(m))
flag:byuctf{P3M_f0rm4t_1s_k1ng}
3.Real-Smooth
chacha20属于流密码,简单来说 此时出现了nonce reuse
1 2 3
cipher = ChaCha20.new(key=key, nonce=nonce) print(bytes.hex(cipher.encrypt(b'Slide to the left'))) print(bytes.hex(cipher.encrypt(b'Slide to the right')))
由于参数一致,但ChaCha20实例没有重置,是同一个密钥流
前者17位,后者18位
我们需要得到Criss cross, criss cross的密文,一共24位
则24=17+7
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/local/bin/python from Crypto.Util.number import * from Crypto.Cipher import ChaCha20 from Crypto.Random import get_random_bytes from pwn import * msg1 = b'Slide to the left' msg2 = b'Slide to the right' ct1 = bytes.fromhex("5fcba2305c953edf4f17c548f6d557d0ef") #from interactive ct2 = bytes.fromhex("919d44734ab669aaaa338153c725c1b34d8e") keystream1 = xor(ct1, msg1) keystream2 = xor(ct2, msg2)[:7] ct3 = xor(b'Criss cross, criss cross',keystream1+keystream2) print(bytes.hex(ct3)) #submit to get flag
flag:byuctf{ch4ch4_sl1d3?...n0,ch4ch4_b1tfl1p}
4.Anaken21sec1
加密流程:
transform to matrix->do the block permutations and
additions->scramble matrix->get resulting letters from matrix->
rearrange ciphertext according to the key
when we are recovering,we should be in the reversed order