Zip bomba, kaip tai veikia. Putino archyvinė bomba. Wordpress mus nuteisė

💖 Ar tau patinka? Pasidalinkite nuoroda su draugais
[Atnaujinimas] Dabar esu kažkokioje žvalgybos agentūrų sąraše, nes parašiau straipsnį apie kažkokią „bombą“, tiesa?

Jei kada nors priglobėte svetainę ar administravote serverį, tikriausiai puikiai žinote apie blogus žmones, kurie jūsų nuosavybei bando pridaryti visokių blogų dalykų.

Kai pirmą kartą priglobiau savo mažą „Linux“ dėžutę su SSH prieiga, būdamas 13 metų, žiūrėjau į žurnalus ir kiekvieną dieną matydavau IP adresus (dažniausiai iš Kinijos ir Rusijos), bandančius prisijungti prie mano mielos dėžutės (kuri iš tikrųjų yra. iš tikrųjų senas ThinkPad T21 nešiojamasis kompiuteris su sugedusiu ekranu, dūzgiančiu po lova). Pranešiau apie šiuos IP jų teikėjams.

Tiesą sakant, jei turite „Linux“ serverį su atviru SSH, galite patys pamatyti, kiek kartų per dieną bandoma prisijungti:

Grep "autentifikavimo gedimai" /var/log/auth.log


Šimtai nesėkmingų autorizacijos bandymų, nors serverio slaptažodžio autentifikavimas išjungtas ir veikia nestandartiniame prievade

Wordpress mus nuteisė

Gerai, pripažinkime, žiniatinklio pažeidžiamumo skaitytuvai egzistavo dar iki Wordpress, tačiau platformai išpopuliarėjus dauguma skaitytuvų pradėjo tikrinti, ar nėra netinkamai sukonfigūruotų wp-admin aplankų ir nepataisytų įskiepių.

Taigi, jei jaunoji įsilaužėlių gauja nori gauti naujų paskyrų, jie atsisiųs vieną iš šių skaitytuvo įrankių ir nustatys jį daugybėje svetainių, tikėdamiesi gauti prieigą prie kokios nors svetainės ir ją sugadinti.


Žurnalų pavyzdžiai nuskaitydami su Nikto įrankiu

Štai kodėl visi serveriai ir svetainių administratoriai tvarko gigabaitus žurnalų, pilnų nuskaitymo bandymų. Taigi aš maniau...

Ar įmanoma smogti atgal?

Po eksperimento su galimu IDS ar Fail2ban panaudojimu man priminė senas geras ZIP bombas iš praeities.

Kas yra ZIP bomba?

Kaip paaiškėjo, ZIP glaudinimas puikiai tinka sprendžiant pasikartojančius duomenis, taigi, jei turite milžinišką tekstinis failas, užpildytas pasikartojančiais duomenimis kaip visi nuliai, jis bus labai gerai suspaustas. Aš turiu galvoje, LABAI gerai.

Kaip parodė 42.zip, galima suspausti 4,5 petabaitų (4 500 000 gigabaitų) į 42 kilobaitus. Kai bandysite peržiūrėti archyvo turinį (išskleiskite arba išpakuosite jį), greičiausiai pritrūks vietos diske arba RAM.

Kaip numesti ZIP bombą ant pažeidžiamumo skaitytuvo?

Deja, žiniatinklio naršyklės nesupranta ZIP, bet supranta GZIP.

Taigi pirmiausia sukursime 10 GB GZIP failą, užpildytą nuliais. Galite atlikti daugybę įdėtųjų suspaudimų, bet pradėkime nuo paprasto.

Dd jei=/dev/nulis bs=1M count=10240 | gzip > 10G.gzip


Padaryti bombą ir patikrinti jos dydį

Kaip matote, jo dydis yra 10 MB. Galėjo ir geriau suspausti, bet kol kas užtenka.

Dabar įdiegkime PHP scenarijų, kuris jį pristatys klientui.

Pasiruošę!

Dabar galime jį naudoti kaip paprastą gynybą:

Akivaizdu, kad šis scenarijus nėra elegancijos įkūnijimas, tačiau jis gali apsaugoti mus nuo anksčiau minėtų scenarijaus vaikų, kurie net neįsivaizduoja, kad vartotojo agentas gali būti keičiamas skaitytuvuose.

Taigi... Kas atsitiks, jei paleisite šį scenarijų?


(Jei išbandėte bombą kituose įrenginiuose / naršyklėse / scenarijuose, prašau

Įžeidžiančiai tyliai ir nepastebimai įvyko vienas labai įdomus ir svarbus įvykis. Rusijos prezidentas Vladimiras Putinas susitiko ir kalbėjosi su vienu iš valstybės tarnybos vadovų, kurio pavardė nedažnai pasirodo spaudoje. Ne, šis asmuo nėra slaptasis agentas, nors dėl savo veiklos pobūdžio jis turi prieigą prie slaptos informacijos ir netgi gali būti laikomas savotišku „nematomo fronto kovotoju“. Apskritai Putinas kalbėjosi su Federalinės archyvų agentūros vadovu Andrejumi Artizovu.

Šalies vadovės ir agentūros vadovo pokalbis buvo dalykinio pobūdžio, kurio galimos pasekmės vietomis galėjo sukelti sprogusios bombos poveikį, o kai kur net asmeninio antgalio sprogdinimą.

Prezidentas tyliai pareiškė, kad nusprendė išslaptinti daugelį archyvinių dokumentų, o dekretas bus pasirašytas tą pačią dieną. Be to, Putinas paskelbė apie Rosarkhivo perkėlimą į tiesioginį Rusijos prezidento pavaldumą, nes daugelis departamento medžiagos „yra ypatingos vertės ir pasaulinės reikšmės“.

Agentūros vadovas savo ruožtu informavo prezidentą, kad Rusijos archyviniame fonde saugoma 500 milijonų bylų ir kad „niekada pastaraisiais dešimtmečiais nebuvo planuota, organizuotas išslaptinimo darbas taip, kaip vyksta dabar“.

Svarbiausia yra tai, kad iš karto po išslaptinimo archyvinius dokumentus bus galima rasti oficialioje Rusijos archyvo svetainėje, kuriai jau sukurta speciali duomenų bazė.

Tarp jau išslaptintų archyvų yra medžiagos, kurią šalies ir užsienio istorikai jau seniai laižo lūpomis: 1400 unikalių Stalino direktyvų, štabo įsakymų, fronto įsakymų, operatyvinių žemėlapių, to meto rezoliucijų ir nuotraukų, kurios iki šiol buvo saugomos. archyvuose su antrašte „visiškai slapta“.

Galima tik nuoširdžiai pasidžiaugti istorikais, palinkėti šviežių ir įdomių darbų, kurie bus paremti minėtais dokumentais, tačiau tik išslaptinimas palies ne vieną karinę-istorinę temą.

Rosarkhivui artimas šaltinis pateikia įdomių detalių: „Kiek žinau iš archyvų skyriaus informacijos, mes kalbame apie laikotarpį nuo 1930 iki 1989 m. Būna atvejų, atleiskite, informatoriai – ir nekalti represuoti asmenys, labai įdomiomis pavardėmis. Bus duomenų apie kosmoso ir karinius pokyčius, apie kuriuos jau bus galima pranešti. Be to, išslaptinami duomenys apie mūšių eigą, įsakymus ir gautą žvalgybos informaciją Didžiojo Tėvynės karo metu, taip pat apie tarpvalstybinius santykius Šaltojo karo metais.

Ir labai stipriai priduria: „Kai kurie dokumentai nustebins visuomenę. Jūs turite žinoti savo istoriją, kad ir kokia ji būtų.

Archyvai turi ilgą atmintį ir gali turėti ne blogesnį užtaisą nei vandenilinė bomba. Neatsitiktinai mūsų šalyje „maršalų byla“ ir „gydytojų byla“ ir toliau lieka įslaptintos, kuri ilgą laiką sudaro pagrindą įvairiausioms spekuliacijoms. Ne taip seniai Didžiojoje Britanijoje speciali komisija nagrinėjo archyvinius dokumentus, kurių slaptumo laikotarpis ėjo į pabaigą, tačiau remiantis duomenimis apie prieškario ryšius tarp britų žvalgybos ir nacių SD, buvo nuspręsta pratęsti slaptumo režimą. dar 50 metų.

Išlyga dėl „kai kurie dokumentai nustebins visuomenę“ buvo pareikšta neatsitiktinai. Devintojo dešimtmečio pabaigoje tiek Rusijoje, tiek buvusiose SSRS respublikose ant „demokratizacijos“ bangos į valdžią atėjo įvairūs žmonės.

Daugelis demonstruoja nuostabų politinį gyvybingumą, nepaisant akivaizdaus vadovo talento trūkumo ir tendencijos mokyti žmones apie demokratiją iš savo požiūrio taško.

Artimajame užsienyje buvę „liaudies frontų“ lyderiai, savo pasaulėžiūrą pakeitę iš antisovietinio į antirusišką, yra tvirtai prisirišę prie valdžios ir iš savo teritorijos vykdo nedraugišką politiką Rusijai – nuo ​​įvairiausių kongresų organizavimo. atimta teisė iš „Atviros Rusijos“ mokyti profašistinius kovotojus ir teikti karinę pagalbą banderaičiams.

Europos bendruomenei ir šių ribotrofų piliečiams bus įdomu iš išslaptintų Federalinio archyvo dokumentų sužinoti, kurie iš registruotų „eurodemokratų“ buvo KGB informatoriai. Žemė pilna gandų, kad ūkanotoje jaunystėje buvęs Lietuvos tautinio fronto lyderis Landsbergis ir dabartinė ponia prezidentė Dalia Grybauskaitė „beldė“ į KGB. Tikiu, kad dabar apie šią jų biografijos pusę bus galima sužinoti iš pirminio šaltinio.

Galite plepėti apie „seniai buvo ir tai netiesa“, „apaugo realybe“, kiek tik norite, tačiau nereikėtų nuvertinti griaunamosios tokių apreiškimų galios.

Galima prisiminti, kaip pernai įspūdingai buvo paviešintas Nacionalinės atminties instituto rastas dokumentų paketas apie Lecho Walesos (operacinio „Boleko“ priedanga) bendradarbiavimą jam vykdant veiklą Gdansko laivų statykloje. lenkų spauda. Informacinis sprogimas nepaliko akmenų ikonos „Stulpas Nr. 1“, „Solidarumo“ lyderis, Nobelio taikos premijos laureatas ir pirmasis antisovietinės Lenkijos prezidentas, atvaizde. Nuo šiol ir per amžius Walesa yra tik ūsuotas storas senukas, praėjusios eros griuvėsiai, kurių gėdą galite pamatyti savo akimis iš 17 kvitų, eksponuojamų tame pačiame Nacionalinės atminties institute už pinigų gavimą specialiosioms tarnyboms perduota informacija.

Belieka tik apgailestauti, kad archyvinė „bomba“ nesprogo prie agento „Boleko“ 1980-aisiais, kai jis ir jo „Solidarumas“, dirbdamas kartu su Vakarų žvalgybos tarnybomis, drebino socialistinę Lenkiją.

Atsidavusių šalies liberalų gali laukti daug įdomių staigmenų. Jų vingiuotas gyvenimo kelias daugeliu atžvilgių panašus į Walesos kelią į galios aukštumas. Deja, KGB neskubėjo atskleisti reformuotų informatorių dėl daugelio priežasčių, tarp kurių buvo ne mažiau svarbios ir etinės. Juk jei atskleisi agentą, ypač savanorišką, kas tada bendradarbiaus? Agentai, sugauti darantys nesąžiningus veiksmus ir šiuo pagrindu užverbuoti, labai toli nenuves.

Žiniasklaidoje sklinda neoficiali informacija, kad „žymūs liberaldemokratinio judėjimo veikėjai Rusijoje“ su sovietų žvalgybos tarnybomis bendradarbiavo savo noru, dėl savanaudiškų priežasčių: įdomių komandiruočių, karjeros, prestižinio darbo ir kt.

Galima tik įsivaizduoti, kokios žioplinės buvo įvairios rašytojų, teatro darbuotojų, kino kūrėjų kūrybinės asociacijos.

Daugelio SSRS ir sovietinės sistemos kritikų tėvai buvo ne tik žymūs partiniai ar ekonomikos veikėjai, bet ir tarnavo NKVD-MGB-KGB, netgi asmeniškai dalyvavo represijose.

Žinoma, vaikai nėra atsakingi už savo tėvus, bet sieloje pasidaro bjauru, kai perdažytos atžalos, kurios nenori prisiminti savo tėvų praeities, bet kažkada be jokios sąžinės graužaties pasinaudojo savo aukšta padėtimi kaip tramplinu į asmeninė šviesi ateitis, pradėkite demaskuoti ir nuplėšti viršelius.

Išslaptinti archyvai gali turėti įtakos jėgų pusiausvyrai sumuštoje Ukrainoje. Galima prisiminti, kaip daugybė Miroslavos Berdnik socialiniuose tinkluose paskelbtų dokumentų, susijusių su OUN vadovų bendradarbiavimu su MGB ir Vidaus reikalų ministerija, dar prieš Maidano pučą sukėlė Banderos gerbėjų raitymosi ir gerklės viduriavimo priepuolius. lavonų. Svidomitai keikė ir pavadino dokumentų kopijas „FSB klastotėmis“, tačiau negalėjo ginčytis jokiais argumentais.

Kodėl tai svarbu? Ukrainiečių radikalus nacionalizmas yra blogis be jokių išlygų. Tačiau tai išpažįsta įvairūs žmonės. Tarp šiuolaikinių OUN narių yra jų idealistų, kurie nori išvalyti ukrainiečių nacionalizmą nuo bjauriausių Banderos ir Šuchevičiaus veikėjų, nes jie jau seniai neatšaukiamai susikompromitavo kaip Hitlerio marionetės ir baudžiamosios jėgos. Kaip ten bebūtų, pokario sovietų žvalgyba puikiai suprato vokiečių nacionalistų, kurie aiškiai atsiskyrė nuo nacių ir amerikiečiams papuolusio generolo Gehlen šalininkų, jausmus. Vokiečių nacionalistai, kurie Bismarką laikė savo stabu, išgyvenę karo baisumus ir matydami, kaip amerikiečiai stumia Vokietiją į naują karą su SSRS, pasirinko dirbti sovietų ir Rytų Vokietijos žvalgybai. Į šį momentą tikrai verta atsižvelgti.

Kita vertus, Ukrainoje pilna karštų neobanderistų, kurie nepatiria perteklinio pasibjaurėjimo, kurie nebijo jokių dokumentinių įrodymų apie savo stabų bendradarbiavimą su Hitlerio specialiosiomis tarnybomis. O jei bus paskelbti išslaptinti dokumentai, kuriuose teigiama, kad jų stabai, kaip Vasilis Kukas, nutekino MGB informaciją apie talpyklose sėdinčius „brolius“?

Jei staiga paaiškėtų, kad visokie vėlyvojo sovietmečio „teisių aktyvistai“ ir „nepriklausomi“ pasibeldė į KGB, norėdami sušvelninti kalėjimo režimą, už papildomą taukų siuntinį iš namų ar pakelį šapalų iš lagerio prekystalio? Ar Banderos „spilnota“, visur matanti ilgą Maskvos, FSB ir asmeniškai Putino ranką, atlaikys tokį įsitikinimų stiprumo išbandymą?

Tokio pobūdžio informacija gali sukelti galingą termobranduolinės plazmos išsiskyrimą iš Svidomo doupas, kurių savininkai gali pasigirti „nacionaliniu grynumu“ ir „Svidomo“. Kai kuriems stabų apreiškimai gali priversti juos atsitraukti ir susivokti.

Būtų įdomu sužinoti apie dvigubą apsišaukėlių „Majlis“ vadų gyvenimą ir kitus bjaurius veikėjus, kurie merdi po savęs primesta „tautos sąžinės“ našta.

Taigi, po kieno asmenine užnugaris sprogs pirmoji archyvinė „bomba“? Kas bus „lokomotyvas“, išvyniojantis ilgą apreiškimų grandinę?


*Yra dvi 42.zip versijos: senoji yra 42 374 baitų, o naujesnė - 42 838 baitų. Skirtumas tas, kad prieš išpakuojant naują reikalauja slaptažodžio. Mes lyginame tik su senąja versija. Čia yra failo kopija, jei jos reikia: 42.zip.

Zip bombos turi įveikti faktą, kad dažniausiai analizatorių palaikomas glaudinimo algoritmas DEFLATE negali viršyti 1032:1 glaudinimo koeficiento. Dėl šios priežasties zip bombos paprastai remiasi rekursiniu išglaudinimu, zip failų įdėjimu į ZIP failus, kad gautų papildomos naudos. koeficientas 1032 kiekvienam sluoksniui. Tačiau šis triukas veikia tik tais atvejais, kai išpakuojamas rekursyviai, o dauguma to nedaro. Garsiausia 42.zip bomba išsiplečia iki didžiulio 4,5 PB, jei visi šeši sluoksniai yra rekursyviai išspausti, tačiau viršutiniame sluoksnyje ji turi menką 0,6 MB. Užtrauktukai, kaip ir Coxo ir Ellingseno, sukuria savo kopiją ir taip be galo išsiplečia, kai rekursyviai ištraukiami. Tačiau išpakuoti jie taip pat yra visiškai saugūs.

Šiame straipsnyje parodyta, kaip sukurti nerekursyvią zip bombą, kurios glaudinimo koeficientas viršija 1032 DEFLATE ribą. Jis veikia perdengdamas failus zip konteineryje, kad būtų nurodyta labai suspaustų duomenų „šerdis“ keliuose failuose, nedarant kelių kopijų. Užtrauktuko bombos išvesties dydis didėja kvadratiškai didėjant įvesties dydžiui; tai yra, suspaudimo laipsnis gerėja didėjant bombos dydžiui. Dizainas priklauso nuo zip ir DEFLATE savybių: jis tiesiogiai neperkeliamas į kitus failų formatus ar glaudinimo algoritmus. Bomba yra suderinama su dauguma ZIP failų analizatorių, išskyrus "srautinį" analizatorių, kurie išanalizuoja failus vienu žingsniu, netikrindami centrinio ZIP failo katalogo. Bandome subalansuoti du prieštaraujančius tikslus:

  • Padidinkite suspaudimo laipsnį. Suspaudimo laipsnį apibrėžiame kaip visų archyve esančių failų dydžių sumą, padalytą iš paties ZIP failo dydžio. Tai neatsižvelgia į failų pavadinimus ar kitus failų sistemos metaduomenis, tik į turinį.
  • Išlaikyti suderinamumą. „Zip“ yra sudėtingas formatas, o analizatoriai skiriasi, ypač kraštinėse situacijose ir papildomose funkcijose. Nenaudokite metodų, kurie veikia tik su tam tikrais analizatoriais. Nurodysime keletą būdų, kaip patobulinti užtrauktuko bombą, prarandant suderinamumą.

Zip failo struktūra

ZIP failą sudaro centrinis katalogas nuorodos į failus.

Centrinis katalogas yra ZIP failo pabaigoje. Tai yra sąrašas centrinio katalogo antraštės. Kiekvienoje centrinio katalogo antraštėje yra vieno failo metaduomenys, pvz., failo pavadinimas ir CRC-32 kontrolinė suma, taip pat atgalinė rodyklė į vietinio failo antraštę. Centrinio katalogo antraštė yra 46 baitų ilgio ir failo pavadinimo ilgis.

Failas susideda iš vietinės failo antraštės, po kurios pateikiami suspausti failo duomenys. Vietinio failo antraštės ilgis yra 30 baitų ir failo pavadinimo ilgis. Jame yra perteklinė metaduomenų kopija iš centrinio katalogo antraštės, taip pat už jos esančių suspaustų ir nesuspaustų duomenų failų dydžiai. Zip yra konteinerio formatas, o ne glaudinimo algoritmas. Kiekvieno failo duomenys suglaudinami naudojant metaduomenyse nurodytą algoritmą – paprastai DEFLATE.

Šiame zip formato aprašyme praleista daug detalių, kurių nereikia norint suprasti užtrauktuko bombą. Išsamios informacijos ieškokite skyrelyje 4.3 APPNOTE.TXT arba Floriano Buchholzo „PKZip failo struktūra“, arba žr.

Didelis perteklius ir daug neaiškumų zip formate atveria galimybes įvairiems piktadarysčiams. Bomba su užtrauktuku yra tik ledkalnio viršūnė. Nuorodos tolimesniam skaitymui:

$ python3 -m zipfile -e overlap.zip . Traceback (paskutinis skambutis): ... __main__.BadZipFile: Failo pavadinimas kataloge "B" ir antraštė b"A" skiriasi.
Toliau apžvelgsime, kaip pakeisti failo pavadinimo nuoseklumą, išsaugant daugumą sutampančių failų privalumų.

Antrasis atradimas: vietinių failų antraščių citavimas

Turime padalinti kiekvieno failo vietines failų antraštes, pakartotinai naudojant vieną branduolį. Paprasčiausias visų antraščių sujungimas neveikia, nes zip analizatorius suras vietinę failo antraštę, kurioje tikisi, kad prasidės srautas DEFLATE. Tačiau su nedideliais pakeitimais idėja veiks. Naudosime nesuspaustų blokų funkciją DEFLATE, norėdami „cituoti“ vietinių failų antraštes, kad jos atrodytų kaip dalis to paties DEFLATE srauto, kuris patenka į branduolį. Kiekviena vietinio failo antraštė (išskyrus pirmąją) bus interpretuojama dviem būdais: kaip kodas (zip failo struktūros dalis) ir kaip duomenys (failo turinio dalis).

DEFLATE srautas yra blokų seka, kurioje kiekvienas blokas gali būti suspaustas arba nesuspaustas. Paprastai galvojame tik apie suspaustus blokus, pavyzdžiui, branduolys yra vienas didelis suspaustas blokas. Tačiau yra ir nesuspaustų, kurios prasideda 5 baitų antrašte su ilgio lauku, o tai tiesiog reiškia: „atspausdinkite n baitų pažodžiui“. Nesuglaudinto bloko išglaudinimas reiškia tik 5 baitų antraštės pašalinimą. Suspaustus ir nesuspaustus blokus galima laisvai maišyti DEFLATE sraute. Išvestis yra visų blokų išpakavimo eilės tvarka rezultatų sujungimas. Sąvoka „nesuspausta“ turi reikšmę tik DEFLATE lygiu; failo duomenys vis tiek laikomi „suspaustais“ zip lygiu, nesvarbu, kokie blokai naudojami.

Lengviausias būdas galvoti apie šią struktūrą yra kaip vidinį sutapimą, nuo paskutinio failo iki pirmojo. Pradedame įterpdami branduolį, kuris sudarys kiekvieno failo duomenų failo pabaigą. Antraštės pridėjimas prie vietinio LFH failo N ir centrinio katalogo CDH antraštė N, o tai nurodo. Nustatykite „suspausto dydžio“ metaduomenų lauką į LFH N ir C.D.H. N už suspausto branduolio dydį. Dabar pridedame 5 baitų nesuspausto bloko antraštę (schemoje žalia spalva), kurios ilgio laukas lygus LFH dydžiui N. Pridėkite antrą antraštę prie vietinio LFH failo N−1 ir centrinio katalogo CDH antraštė N−1, kuris nurodo jį. Nustatykite metaduomenų lauką „suspaustas dydis“ kaip naują suglaudinto branduolio dydžio antraštę pliusas nesuspausto bloko antraštės dydis (5 baitai) pliusas dydis LFH N .

Šiuo metu zip faile yra du failai, pavadinti Y ir Z. Pažiūrėkime, ką analizatorius matys analizuodamas. Tarkime, kad suspausto branduolio dydis yra 1000 baitų, o LFH dydis yra N- 31 baitas. Pradėkime nuo CDH N−1 ir sekite žymeklį į LFH N−1. Pirmojo failo pavadinimas yra Y, o suspaustų duomenų failo dydis yra 1036 baitai. Kitus 1036 baitus interpretuodami kaip DEFLATE srautą, pirmiausia susiduriame su 5 baitų nesuspausto bloko antrašte, kuri nurodo mums nukopijuoti kitus 31 baitą. Parašykite kitus 31 baitą, kurie yra LFH N, kurį išskleidžiame ir pridedame prie failo Y. Judėdami toliau DEFLATE sraute, randame suspaustą bloką (brandulį), kurį išskleidžiame į failą Y. Dabar pasiekėme suspaustų duomenų pabaigą ir baigėme su failu Y.

Pereidami prie kito failo, sekame rodyklę iš CDH Nį LFH N ir suraskite failą pavadinimu Z, kurio suglaudintas dydis yra 1000 baitų. Šiuos 1000 baitų interpretuodami kaip DEFLATE srautą, iškart susiduriame su suspaustu bloku (vėl branduoliu) ir išskleiskite jį į failą Z. Pasiekėme galutinio failo pabaigą ir baigėme. Išvesties faile Z yra išpakuotas branduolys; išvesties failas Y yra tas pats, bet papildomai su 31 baitu LFH N .

Projektavimą užbaigiame kartodami citavimo procedūrą, kol zip archyve bus reikalingas failų skaičius. Kiekvienas naujas failas prideda centrinio katalogo antraštę, vietinio failo antraštę ir nesuspaustą bloką, kad pacituotų iš karto po to sekančią vietinio failo antraštę. Suglaudinto failo duomenys paprastai yra nesuspaustų DEFLATE blokų (cituotų vietinių failų antraštės) grandinė, po kurios seka suspaustas branduolys. Kiekvienas branduolio baitas įneša apie 1032 Nį išvesties dydį, nes kiekvienas baitas yra viso dalis N failus. Išvesties failai taip pat yra skirtingų dydžių: ankstesni failai yra didesni nei vėlesni, nes juose daugiau cituojamos vietinių failų antraštės. Išvesties failų turinys neturi didelės prasmės, bet niekas nesakė, kad jie turi būti prasmingi.

Ši sutapimo citatų konstrukcija yra geriau suderinama nei ankstesniame skyriuje pateikta visa persidengimo konstrukcija, tačiau suderinamumas yra suglaudinimo kaina. Ten kiekvienas pridėtas failas kainuoja tik centrinio katalogo antraštę, čia – centrinio katalogo antraštę, vietinio failo antraštę ir dar 5 baitus už citatos antraštę.

Optimizavimas

Gavę pagrindinį užtrauktuko bombos dizainą, pasistengsime, kad jis būtų kuo efektyvesnis. Norime atsakyti į du klausimus:
  • Koks yra maksimalus glaudinimo koeficientas tam tikram zip failo dydžiui?
  • Koks yra didžiausias suspaudimo laipsnis, atsižvelgiant į ZIP formato apribojimus?

Branduolio suspaudimas

Mums naudinga kiek įmanoma labiau suspausti branduolį, nes kiekvienas išpakuotas baitas dauginamas iš N. Šiuo tikslu naudojame pasirinktinį DEFLATE kompresorių, vadinamą bulk_deflate, kuris specializuojasi glaudinant pasikartojančių baitų eilutę.

Visi padorūs DEFLATE archyvatoriai pasiekia 1032 glaudinimo koeficientą begaliniame pasikartojančių baitų sraute, tačiau mums rūpi konkretus dydis. Mūsų archyvo dydžiui bulk_deflate telpa daugiau duomenų nei bendrosios paskirties archyvuose: apie 26 KB daugiau nei zlib ir Info-ZIP ir apie 15 KB daugiau nei Zopfli, todėl greitis aukojamas dėl glaudinimo kokybės.

Didelio bulk_deflate suspaudimo kaina yra universalumo trūkumas. Jis gali suspausti tik pasikartojančių baitų eilutes ir tik tam tikrą ilgį, būtent 517 + 258 k sveikajam skaičiui k≥ 0. Be gero suspaudimo, bulk_deflate yra greitas, užduotį užbaigiant iš esmės per tiek pat laiko, nepaisant įvesties duomenų dydžio, neskaičiuojant faktinio suglaudintos eilutės rašymo darbo.

Failų pavadinimai

Mūsų tikslams failų pavadinimai yra praktiškai nereikšmingi. Nors jie prisideda prie išvesties dydžio būdami vietinių failų kabutėse antraštėse, baitas failo pavadinime yra daug mažesnis nei branduolio baitas. Norime, kad failų pavadinimai būtų kuo trumpesni, bet skirtingi, nepamirštant suderinamumo.

Kiekvienas failo pavadinimui išleistas baitas reiškia du branduoliui neišleistus baitus (du, nes kiekvienas failo pavadinimas pasirodo du kartus: centrinio katalogo antraštėje ir vietinio failo antraštėje). Failo pavadinimo baitas duoda tik vidurkį ( N+ 1) / 4 išvesties baitai, o baitas branduolyje skaičiuojamas kaip 1032 N. Pavyzdžiai: , , .

Pirmasis suderinamumo aspektas yra kodavimas. ZIP formato specifikacijose teigiama, kad failų pavadinimai turi būti interpretuojami kaip CP 437 arba UTF-8, jei nustatytas tam tikras vėliavėlės bitas (APPNOTE.TXT, D priedas). Tai yra pagrindinis zip analizatorių nesuderinamumo taškas, kuris gali interpretuoti failų pavadinimus tam tikroje fiksuotoje arba lokalei būdingoje koduotėje. Todėl, siekiant suderinamumo, geriau apsiriboti simboliais su ta pačia koduote tiek CP 437, tiek UTF-8. Būtent, tai yra 95 spausdinami US-ASCII simboliai.

Mums taip pat taikomi failų sistemos pavadinimų apribojimai. Kai kuriose failų sistemose didžiosios ir mažosios raidės neskiriamos, todėl „a“ ir „A“ nelaikomi skirtingais pavadinimais. Įprastos failų sistemos, pvz., FAT32, neleidžia naudoti tam tikrų simbolių, tokių kaip „*“ ir „?“.

Kaip saugus, bet nebūtinai optimalus kompromisas, mūsų ZIP bomba naudos failų pavadinimus iš 36 simbolių abėcėlės, kuri neapima specialiųjų arba mišrių didžiųjų ir mažųjų raidžių:

0 1 2 3 4 5 6 7 8 9 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
Failų pavadinimai generuojami akivaizdžiai, visos pozicijos eilės tvarka, ciklo pabaigoje pridedant poziciją:

„0“, „1“, „2“, ..., „Z“, „00“, „01“, „02“, ..., „0Z“, ..., „Z0“, „Z1“ ", "Z2", ..., "ZZ", "000", "001", "002", ...
Yra 36 failų pavadinimai, kurių ilgis yra vienas simbolis, 36² failų pavadinimai, kurių ilgis yra du simboliai ir pan. Keturių baitų pakanka 1 727 604 skirtingiems failų pavadinimams.

Atsižvelgiant į tai, kad failų pavadinimai archyve paprastai būna skirtingo ilgio, koks yra geriausias būdas juos užsisakyti: nuo trumpiausio iki ilgiausio ar atvirkščiai? Jei šiek tiek pagalvoji, ilgiausius vardus geriau palikti paskutiniais. Šis užsakymas į zblg.zip prideda daugiau nei 900 MB išvesties, palyginti su užsakymu nuo ilgiausio iki trumpiausio. Tačiau tai yra nedidelis optimizavimas, nes 900 MB yra tik 0,0003% viso išvesties dydžio.

Branduolio dydis

Sutampančių citatų dizainas leidžia saugoti suspaustą duomenų šerdį ir daug kartų pigiai kopijuoti. Tam tikram zip failo dydžiui X, kiek vietos optimaliausia skirti branduolio saugojimui, o kiek kopijoms kurti?

Norint rasti optimalų balansą, reikia optimizuoti tik vieną kintamąjį N, failų skaičius ZIP archyve. Kiekviena vertė N reikalauja tam tikros pridėtinės vertės centrinio katalogo antraštėms, vietinėms failų antraštėms, citatų blokų antraštėms ir failų pavadinimams. Visą likusią erdvę užims šerdis. Nes N turi būti sveikasis skaičius ir galite tilpti tik tam tikrą failų skaičių, kol branduolio dydis nukris iki nulio, tiesiog patikrinkite visas įmanomas reikšmes N ir pasirinkti tai, kas duoda didžiausių rezultatų.

Taikant optimizavimo procedūrą X= 42 374 už 42.zip randa didžiausią N= 250. Šiems 250 failų reikia 21 195 baitų pridėtinės vertės, o branduoliui lieka 21 179 baitai. Tokio dydžio branduolys suglaudinamas iki 21 841 249 baitų (santykis 1031,3 su 1). 250 neišpakuoto branduolio kopijų ir kai kurių cituojamų vietinių failų antraščių bendra išpakuota išvestis yra 5 461 307 620 baitų ir 129 000 glaudinimo koeficientas.

CRC-32 gali būti modeliuojamas kaip būsenos mašina, kuri atnaujina 32 bitų būsenos registrą kiekvienam įvesties bitui. Pagrindinės 0 ir 1 bitų atnaujinimo operacijos yra šios:

Uint32 crc32_update_0(uint32 būsena) ( // Išstumkite mažiausiai reikšmingą bitą. bitas b = būsena & 1; būsena = būsena >> 1; // Jei išstumtas bitas buvo 1, XOR su CRC-32 konstanta. if (b == 1) būsena = būsena ^ 0xedb88320; grįžti būsena; ) uint32 crc32_update_1 (uint32 būsena) ( // Atlikite kaip 0 bitų atveju, tada XOR su CRC-32 konstanta. return crc32_update_0(state) ^ 0xedb8
Jei būsenos registrą pateikiate kaip 32 elementų dvejetainį vektorių ir sudėti bei dauginti naudojate XOR, tada crc32_update_0 yra tiesinis atvaizdavimas; tai yra, jis gali būti pavaizduotas kaip padauginimas iš 32x32 dvejetainės perėjimo matricos. Norėdami suprasti, kodėl, atkreipkite dėmesį, kad matricos vektoriaus daugyba yra tiesiog matricos stulpelių sumavimas, padauginus kiekvieną stulpelį iš atitinkamo vektoriaus elemento. Poslinkio veikimo būsena >> 1 tiesiog užima kiekvieną bitą i būsenos vektorių ir padaugina jį iš vektoriaus, kuris visur, išskyrus bitą, yra lygus nuliui i− 1 (bitų numeracija iš dešinės į kairę). Santykinai kalbant, galutinė XOR būsena ^ 0xedb88320 atsiranda tik tada, kai bitas b yra lygus vienetui. Galima manyti, kad tai pirmiausia b padauginama iš 0xedb88320, o tada XOR perkeliama į tą būseną.

Be to, crc32_update_1 yra tik crc32_update_0 ir (XOR) konstanta. Dėl to crc32_update_1 yra afininė transformacija: matricos dauginimas, po kurio seka atvaizdavimas (t. y. vektoriaus pridėjimas). Matricos dauginimą ir atvaizdavimą galime pavaizduoti vienu žingsniu, jei padidinsime transformacijos matricos matmenis iki 33x33 ir prie būsenos vektoriaus pridėsime papildomą elementą, kuris visada lygus 1 (šis vaizdavimas vadinamas homogeninėmis koordinatėmis).


33×33 transformacijos matricos M 0 ir M 1, kurios apskaičiuoja CRC-32 būsenos pokytį atitinkamai bitais 0 ir 1. Stulpelių vektoriai saugomi su reikšmingiausiu bitu apačioje: skaitydami pirmąjį stulpelį iš apačios į viršų, matote CRC-32 polinomo konstantą edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2 . Šios dvi matricos skiriasi tik paskutiniame stulpelyje, kuris reiškia vertimo vektorių vienodomis koordinatėmis. M 0 vertimas yra lygus nuliui, o M 1 - edb88320 16, CRC-32 daugianario konstanta. Tiesiai virš įstrižainės rodo veikimo būseną >> 1

Abi operacijos crc32_update_0 ir crc32_update_1 gali būti pavaizduotos 33x33 perėjimo matrica. Rodomos matricos M 0 ir M 1. Matricos vaizdavimo pranašumas yra tas, kad matricas galima dauginti. Tarkime, kad norime pamatyti būsenos pokytį, gautą apdorojant ASCII simbolį „a“, kurio dvejetainis vaizdas yra 01100001 2 . Mes galime pavaizduoti šių aštuonių bitų CRC-32 būsenos pokytį vienoje transformacijos matricoje:


Ir mes galime įsivaizduoti pasikartojančių „a“ eilutės būsenos pasikeitimą, padauginus daugybę M a kopijų - matricos pakėlimas į laipsnį. Tai galime padaryti greitai naudodami greitojo eksponencijos algoritmą, kuris leidžia apskaičiuoti M n tik log 2 n žingsniais. Pavyzdžiui, čia yra 9 „a“ simbolių eilutės būsenos keitimo matrica:
Greitas matricos daugybos algoritmas yra naudingas apskaičiuojant M branduolį, nesuspausto branduolio matricą, nes branduolys yra pasikartojančių baitų eilutė. Norėdami gauti CRC-32 kontrolinę sumą iš matricos, padauginkite matricą iš nulinio vektoriaus (nulio vektorius yra vienodose koordinatėse, tai yra, 32 nuliai, o tada vienas; čia mes praleidžiame nedidelę prieš ir po jo trukmę). apdorojant kontrolinę sumą, kad būtų galima suderinti). Norėdami apskaičiuoti kiekvieno failo kontrolinę sumą, dirbame atgal. Pradėkime nuo inicijavimo M:=M branduolys. Branduolio kontrolinė suma taip pat yra paskutinė failo kontrolinė suma N, todėl dauginame Mį nulinį vektorių ir gautą kontrolinę sumą išsaugokite CDH N ir LFH N. Failo duomenys N−1 tas pats kaip failo failo duomenys N, bet pridėtas priešdėlis LFH N. Todėl apskaičiuojame LFH N būsenos kitimo matricą ir ją atnaujiname. Dabar M reiškia kaupiamąjį būsenos pokytį nuo gydymo LFH N vienam branduoliui. Apskaičiuokite failo kontrolinę sumą N−1, vėl dauginant M iki nulinio vektoriaus. Tęsiame procedūrą, kaupdami būsenos keitimo matricas M kol visi failai bus apdoroti.

Pratęsimas: Zip64

Anksčiau susidūrėme su išplėtimo problema dėl zip formato apribojimų – buvo neįmanoma išvesti daugiau nei 281 TB, kad ir kaip gudriai supakuotas zip failas. Šiuos apribojimus galima įveikti naudojant Zip64 – zip formato plėtinį, kuris padidina kai kurių antraštės laukų dydį iki 64 bitų. Zip64 palaikymas jokiu būdu nėra universalus, tačiau tai vienas dažniausiai įdiegtų plėtinių. Kalbant apie glaudinimo koeficientą, Zip64 padidina centrinio katalogo antraštės dydį nuo 46 iki 58 baitų, o vietinio katalogo antraštės dydį - nuo 30 iki 50 baitų. Žvelgdami į optimalaus išsiplėtimo koeficiento formulę supaprastintame modelyje, matome, kad Zip64 užtrauktuku bomba vis tiek auga kvadratiškai, bet lėčiau dėl didesnio vardiklio – kaip matyti toliau pateiktoje diagramoje. Dėl prarasto suderinamumo ir lėtesnio augimo pašalinami beveik visi failo dydžio apribojimai.

Tarkime, kad norime zip bombos, kuri išsiplečia iki 4,5 PB kaip 42.zip. Kokio dydžio turėtų būti archyvas? Naudodami dvejetainę paiešką nustatome, kad mažiausias tokio failo dydis yra 46 MB.

  • zbxl.zip 46 MB → 4,5 PB (Zip64, mažiau suderinama)
zipbomb --mode=quoted_overlap --num-files=190023 --compressed-size=22982788 --zip64 > zbxl.zip
4,5 petabaitų – maždaug tiek duomenų, kuriuos „Event Horizon Telescope“ užfiksavo pirmajam juodosios skylės vaizdui: duomenų centre esančių standžiųjų diskų stelažai ir stelažai.

Naudojant Zip64, beveik nebeįdomu galvoti apie maksimalų glaudinimo laipsnį, nes galime tiesiog didinti zip failo dydį ir suspaudimo koeficientą, kol net suspaustas ZIP failas tampa pernelyg didelis. Tačiau įdomi riba yra 2 64 baitai (18 EB arba 16 EiB) – tai nėra daug duomenų, kurie tilps daugelyje failų sistemų. Dvejetainė paieška randa mažiausią zip bombą, kuri sukuria bent tiek išvesties: joje yra 12 milijonų failų ir 1,5 GB suglaudintas branduolys. Bendras ZIP failo dydis yra 2,9 GB ir jis išskleidžiamas į 264+11727895877 baitus, o glaudinimo koeficientas yra didesnis nei 6,2 mlrd. Aš nepadariau šio failo atsisiuntimo, bet galite jį sugeneruoti patys naudodami . Jo failai tokie dideli, kad buvo aptikta net „Info-ZIP UnZip 6.0“ klaida.

Zipbomb --mode=quoted_overlap --num-files=12056313 --compressed-size=1482284040 --zip64 > zbxxl.zip

Plėtinys: bzip2

DEFLATE yra labiausiai paplitęs ZIP formato glaudinimo algoritmas, tačiau tai tik viena iš daugelio parinkčių. Tikriausiai antras labiausiai paplitęs algoritmas yra bzip2. Nors jis nėra toks suderinamas kaip DEFLATE. Teoriškai bzip2 maksimalus suspaudimo koeficientas yra apie 1,4 milijono su vienu, o tai leidžia tankiau supakuoti branduolį.

Bzip2 pirmiausia užkoduoja run-length kodavimą, sumažindamas pasikartojančių baitų eilutės ilgį 51 kartą. Tada duomenys suskirstomi į 900 KB blokus ir kiekvienas blokas suglaudinamas atskirai. Teoriškai vieną bloką galima suspausti iki 32 baitų. 900 000 × 51 / 32 = 1 434 375.

Nekreipiant dėmesio į suderinamumo praradimus, ar bzip2 yra efektyvesnė bomba?

Taip, bet tik mažiems failams. Problema ta, kad bzip2 neturi nieko panašaus į nesuspaustus DEFLATE blokus, kuriuos naudojome cituodami vietinių failų antraštes. Taigi neįmanoma sutapti failų ir pakartotinai panaudoti branduolį – kiekvienas failas turi parašyti savo kopiją, todėl bendras suspaudimo koeficientas nebus geresnis už bet kurio atskiro failo santykį. Toliau pateiktoje diagramoje matome, kad be persidengimo bzip2 pranoksta DEFLATE tik maždaug megabaitų dydžio failams.

Liko vienintelė viltis yra alternatyvi priemonė cituoti antraštes bzip2, kuri bus aptarta kitame skyriuje. Be to, jei žinote, kad tam tikras zip analizatorius palaiko bzip2 Ir leidžia failo pavadinimų neatitikimus, galite naudoti visą persidengimo konstrukciją, kurios cituoti nereikia.

Įvairių užtrauktukų bombų suspaudimo koeficientų palyginimas. Atkreipkite dėmesį į logaritmines ašis. Kiekvienas dizainas rodomas su Zip64 ir be jo. Konstrukcijos be persidengimo turi linijinį augimo greitį, kuris matyti iš pastovaus ašių santykio. Vertikalus bzip2 grafiko poslinkis reiškia, kad bzip2 suspaudimo laipsnis yra maždaug tūkstantį kartų didesnis nei DEFLATE. DEFLATE konstrukcijos su citatomis turi kvadratinį augimo tempą, tai rodo 2:1 nuolydis ašių atžvilgiu. „Zip64“ parinktis yra šiek tiek mažiau efektyvi, tačiau leidžia daugiau nei 281 TB. Bzip2 grafikai su citata per papildomą lauką pereina iš kvadratinio į tiesinį, kai pasiekiamas maksimalus failo dydis (2 32 -2 baitai) arba didžiausias leistinas failų skaičius

Plėtinys: cituojama per papildomą lauką

Iki šiol vietinių failų antraštėms cituoti naudojome funkciją DEFLATE, bet ką tik pamatėme, kad šis triukas neveikia bzip2. Tačiau yra alternatyvus citavimo metodas, šiek tiek labiau ribotas, kuris naudoja tik ZIP formato funkcijas ir nepriklauso nuo glaudinimo algoritmo.

Vietinės failo antraštės struktūros pabaigoje yra papildomas laukas kintamo ilgio informacijai, kuri netelpa į įprastus antraštės laukus, saugoti (APPNOTE.TXT, 4.3.7 skyrius). Papildoma informacija gali apimti, pavyzdžiui, laiko žymą arba uid/gid iš Unix. Zip64 informacija taip pat saugoma papildomame lauke. Papildomas laukas vaizduojamas kaip ilgio vertės struktūra; jei padidinsite ilgį nepridėdami reikšmės, papildomame lauke bus įtraukta tai, kas yra už jo ZIP faile, ty kita vietinio failo antraštė. Naudojant šį metodą, kiekviena vietinio failo antraštė gali „cituoti“ paskesnes antraštes, įtraukdama jas į savo papildomą lauką. Palyginti su DEFLATE, yra trys pranašumai:

  1. Cituojant per papildomą lauką reikia tik 4 baitų, o ne 5, todėl branduoliui lieka daugiau vietos.
  2. Tai nepadidina failo dydžio, o tai reiškia didesnį branduolio dydį, atsižvelgiant į zip formato apribojimus.
  3. Jame pateikiama citata bzip2.
Nepaisant šių pranašumų, citavimas per papildomus laukus yra ne toks lankstus. Tai nėra grandinė, kaip DEFLATE: kiekvienoje vietinio failo antraštėje turi būti ne tik iškart sekanti antraštė, bet ir Visi vėlesnėse antraštėse. Priartėjus prie ZIP failo pradžios, daugėja papildomų laukų. Kadangi didžiausias lauko ilgis yra 2 16–1 baitas, galite cituoti tik iki 1808 vietinių failų antraščių (arba 1170, jei naudojate Zip64), darant prielaidą, kad pavadinimai (DEFLATE atveju galite naudoti papildomą lauką, kad pacituotų pirmąjį (trumpiausias) vietinių failų antraštes, o tada perjunkite į citavimą DEFLATE). Kita problema: kad atitiktumėte papildomo lauko vidinę duomenų struktūrą, prieš citavimo duomenis turite pasirinkti 16 bitų tipo žymą (APPNOTE.TXT, 4.5.2 skyrius). Norime pasirinkti tipo žymą, dėl kurios analizatoriai nepaisys cituojamų duomenų, o ne bandys juos interpretuoti kaip reikšmingus metaduomenis. Zip analizatoriai turi nepaisyti nežinomo tipo žymų, todėl žymas galime pasirinkti atsitiktinai, tačiau yra rizika, kad ateityje kuri nors žyma sutrikdys dizaino suderinamumą.

Ankstesnė diagrama iliustruoja galimybę naudoti papildomus laukus bzip2 su Zip64 ir be jo. Abiejuose grafikuose yra vingio taškas, kuriame augimas pereina iš kvadratinio į tiesinį. Be Zip64 tai atsitinka, kai pasiekiamas didžiausias nesuspausto failo dydis (2 32–2 baitai); tada galite padidinti tik failų skaičių, bet ne jų dydį. Grafikas visiškai baigiasi, kai failų skaičius pasiekia 1809, tada pritrūksta vietos papildomame lauke cituoti papildomus pavadinimus. Naudojant Zip64, lūžio taškas įvyksta ties 1171 failu, po kurio galima padidinti tik failų dydį, bet ne skaičių. Papildomas laukas taip pat padeda DEFLATE atveju, tačiau skirtumas toks mažas, kad vizualiai nepastebimas. Tai padidina zbsm.zip suspaudimo laipsnį 1,2%; zblg.zip 0,019 %; ir zbxl.zip 0,0025 proc.

Diskusija

Dirbdami šia tema, Ploetzas ir jo kolegos naudoja failų sutapimą, kad sukurtų beveik savaime besikartojantį ZIP archyvą. Pačių failų sutapimą anksčiau (47 skaidrė) pasiūlė Ginvael Coldwind.

Siekdami atsižvelgti į suderinamumą – daugybę įgyvendinimo skirtumų, kai kurie iš jų pateikti toliau pateiktoje lentelėje, sukūrėme per daug nurodytą užtrauktuko bombos dizainą. Gautas dizainas yra suderinamas su zip analizatoriais, kurie veikia įprastu būdu, ty pirmiausia patikrindami centrinį katalogą ir naudodami jį kaip failo indeksą. Tarp jų yra unikalus zip analizatorius iš Nail, kuris automatiškai generuojamas iš formalios gramatikos. Tačiau dizainas nesuderinamas su „srautiniais“ analizatoriais, kurie išanalizuoja zip failą nuo pradžios iki pabaigos vienu žingsniu, prieš tai neperskaitę centrinio katalogo. Dėl savo pobūdžio srauto analizatoriai jokiu būdu neleidžia failų persidengimo. Greičiausiai jie ištrauks tik pirmąjį failą. Be to, jie netgi gali išmesti klaidą, kaip būna

Straipsnyje minimi 9 ZIP failų sluoksniai, todėl tai nėra paprastas nulių sulipimo atvejis. Kodėl 9, kodėl 10 failų kiekviename?

Pirma, Vikipedijos straipsnyje šiuo metu kalbama apie 5 sluoksnius iš 16 failų. Nežinau, kur atsiranda neatitikimas, bet tai ne viskas, kas svarbu. Tikrasis klausimas yra, kodėl pirmiausia reikia naudoti lizdus.

DEFLATE, vienintelis palaikomas ZIP failų* glaudinimo metodas, maksimalus glaudinimo koeficientas yra 1032. Tai galima pasiekti asimptotiškai bet kuriai pasikartojančiai 1–3 baitų sekai. Nesvarbu, ką darysite su ZIP failu, kol jis naudojamas tik su DEFLATE, išspausto failo dydis bus ne daugiau kaip 1032 kartus didesnis už pradinio ZIP failo dydį.

Todėl norėdami pasiekti tikrai nepaprastų glaudinimo koeficientų, turite naudoti įdėtus ZIP failus. Jei turite 2 suspaudimo sluoksnius, maksimalus santykis yra 1032^2 = 1065024. 3 atveju tai yra 1099104768 ir pan. 42.zip naudojamų 5 sluoksnių teorinis maksimalus suspaudimo laipsnis yra 1170572956434432. Kaip matote, tikrasis 42.zip dydis nė iš tolo neprilygsta šiam lygiui. Dalis to yra zip formato pridėtinės išlaidos, o dalis to, kad jiems tai nerūpi.

Jei reiktų spėlioti, sakyčiau, kad 42.zip susidarė sukuriant didelį tuščią failą ir vis kopijuojant bei kopijuojant. Jokiu būdu negalima peržengti formato apribojimų ar maksimaliai padidinti suspaudimą ar dar ką nors – jie tiesiog savavališkai pasirinko 16 kopijų vienam sluoksniui. Idėja buvo sukurti didelę naudingąją apkrovą be didelių pastangų.

Pastaba. Kiti glaudinimo formatai, tokie kaip bzip2, siūlo daug, daug, daug didesnį maksimalų glaudinimo koeficientą. Tačiau dauguma zip analizatorių jų nepriima.

P.S. Galite sukurti ZIP failą, kuris ištrauks savo kopiją (quine). Taip pat galite sukurti tokį, kuris išpakuotų kelias kopijas. Taigi, jei rekursyviai išskleiskite failą visam laikui, didžiausias galimas dydis yra begalinis. Vienintelis apribojimas yra tas, kad kiekvienoje iteracijoje jis gali padidėti ne daugiau kaip 1032.

P.P.S. Vertė 1032 daro prielaidą, kad zip failo duomenys nesutampa. Viena iš ZIP failo formato ypatybių yra ta, kad jame yra centrinis katalogas, kuriame pateikiami archyve esantys failai ir failų duomenų poslinkiai. Jei failuose sukuriate kelis įrašus, nukreipiančius į tuos pačius duomenis, galite pasiekti daug didesnį glaudinimo koeficientą net neįdėdami lizdų, tačiau zip failą greičiausiai atmes analizatoriai.

pasakyk draugams