Zip bomb, kā tas darbojas. Putina arhīva bumba. Wordpress mums ir piespriedis sodu

💖 Patīk? Kopīgojiet saiti ar draugiem
[Update] Tagad esmu kaut kādā izlūkdienestu sarakstā, jo uzrakstīju rakstu par kaut kādu "bumbu", vai ne?

Ja kādreiz esat mitinājis vietni vai administrējis serveri, droši vien labi zināt, kādi ļaunie cilvēki cenšas nodarīt ļaunu jūsu īpašumam.

Kad es pirmo reizi mitināju savu mazo Linux kastīti ar SSH piekļuvi 13 gadu vecumā, es paskatījos žurnālus un katru dienu redzēju IP adreses (galvenokārt no Ķīnas un Krievijas), kas mēģināja izveidot savienojumu ar manu jauko kastīti (kas patiesībā bija vecs ThinkPad T21 klēpjdators ar salauztu displeju, kas dūc zem gultas). Es ziņoju par šiem IP viņu interneta pakalpojumu sniedzējiem.

Faktiski, ja jums ir Linux serveris ar atvērtu SSH, jūs pats varat redzēt, cik savienojuma mēģinājumu notiek katru dienu:

Grep "autentifikācijas kļūmes" /var/log/auth.log


Simtiem neveiksmīgu autorizācijas mēģinājumu, lai gan serverim vispār nav paroles autorizācijas un tas darbojas nestandarta portā

Wordpress mums ir piespriedis sodu

Labi, jāatzīst, ka tīmekļa ievainojamības skeneri pastāvēja pirms Wordpress, taču pēc tam, kad platforma kļuva tik populāra, vairums skeneru sāka pārbaudīt, vai nav nepareizi konfigurētas wp-admin mapes un nelāpītu spraudņu.

Tātad, ja kāda jauna hakeru grupa vēlas iegūt jaunus kontus, viņi lejupielādēs kādu no šiem skenera rīkiem un palaidīs to daudzās vietnēs, cerot piekļūt kādai vietnei un to sabojāt.


Žurnālu paraugi, skenējot ar Nikto rīku

Tāpēc visi serveri un vietņu administratori apstrādā gigabaitus žurnālu, kas ir pilni ar rāpuļprogrammas mēģinājumiem. Tāpēc es domāju...

Vai varat sist pretī?

Pēc eksperimentēšanas ar potenciālo IDS vai Fail2ban izmantošanu man atgādināja vecās labās ZIP bumbas no pagātnes.

Kāda veida lieta ir ZIP bumba?

Kā izrādās, ZIP saspiešana lieliski palīdz tikt galā ar atkārtotiem datiem, tādēļ, ja jums ir milzu teksta fails, kas piepildīts ar atkārtotiem datiem, piemēram, visas nulles, tas ļoti labi saspiedīsies. Es domāju ĻOTI labi.

Kā parādīja 42.zip, ir iespējams saspiest 4,5 petabaitus (4 500 000 gigabaitus) 42 kilobaitos. Mēģinot skatīt arhīva saturu (izvilkt vai izpakot to), iespējams, tiks izmantota visa diska vieta vai RAM.

Kā nomest ZIP bumbu uz ievainojamības skenera?

Diemžēl tīmekļa pārlūkprogrammas nesaprot ZIP, bet tās saprot GZIP.

Tāpēc pirmā lieta, ko mēs darīsim, ir izveidot 10 GB GZIP failu, kas aizpildīts ar nullēm. Varat veikt daudzas ligzdotas saspiešanas, taču sāksim ar vienkāršu.

Dd ja=/dev/nulle bs=1M skaits=10240 | gzip > 10G.gzip


Bumbas būvēšana un tās izmēra pārbaude

Kā redzat, tā izmērs ir 10 MB. Varēja būt nedaudz ciešāk, bet pagaidām ar to pietiek.

Tagad instalēsim PHP skriptu, kas to piegādās klientam.

Gatavs!

Tagad mēs to varam izmantot kā vienkāršu aizsardzību:

Acīmredzot šis skripts nav nekāda elegance, bet var mūs pasargāt no jau iepriekš pieminētajiem skriptu bērniem, kuriem vispār nav ne jausmas, ka rāpuļprogrammās ir iespējams mainīt user-agent.

Tātad... Kas notiks, ja palaižat šo skriptu?


(Ja jūs pārbaudījāt bumbu citās ierīcēs/pārlūkprogrammās/skriptos, lūdzu

Viens ļoti interesants un svarīgs notikums notika klusi un nemanāmi apvainotajam. Krievijas prezidents Vladimirs Putins tikās un runāja ar vienu no civildienesta vadītājiem, kura vārds presē parādās reti. Nē, šī persona nav slepenais aģents, lai gan pēc savas darbības būtības viņam ir pieejama klasificēta informācija, un to pat var uzskatīt par sava veida "neredzamās frontes cīnītāju". Kopumā Putins runāja ar Federālās arhīvu aģentūras vadītāju Andreju Artizovu.

Valsts vadītāja un aģentūras vadītāja saruna bijusi lietišķa rakstura, kuras iespējamās sekas vietām varēja izraisīt sprāgstoša bumbas efektu, atsevišķos gadījumos pat personīgā sprauslas detonāciju.

Prezidents izteica zemu rezonansi, ka nolēmis atslepenot daudzus arhīvu dokumentus, turklāt dekrēts tiks parakstīts tajā pašā dienā. Turklāt Putins paziņoja par Rosarkhiv nodošanu tiešā Krievijas prezidenta pakļautībā, jo daudziem departamenta materiāliem "ir īpaša vērtība un globāla nozīme".

Aģentūras vadītājs savukārt informēja prezidentu, ka Krievijas arhīva fondā glabājas 500 miljoni lietu un ka "pēdējo gadu desmitu laikā nekad nav bijis plānots, organizēts darbs pie atslepenošanas tā, kā tas tiek darīts tagad".

Galvenais ir tas, ka tūlīt pēc deklasificēšanas arhīvu dokumenti būs pieejami Krievijas arhīva oficiālajā tīmekļa vietnē, kam jau ir izveidota īpaša datubāze.

Starp jau atslepenotajiem arhīviem ir materiāli, kurus pašmāju un ārvalstu vēsturnieki jau sen laizīja lūpas: 1400 unikālas Staļina direktīvas, štāba pavēles, frontes pavēles, operāciju kartes, rezolūcijas un tā laika fotogrāfijas, kas līdz nesenam laikam glabājās arhīvu sadaļā "Slepens".

Var tikai no sirds priecāties par vēsturniekiem, novēlēt svaigus un interesantus darbus, kuru pamatā būs minētie dokumenti, bet tikai atslepenošana neskars nevienu militāri vēsturisku tēmu.

Interesantas detaļas sniedz kāds Krievijas arhīvam tuvs avots: “Cik man zināms no arhīva daļas, runa ir par laika posmu no 1930. līdz 1989. gadam. Ir gadījumi, atvainojiet, ziņotāju - kā arī nevainīgi represēto, ar ļoti interesantiem uzvārdiem. Būs dati par kosmosa un militāro attīstību, par kuriem jau var ziņot. Turklāt tiek atslepenoti dati par kauju gaitu, pavēlēm un saņemto izlūkdienestu Lielā Tēvijas kara laikā, kā arī par starpvalstu attiecībām aukstā kara laikā.

Un ļoti smagnēji piebilst: “Daži dokumenti pārsteigs sabiedrību. Jums ir jāzina sava vēsture, lai kāda tā arī būtu.

Arhīviem ir ilga atmiņa un potenciāls lādiņš nav sliktāks par ūdeņraža bumbu. Nav nejaušība, ka mūsu valstī "maršalu lieta" un "ārstu lieta" joprojām ir klasificēta, ilgstoši radot pamatu visdažādākajām spekulācijām. Pirms neilga laika Apvienotajā Karalistē īpaša komisija nodarbojās ar arhīvu dokumentiem, kuru slepenības termiņš tuvojās beigām, taču tika nolemts pagarināt slepenības režīmu vēl uz 50 gadiem, pamatojoties uz datiem par britu izlūkdienestu pirmskara kontaktiem ar nacistu SD.

Atruna par “daži dokumenti pārsteigs sabiedrību” nav nejauša. Astoņdesmito gadu beigās gan Krievijā, gan bijušās PSRS republikās uz "demokratizācijas" viļņa pie varas nāca dažādi cilvēki.

Daudzi demonstrē pārsteidzošu politisko vitalitāti, neskatoties uz acīmredzamo vadības talanta trūkumu un tieksmi mācīt tautu par demokrātiju no viņu viedokļa.

Tuvākajās ārzemēs bijušie "tautas frontes" līderi, kuri savu pasaules uzskatu no pretpadomju uz pretkrievisku mainījuši, stingri turējās pie varas un īsteno Krievijai nedraudzīgu politiku no savas teritorijas - no visu veidu kongresu organizēšanas. no "Atvērtās Krievijas" atbrīvoto, lai apmācītu profašistiskos kaujiniekus un sniegtu militāro palīdzību Bandera.

Eiropas sabiedrībai, kā arī šo limitrofu pilsoņiem būs interesanti uzzināt no Rozarhīva atslepenotajiem dokumentiem – kuri no ievērības cienīgajiem "eirodemokrātiem" bija VDK informatori. Baumas, ka bijušais Lietuvas Nacionālās frontes vadītājs Landsberģis un tagadējā prezidentes kundze Daļa Grībauskaite miglas jaunības laikā “pieklauvēja” pie VDK – zeme pilna. Tagad par šo viņu biogrāfijas pusi, manuprāt, būs iespējams mācīties no pirmavota.

Varat tenkot, ka “tas bija sen, un nav patiesība”, “pagātne ir izaugusi”, cik vien vēlaties, taču nenovērtējiet par zemu šādu atklāsmju postošo spēku.

Var atcerēties, kā pagājušajā gadā Nacionālās piemiņas institūta atklātā dokumentu pakete par Leha Valensa sadarbību (operatīvajā pamudinājumā "Bolek") viņa darbības laikā Gdaņskā iespaidīgi tika saplēsta poļu presē. kuģu būvētava. Informācijas sprādziens neatstāja nevienu akmeni Solidaritātes līdera, Nobela Miera prēmijas laureāta un pretpadomju Polijas pirmā prezidenta ikonas "Pole Nr.1" tēlā. No šī brīža Valensa ir tikai ūsains resns vecis, pagātnes laikmeta sagrauzts, kura kauns ir redzams savām acīm tajā pašā Nacionālās atmiņas institūtā izlikto 17 kvīšu veidā par naudas saņemšanu par pieklauvēšanu. -Knock-informācija nodota specdienestiem.

Atliek tikai nožēlot, ka arhīva "bumba" nesprāga zem aģenta "Boleka" dibena 80. gados, kad viņš un viņa "Solidaritāte", kas dziedāja kopā ar Rietumu izlūkdienestiem, satricināja sociālistisko Poliju.

Arī pašmāju liberāļus var sagaidīt daudz interesantu pārsteigumu. Viņu līkumotais dzīves ceļš daudzējādā ziņā ir līdzīgs Velsas ceļam uz varas augstumiem. Mums par lielu nožēlu VDK nesteidzās atmaskot reformētos ziņotājus daudzu iemeslu dēļ, starp kuriem ētiskie nebija pēdējā vietā. Galu galā, ja jūs atklājat aģentu, īpaši brīvprātīgu, tad kurš sadarbosies? Jūs netiksiet tālu ar aģentiem, kas pieķerti nepiedienīgu darbību izdarīšanā un savervēti uz šī pamata.

Plašsaziņas līdzekļos izlaužas neoficiāla informācija, ka "Krievijas liberāldemokrātiskās kustības prominentas personas" ar padomju slepenajiem dienestiem sadarbojušās brīvprātīgi, savtīgu motīvu vadīti: interesanti komandējumi, karjeras izaugsme, prestižs darbs utt.

Var tikai iedomāties, kādas čīkstošas ​​odzes bija dažādas rakstnieku, teātra figūru un filmu veidotāju radošās apvienības.

Daudziem PSRS un padomju sistēmas kritiķiem vecāki bija ne tikai ievērojami partijas vai ekonomikas darbinieki, bet arī dienēja NKVD-MGB-KGB struktūrās un pat personīgi piedalījās represijās.

Bērni, protams, nav atbildīgi par tēviem, bet sirdī paliek pretīgi, kad atmaskot un noplēst vākus tiek ņemtas pārkrāsotas atvases, kuras negrib atcerēties savu vecāku pagātni, bet reiz, bez sirdsapziņas pārmetumiem, paņēma. sava augstā amata priekšrocības kā tramplīns personīgai gaišai nākotnei.

Atslepenotie arhīvi spēj ietekmēt spēku sakārtošanu bandītiskajā Ukrainā. Var atcerēties, kā vairāki Miroslavas Berdņikas sociālajos tīklos publicētie dokumenti vēl pirms Maidana apvērsuma par OUN vadītāju sadarbību ar Valsts drošības ministriju un Iekšlietu ministriju izraisīja raustīšanās lēkmes un strūklakas. rīkles caureja Bandera mirušo fanu vidū. Svidomieši lamāja, nodēvēja dokumentu fotokopijas par “FB viltojumiem”, taču argumentēt nevarēja.

Kāpēc tas ir svarīgi? Ukraiņu radikālais nacionālisms ir ļauns bez ierunām. Bet to atzīst dažādi cilvēki. Mūsdienu OUN biedru vidū ir savi ideālisti, kas vēlas attīrīt ukraiņu nacionālismu no visniecīgākajām Banderas un Šuheviča figūrām, jo ​​viņi jau sen un neatgriezeniski sevi kompromitējuši kā hitleriešu marionetes un sodītāji. Lai kā arī būtu, bet pēckara padomju izlūkdienesti labi saprata vācu nacionālistu jūtas, kuri skaidri nošķīrās no nacistiem un ģenerāļa Gehlena atbalstītājiem, kuri bija pakļauti amerikāņiem. Vācu nacionālisti, kuri uzskatīja Bismarku par savu elku, pārdzīvojuši kara šausmas un redzot, kā amerikāņi iegrūda VFR jaunā karā ar PSRS, deva priekšroku darbam padomju un Austrumvācijas izlūkdienestos. Šo punktu noteikti ir vērts apsvērt.

No otras puses, Ukraina ir pilna ar dedzīgiem neobanderistiem, kuri necieš pārmērīgu riebumu, kuri nebaidās no dokumentāliem pierādījumiem par savu elku sadarbību ar nacistu slepenajiem dienestiem. Un ko darīt, ja tiek publicēti deklasificēti dokumenti, kuros teikts, ka viņu elki, piemēram, Vasils Kuks, nopludināja MGB informāciju par saviem "brāļiem", kas sēž kešatmiņās?

Ja nu pēkšņi izrādīsies, ka pie VDK ieslodzījuma režīma mīkstināšanai pieklauvējuši visādi vēlā padomju laika "labējie" un "kvadrātiņi", par papildus speķa paku no mājām vai mahorka paku no kāda nometnes stends? Vai Bandera "spilnota", kas visur redz Maskavas, FSB un Putina garo roku personīgi, izturēs šādu pārliecības spēka pārbaudi?

Šāda veida informācija var izraisīt spēcīgu kodoltermiskās plazmas izdalīšanos no Svidomo dups, kuru īpašnieki lepojas ar "nacionālo tīrību" un "Svidomo". Elku atklāsmes var likt kādam atkāpties un mainīt savas domas.

Būtu interesanti uzzināt par pašpasludinātā "Mejlisa" vadoņu, kā arī citu zemisku personību dubulto dzīvi, nīkuļojot zem patvaļīgi uzņemtās "nācijas sirdsapziņas" nastas.

Tātad, zem kura personīgā dupša uzsprāgs pirmā arhīva "bumba"? Kurš dosies līdzi "lokomotīvei", kas atrit garu atklāsmju ķēdi?


*Ir divas 42.zip versijas: vecā ir 42 374 baiti, bet jaunākā ir 42 838 baiti. Atšķirība ir tāda, ka jaunajam pirms izpakošanas ir jāievada parole. Mēs salīdzinām tikai ar veco versiju. Šeit ir faila kopija, ja jums tā ir nepieciešama: 42.zip .

Zip bumbām ir jāpārvar fakts, ka DEFLATE saspiešanas algoritms, ko visbiežāk atbalsta parseri, nedrīkst pārsniegt saspiešanas pakāpi 1032 pret 1. Šī iemesla dēļ zip bumbas parasti paļaujas uz rekursīvu dekompresiju, ievietojot zip failus zip failos, lai iegūtu papildu attiecību 1032. ar katru slāni. Bet triks darbojas tikai tajās implementācijās, kuras tiek izpakotas rekursīvi, un lielākā daļa to nedara. Slavenākā 42.zip bumba izplešas līdz milzīgam 4,5 PB, kad visi seši slāņi tiek rekursīvi atspiesti, bet augšējā slānī ir niecīgs 0,6 MB. Zip quines, tāpat kā Kokss un Ellingsens, rada sevis kopiju un tādējādi izplešas bezgalīgi, kad tās tiek rekursīvi atspiestas. Bet tie ir arī pilnīgi droši, ja vienreiz ir izpakoti.

Šajā rakstā ir parādīts, kā izveidot nerekursīvu zip bumbu, kuras saspiešanas pakāpe pārsniedz DEFLATE ierobežojumu 1032. Tas darbojas, pārklājot failus zip konteinerā, lai atsauktos uz ļoti saspiestu datu "kodolu" vairākos failos, neveidojot vairākas kopijas. Rāvējslēdzēja bumbas izvades izmērs pieaug kvadrātiski no ievades lieluma; i., kompresijas pakāpe uzlabojas, palielinoties bumbas izmēram. Dizains ir atkarīgs no zip un DEFLATE funkcijām: tas nav tieši pārnēsājams uz citiem failu formātiem vai saspiešanas algoritmiem. Bumba ir saderīga ar lielāko daļu zip parsētāju, izņemot "straumēšanas" parsētājus, kas parsē failus vienā piegājienā, nepārbaudot ZIP faila centrālo direktoriju. Mēs cenšamies līdzsvarot divus pretrunīgus mērķus:

  • Palieliniet saspiešanas pakāpi. Mēs definējam kompresijas pakāpi kā visu arhīvā esošo failu lielumu summu, kas dalīta ar paša zip faila lielumu. Tas neietver failu nosaukumus vai citus failu sistēmas metadatus, tikai saturu.
  • Saglabājiet saderību. Zip ir sarežģīts formāts, un parsētāji atšķiras, jo īpaši malas gadījumos un papildu funkcijās. Neizmantojiet trikus, kas darbojas tikai ar noteiktiem parsētājiem. Mēs atzīmēsim dažus veidus, kā uzlabot rāvējslēdzēja bumbas efektivitāti ar zināmu saderības zudumu.

Zip faila struktūra

Zip fails sastāv no centrālais direktorijs saites uz failus.

Centrālais direktorijs atrodas zip faila beigās. Šis ir saraksts centrālā direktorija galvenes. Katra centrālā direktorija galvenē ir viena faila metadati, piemēram, faila nosaukums un CRC-32 kontrolsumma, kā arī vietējā faila galvenes atpakaļnorādītājs. Centrālā direktorija galvenes garums ir 46 baiti plus faila nosaukuma garums.

Fails sastāv no vietējā faila galvenes, kam seko saspiestā faila dati. Vietējā faila galvenes garums ir 30 baiti plus faila nosaukuma garums. Tas satur lieku metadatu kopiju no centrālā direktorija galvenes un aiz tā esošo saspiesto un nesaspiesto datu failu izmērus. Zip ir konteinera formāts, nevis saspiešanas algoritms. Katra faila dati tiek saspiesti, izmantojot metadatos norādīto algoritmu, parasti DEFLATE .

Šajā zip formāta aprakstā ir izlaistas daudzas detaļas, kas nav vajadzīgas, lai izprastu zip bumbu. Pilnīgu informāciju skatiet sadaļā 4.3 APPNOTE.TXT vai Floriana Buhholca “PKZip faila struktūra” vai skatiet .

Ievērojamā dublēšanās un daudzās neskaidrības zip formātā paver iespējas visu veidu nedarbiem. Rāvējslēdzēja bumba ir tikai aisberga redzamā daļa. Saites tālākai lasīšanai:

$ python3 -m zipfile -e overlap.zip . Traceback (pēdējais zvans): ... __main__.BadZipFile: Faila nosaukums direktorijā "B" un galvene b"A" atšķiras.
Tālāk mēs apskatīsim, kā modificēt konstrukciju, lai nodrošinātu faila nosaukuma konsekvenci, vienlaikus saglabājot lielāko daļu priekšrocību, ko sniedz pārklāšanās faili.

Otrais atklājums: citējot vietējo failu galvenes

Mums ir jāatdala katra faila lokālo failu galvenes, vienlaikus atkārtoti izmantojot vienu kodolu. Vienkārša visu galveņu savienošana nedarbojas, jo zip parsētājs atradīs vietējo faila galveni, kur tas sagaida, ka sāksies straume DEFLATE. Bet ideja darbosies ar dažām izmaiņām. Mēs izmantosim nesaspiesto bloku funkciju DEFLATE, lai "citētu" vietējo failu galvenes tā, lai tās būtu daļa no tās pašas DEFLATE straumes, kas beidzas kodolā. Katra vietējā faila galvene (izņemot pirmo) tiks interpretēta divos veidos: kā kods (zip faila struktūras daļa) un kā dati (daļa no faila satura).

DEFLATE straume ir bloku secība, kurā katru bloku var saspiest vai nesaspiest. Mēs parasti domājam tikai par saspiestiem blokiem, piemēram, kodols ir viens liels saspiests bloks. Bet ir arī nesaspiesti, kas sākas ar 5 baitu galveni ar garuma lauku, kas vienkārši nozīmē: "izdrukājiet šo n baiti burtiski. Nesaspiesta bloka atspiešana nozīmē tikai 5 baitu galvenes noņemšanu. Saspiestos un nesaspiestos blokus var brīvi sajaukt DEFLATE straumē. Izvade ir visu bloku izpakošanas secībā rezultātu sasaiste. Termins "nesaspiests" attiecas tikai uz DEFLATE līmeni; faila dati joprojām tiek uzskatīti par "saspiestiem" zip līmenī neatkarīgi no tā, kādi bloki tiek izmantoti.

Vienkāršākais veids, kā domāt par šo konstrukciju, ir iekšēja pārklāšanās, sākot no pēdējā faila līdz pirmajam. Mēs sākam, ievietojot kodolu, kas veidos katra faila datu faila beigas. Vietējās LFH faila galvenes pievienošana N un centrālā direktorija CDH nosaukums N, kas uz to norāda. Iestatiet saspiestā izmēra metadatu lauku uz LFH N un CDH N par kodola saspiesto izmēru. Tagad pievienojam 5 baitu nesaspiesta bloka galveni (shēmā zaļā krāsā), kuras garuma lauks ir vienāds ar LFH lielumu N. Otrās vietējā LFH faila galvenes pievienošana N−1 un CDH centrālā direktorija galvene N−1 , kas norāda uz to. Iestatiet metadatu lauku "saspiests izmērs" kā jauno kodola saspiestā izmēra galveni pluss nesaspiesta bloka galvenes izmērs (5 baiti) pluss LFH izmērs N .

Pašlaik zip failā ir divi faili ar nosaukumu Y un Z. Apskatīsim, ko parsētājs redzēs parsēšanas laikā. Pieņemsim, ka saspiestā kodola izmērs ir 1000 baiti un LFH izmērs ir N- 31 baits. Sākot ar CDH N−1 un sekojiet rādītājam uz LFH N-1. Pirmā faila nosaukums ir Y, un tā datu faila saspiestais izmērs ir 1036 baiti. Interpretējot nākamos 1036 baitus kā DEFLATE straumi, mēs vispirms sastopamies ar 5 baitu nesaspiesta bloka galveni, kas saka, ka jākopē nākamie 31 baits. Uzrakstiet nākamos 31 baitu, kas ir LFH N, kuru mēs atspiežam un pievienojam failam Y. Virzoties DEFLATE straumē, mēs atrodam saspiesto bloku (kodolu), kuru atspiedam failā Y. Tagad esam sasnieguši saspiesto datu beigas un pabeidzam ar failu Y.

Pārejot uz nākamo failu, mēs sekojam rādītājam no CDH N uz LFH N un atrodiet failu ar nosaukumu Z, kura saspiestais izmērs ir 1000 baiti. Interpretējot šos 1000 baitus kā DEFLATE straumi, mēs nekavējoties saskaramies ar saspiesto bloku (kodolu) un atspiedam to failā Z. Tagad esam sasnieguši galīgā faila beigas un viss ir paveikts. Z izvades failā ir izpakots kodols; izvades fails Y ir tāds pats, bet papildus tam ir prefikss ar 31 baitu LFH N .

Mēs pabeidzam būvniecību, atkārtojot citēšanas procedūru, līdz zip arhīvā ir nepieciešamais failu skaits. Katrs jauns fails pievieno centrālā direktorija galveni, lokālā faila galveni un nesaspiestu bloku, lai citētu tūlīt sekojošo vietējā faila galveni. Saspiestā faila dati parasti ir nesaspiestu DEFLATE bloku ķēde (citētas vietējo failu galvenes), kam seko saspiests kodols. Katrs kodola baits veido aptuveni 1032 N uz izvades izmēru, jo katrs baits ir daļa no visa N failus. Arī izvadfaili ir dažāda izmēra: vecākie ir lielāki nekā jaunākie, jo tajos vairāk tiek citētas vietējo failu galvenes. Izvades failu saturam nav lielas jēgas, taču neviens nav teicis, ka vajadzētu.

Šai pārklājošajai citātu konstrukcijai ir labāka savietojamība nekā iepriekšējās sadaļas pilnīgai pārklāšanās konstrukcijai, taču saderība notiek uz saspiešanas rēķina. Tur katrs pievienotais fails bija tikai centrālā direktorija galvenes vērts, šeit tas ir vērts centrālā direktorija galvenes, lokālā faila galvenes un vēl 5 baitus citātu galvenei.

Optimizācija

Saņemot rāvējslēdzēja bumbas pamata dizainu, mēs centīsimies to padarīt pēc iespējas efektīvāku. Mēs vēlamies atbildēt uz diviem jautājumiem:
  • Kāda ir maksimālā saspiešanas pakāpe noteiktam zip faila izmēram?
  • Kāda ir maksimālā saspiešanas pakāpe, ņemot vērā zip formāta ierobežojumus?

Core Compression

Mums ir izdevīgi pēc iespējas vairāk saspiest kodolu, jo katrs neizpakotais baits tiek reizināts ar N. Šim nolūkam mēs izmantojam pielāgotu DEFLATE kompresoru ar nosaukumu bulk_deflate, kas specializējas atkārtotu baitu virknes saspiešanā.

Visi pienācīgie DEFLATE arhivētāji tuvojas saspiešanas pakāpei 1032 bezgalīgā atkārtotu baitu straumē, taču mums rūp konkrētais izmērs. Mūsu arhīva lielumā bulk_deflate glabā vairāk datu nekā vispārējas nozīmes arhivējos: par aptuveni 26 KB vairāk nekā zlib un Info-ZIP un par aptuveni 15 KB vairāk nekā Zopfli, kas upurē ātrumu saspiešanas kvalitātes dēļ.

Augstas bulk_deflate kompresijas pakāpes izmaksas ir daudzpusības trūkums. Tas var saspiest tikai atkārtotu baitu virknes un tikai noteiktu garumu, proti, 517 + 258 k veselam skaitlim k≥ 0. Papildus labai saspiešanai, bulk_deflate ir ātrs, veicot darbu gandrīz vienā laikā neatkarīgi no ievades datu lieluma, izņemot saspiestās virknes ierakstīšanu.

Failu nosaukumi

Mūsu vajadzībām failu nosaukumi ir praktiski pilnvērtīgi. Lai gan tie veicina izvades lielumu, jo ir daļa no citētajām vietējā faila galvenēm, baits faila nosaukumā dod daudz mazāku ieguldījumu nekā baits kodolā. Mēs vēlamies, lai failu nosaukumi būtu pēc iespējas īsāki, tomēr atšķirīgi, vienlaikus paturot prātā saderību.

Katrs faila nosaukumam iztērēts baits nozīmē divus baitus, kas nav iztērēti kodolam (divi, jo katrs faila nosaukums parādās divreiz: centrālā direktorija galvenē un vietējā faila galvenē). Faila nosaukuma baits rada tikai ( N+ 1) / 4 izvades baiti, savukārt baits kodolā tiek skaitīts kā 1032 N. Piemēri: , , .

Pirmais saderības apsvērums ir kodēšana. Zip formāta specifikācijā teikts, ka failu nosaukumi ir jāinterpretē kā CP 437 vai UTF-8, ja ir iestatīts noteikts karoga bits (APPNOTE.TXT, D pielikums). Tas ir galvenais nesaderības punkts starp zip parsētājiem, kas var interpretēt failu nosaukumus fiksētā vai lokalizācijai raksturīgā kodējumā. Tāpēc, lai nodrošinātu saderību, labāk ir aprobežoties ar rakstzīmēm ar vienādu kodējumu gan CP 437, gan UTF-8. Proti, tas ir 95 drukājamas US-ASCII rakstzīmes.

Mums ir saistoši arī failu sistēmas nosaukumu ierobežojumi. Dažas failu sistēmas nav reģistrjutīgas, tāpēc "a" un "A" netiek uzskatīti par atšķirīgiem nosaukumiem. Izplatītas failu sistēmas, piemēram, FAT32, neļauj izmantot noteiktas rakstzīmes, piemēram, "*" un "?".

Kā drošs, bet ne vienmēr optimāls kompromiss, mūsu zip bomb izmantos failu nosaukumus no 36 rakstzīmju alfabēta, kas neietver īpašos vai jauktos lielos burtus:

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
Failu nosaukumi tiek ģenerēti acīmredzamā veidā, visas pozīcijas pēc kārtas, pozīciju pievienojot cilpas beigās:

"0", "1", "2", …, "Z", "00", "01", "02", ..., "0Z", ..., "Z0", "Z1", "Z2", …, "ZZ", "000", "001", "002", ...
Ir 36 failu nosaukumi, kas ir vienas rakstzīmes gari, 362 failu nosaukumi, kuru garums ir divas rakstzīmes, un tā tālāk. Ar četriem baitiem pietiek 1 727 604 atšķirīgiem failu nosaukumiem.

Ņemot vērā, ka failu nosaukumiem arhīvā parasti ir atšķirīgs garums, kā tos vislabāk pasūtīt: no īsākā uz garāko vai otrādi? Ja mazliet padomā, tad garākos vārdus labāk likt pēdējā. Šī šķirošana failam zblg.zip pievieno vairāk nekā 900 MB izvades, salīdzinot ar garāko un īsāko pasūtījumu. Tomēr šī ir neliela optimizācija, jo 900 MB ir tikai 0,0003% no kopējā emisijas apjoma.

Kodola izmērs

Pārklāšanās citātu konstrukcija ļauj ievietot saspiestu datu kodolu un pēc tam lēti kopēt to atkal un atkal. Konkrētam zip faila izmēram X, cik daudz vietas ir optimāls kodola glabāšanai un cik daudz kopiju veidošanai?

Lai atrastu optimālo līdzsvaru, ir jāoptimizē tikai viens mainīgais N, failu skaits zip arhīvā. Katra vērtība N ir nepieciešams noteikts pieskaitāmās izmaksas centrālā direktorija galvenēm, lokālo failu galvenēm, citēšanas bloku galvenēm un failu nosaukumiem. Pārējo vietu aizņems kodols. Tāpēc ka N ir jābūt veselam skaitlim, un jūs varat ievietot tikai noteiktu skaitu failu, pirms kodola lielums samazinās līdz nullei, vienkārši pārbaudiet visas iespējamās vērtības N un izvēlieties to, kas sniedz vislielāko rezultātu.

Optimizācijas procedūras piemērošana X= 42 374 42.zip atrod maksimumu pie N= 250. Šiem 250 failiem ir nepieciešami 21 195 baiti, kodolam atstājot 21 179 baitus. Šāda izmēra kodols tiek izpakots 21 841 249 baitos (attiecība 1031,3 pret 1). 250 atspiestā kodola kopijas un dažas citētās vietējo failu galvenes nodrošina kopējo dekompresēto izvadi 5 461 307 620 baitu un saspiešanas pakāpi 129 000.

CRC-32 var modelēt kā stāvokļa mašīnu, kas atjaunina 32 bitu statusa reģistru katram ievades bitam. Pamata atjaunināšanas darbības bitiem 0 un 1 ir:

Uint32 crc32_update_0(uint32 status) ( // Nobīdiet vismazāk nozīmīgo bitu. bits b = stāvoklis & 1; stāvoklis = stāvoklis >> 1; // Ja nobīdītais bits bija 1, XOR ar CRC-32 konstanti. ja (b == 1) stāvoklis = stāvoklis ^ 0xedb88320; atgriešanas stāvoklis; ) uint32 crc32_update_1(uint32 status) ( // Rīkojieties tāpat kā 0 bitam, pēc tam XOR ar CRC-32 konstanti. return crc32_update_0(state) ^ 0xedb8
Ja statusa reģistru attēlojat kā 32 elementu bināru vektoru un saskaitīšanai un reizināšanai izmantojat XOR, tad crc32_update_0 ir lineāra kartēšana; i., to var attēlot kā reizinājumu ar 32x32 bināro pārejas matricu. Lai saprastu, kāpēc, ņemiet vērā, ka matricas reizināšana ar vektoru ir vienkārši matricas kolonnu summēšana pēc katras kolonnas reizināšanas ar atbilstošo vektora elementu. Pārbīdes darbības stāvoklis >> 1 vienkārši aizņem katru bitu i stāvokļa vektoru un reizina to ar vektoru, kas visur ir nulle, izņemot bitu i− 1 (bitu numerācija no labās uz kreiso pusi). Relatīvi runājot, gala XOR stāvoklis ^ 0xedb88320 notiek tikai tad, ja bits b ir vienāds ar vienu. To var uzskatīt par b reizināšanu ar 0xedb88320 un pēc tam XOR ievadīšanu šajā stāvoklī.

Turklāt crc32_update_1 ir tikai crc32_update_0 plus (XOR) konstante. Tas padara crc32_update_1 par afīnu transformāciju: matricas reizināšanu, kam seko kartēšana (t.i., vektora pievienošana). Matricas reizināšanu un kartēšanu varam attēlot vienā solī, ja palielinām transformācijas matricas izmērus līdz 33x33 un stāvokļa vektoram pievienojam papildus elementu, kas vienmēr ir 1 (šādu attēlojumu sauc par viendabīgām koordinātām).


33×33 transformācijas matricas M 0 un M 1 , kas aprēķina CRC-32 stāvokļa maiņu, ko veic attiecīgi biti 0 un 1. Kolonnu vektori tiek saglabāti ar nozīmīgāko bitu apakšā: lasot pirmo kolonnu no apakšas uz augšu, tiek parādīta CRC-32 polinoma konstante edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2 . Abas matricas atšķiras tikai pēdējā kolonnā, kas attēlo translācijas vektoru viendabīgās koordinātās. M 0 tulkojums ir nulle, un M 1 tas ir edb88320 16, CRC-32 polinoma konstante. Tie, kas atrodas tieši virs diagonāles, norāda darbības stāvokļa stāvokli >> 1

Abas darbības crc32_update_0 un crc32_update_1 var attēlot ar 33x33 pārejas matricu. Parādītas matricas M 0 un M 1. Matricas attēlojuma priekšrocība ir tā, ka matricas var reizināt. Pieņemsim, ka mēs vēlamies redzēt stāvokļa izmaiņas, kas veiktas, apstrādājot ASCII rakstzīmi "a", kuras binārais attēlojums ir 01100001 2 . Mēs varam attēlot šo astoņu bitu kumulatīvās CRC-32 stāvokļa izmaiņas vienā transformācijas matricā:


Un mēs varam attēlot atkārtotas "a" virknes stāvokļa maiņu, reizinot daudzas M a kopijas - matricas paaugstināšanu līdz pakāpei. Mēs to varam izdarīt ātri, izmantojot ātrās eksponēšanas algoritmu, kas aprēķina M n tikai log 2 n soļos. Piemēram, šeit ir stāvokļa maiņas matrica rindai ar 9 rakstzīmēm "a":
Ātrās matricas reizināšanas algoritms ir noderīgs, lai aprēķinātu M kodolu, kas ir nesaspiesta kodola matrica, jo kodols ir atkārtotu baitu virkne. Lai no matricas iegūtu CRC-32 kontrolsummu, reiziniet matricu ar nulles vektoru (nulles vektors ir viendabīgās koordinātās, t.i., 32 nulles, kam seko viens; šeit mēs izlaižam nelielu sarežģījumu, kas saistīts ar kontrolsummas iepriekšēju un pēcapstrādi lai nodrošinātu konsekvenci). Lai aprēķinātu katra faila kontrolsummu, mēs strādājam atpakaļ. Sākot ar inicializāciju M:= M kodols. Kodola kontrolsumma ir arī galīgā faila kontrolsumma N, tāpēc mēs reizinām M uz nulles vektoru un saglabāt iegūto kontrolsummu CDH N un LFH N . Faila dati N-1 tādi paši kā faila dati N, bet ar pievienotu prefiksu LFH N. Tāpēc mēs aprēķinām LFH N stāvokļa pārejas matricu un atjauninām . Tagad M attēlo kumulatīvās stāvokļa izmaiņas no LFH N apstrādes aiz kodola. Aprēķiniet faila kontrolsummu N-1, atkal reizinot M uz nulles vektoru. Mēs turpinām procedūru, uzkrājot stāvokļa maiņas matricas M līdz visi faili ir apstrādāti.

Pagarinājums: Zip64

Iepriekš mēs saskārāmies ar paplašināšanas problēmu zip formāta ierobežojumu dēļ — nebija iespējams izdalīt vairāk par 281 TB neatkarīgi no tā, cik gudri zip fails bija iesaiņots. Šos ierobežojumus var pārvarēt, izmantojot Zip64 — zip formāta paplašinājumu, kas palielina dažu galvenes lauku lielumu līdz 64 bitiem. Zip64 atbalsts nekādā ziņā nav universāls, taču tas ir viens no visbiežāk ieviestajiem paplašinājumiem. Saspiešanas pakāpes ziņā Zip64 palielina centrālā direktorija galvenes izmēru no 46 līdz 58 baitiem un vietējā direktorija galvenes izmēru no 30 līdz 50 baitiem. Aplūkojot optimālā izplešanās koeficienta formulu vienkāršotajā modelī, redzams, ka Zip64 rāvējslēdzēja bumba joprojām aug kvadrātiski, bet lēnāk, pateicoties lielākajam saucējam – to var redzēt zemāk esošajā diagrammā. Saderības zuduma un lēnākas izaugsmes dēļ no mums tiek atcelti gandrīz visi faila lieluma ierobežojumi.

Pieņemsim, ka mēs vēlamies rāvējslēdzēju, kas izplešas līdz 4,5 PB, piemēram, 42.zip. Cik lielam jābūt arhīvam? Izmantojot bināro meklēšanu, mēs atklājam, ka šāda faila minimālais izmērs ir 46 MB.

  • zbxl.zip 46 MB → 4,5 PB (Zip64, mazāk saderīgs)
zipbomb --mode=quoted_overlap --num-files=190023 --compressed-size=22982788 --zip64 > zbxl.zip
4,5 petabaiti — apmēram tik daudz datu ierakstīja Event Horizon Telescope pirmajam melnā cauruma attēlam: statīvi un statīvi ar cietajiem diskiem datu centrā.

Izmantojot Zip64, vairs nav interesanti apsvērt maksimālo saspiešanas pakāpi, jo mēs varam tikai palielināt zip faila lielumu un saspiešanas pakāpi līdz ar to, līdz pat saspiestais zip fails kļūst pārmērīgi liels. Tomēr interesants slieksnis ir 264 baiti (18 EB vai 16 EiB) — tik daudz datu neietilps lielākajā daļā failu sistēmu. Binārā meklēšana atrod mazāko zip bumbu, kas rada vismaz tik daudz izvades: tajā ir 12 miljoni failu un 1,5 GB saspiests kodols. Kopējais ZIP faila lielums ir 2,9 GB, un tas tiek atspiests 264+11727895877 baitos ar saspiešanas pakāpi, kas pārsniedz 6,2 miljardus pret vienu. Es nepublicēju šo failu lejupielādei, taču varat to ģenerēt pats, izmantojot . Tam ir tāda izmēra faili, ka tika atklāta pat Info-ZIP UnZip 6.0 kļūda.

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

Paplašinājums: bzip2

DEFLATE ir visizplatītākais zip formāta saspiešanas algoritms, taču tā ir tikai viena no daudzajām iespējām. Iespējams, otrs visizplatītākais algoritms ir bzip2. Lai gan tas nav tik saderīgs kā DEFLATE. Teorētiski bzip2 maksimālā saspiešanas pakāpe ir aptuveni 1,4 miljoni pret vienu, kas ļauj kodolu iesaiņot ciešāk.

Bzip2 vispirms kodē izpildes garuma kodējumu, samazinot atkārtotu baitu virknes garumu par 51. Pēc tam dati tiek sadalīti 900 KB blokos un katrs bloks tiek saspiests atsevišķi. Teorētiski vienu bloku var saspiest līdz 32 baitiem. 900 000 × 51/32 = 1 434 375.

Ja neskaita saderības zudumus, vai bzip2 nodrošina efektīvāku bumbu?

Jā, bet tikai maziem failiem. Problēma ir tā, ka bzip2 nav nekā līdzīga nesaspiestajiem DEFLATE blokiem, ko izmantojām, lai citētu vietējo failu galvenes. Tādējādi nav iespējams pārklāt failus un atkārtoti izmantot kodolu - katram failam ir jāraksta sava kopija, tāpēc kopējais saspiešanas koeficients nebūs labāks par attiecību jebkuram atsevišķam failam. Tālāk esošajā diagrammā redzams, ka bez pārklāšanās bzip2 pārspēj DEFLATE tikai failiem, kuru lielums ir aptuveni megabaits.

Vienīgā cerība, kas atliek, ir alternatīvs veids, kā citēt bzip2 galvenes, kas ir apspriests nākamajā sadaļā. Tāpat, ja zināt, ka konkrēts zip parsētājs atbalsta bzip2 un pieļauj faila nosaukumu neatbilstības, varat izmantot pilnu ignorēšanas konstrukciju, kas nav jākotē.

Dažādu rāvējslēdzēju bumbu saspiešanas pakāpes salīdzinājums. Ievērojiet logaritmiskās asis. Katra konstrukcija ir parādīta ar un bez Zip64. Konstrukcijām bez pārklāšanās ir lineārs augšanas ātrums, ko var redzēt no asu nemainīgās attiecības. Bzip2 diagrammas vertikālā nobīde nozīmē, ka bzip2 saspiešanas pakāpe ir aptuveni tūkstoš reižu lielāka nekā DEFLATE. Citētajām DEFLATE konstrukcijām ir kvadrātveida augšanas ātrums, par ko liecina 2:1 novirze. Zip64 variants ir nedaudz mazāk efektīvs, taču pieļauj vairāk nekā 281 TB. Bzip2 grafiki ar citēšanu, izmantojot papildu lauku, mainās no kvadrātveida uz lineāru, kad tiek sasniegts maksimālais faila lielums (2 32–2 baiti) vai maksimālais atļautais failu skaits

Paplašinājums: citēšana, izmantojot papildu lauku

Līdz šim mēs esam izmantojuši funkciju DEFLATE, lai citētu vietējo failu galvenes, un tikko esam redzējuši, ka šis triks nedarbojas bzip2. Tomēr ir alternatīvs citēšanas veids, nedaudz ierobežotāks, kas izmanto tikai zip formāta funkcijas un nav atkarīgs no saspiešanas algoritma.

Vietējā faila galvenes struktūras beigās ir papildu lauks mainīgs garums, lai saglabātu informāciju, kas neietilpst parastajos galvenes laukos (APPNOTE.TXT, 4.3.7. sadaļa). Papildu informācija var ietvert, piemēram, laikspiedolu vai Unix uid/gid. Zip64 informācija tiek saglabāta arī papildu laukā. Papildu lauks tiek attēlots kā garuma vērtības struktūra; ja palielināsiet garumu, nepievienojot vērtību, tad papildu laukā tiks iekļauts tas, kas atrodas aiz tā ZIP failā, proti, nākamā lokālā faila galvene. Izmantojot šo metodi, katra vietējā faila galvene var "citēt" tālāk norādītās galvenes, iesaiņojot tās savā izvēles laukā. Salīdzinot ar DEFLATE, šeit ir trīs priekšrocības:

  1. Lai citētu, izmantojot papildu lauku, ir nepieciešami tikai 4 baiti, nevis 5, atstājot vairāk vietas kodolam.
  2. Tas nepalielina failu lielumu, kas nozīmē lielāku kodolu, ņemot vērā zip formāta ierobežojumus.
  3. Tas nodrošina bzip2 citātu.
Neskatoties uz šīm priekšrocībām, citēšana, izmantojot papildu laukus, ir mazāk elastīga. Šī nav ķēde, kā tas ir DEFLATE: katrā lokālā faila galvenē ir jāietver ne tikai tūlīt sekojošā galvene, bet arī visi turpmākos virsrakstus. Papildu lauki palielinās, tuvojoties ZIP faila sākumam. Tā kā 2. lauka maksimālais garums ir 16–1 baits, varat citēt tikai līdz 1808 vietējo failu galvenēm (vai 1170 Zip64), pieņemot nosaukumus (DEFLATE gadījumā varat izmantot papildu lauku, lai citētu pirmo (īsāko) vietējo failu galvenes un pēc tam pārejiet uz citēšanu DEFLATE. Vēl viena problēma ir tāda, ka, lai atbilstu papildu lauka iekšējai datu struktūrai, pirms atsauces datiem ir jāatlasa 16 bitu tipa tags (APPNOTE.TXT, 4.5.2. sadaļa). Mēs vēlamies izvēlēties tipa tagu, kas liks parsētājiem ignorēt citētos datus, nevis mēģināt tos interpretēt kā nozīmīgus metadatus. Zip parsētājiem ir jāignorē nezināma veida tagi, lai mēs varētu izvēlēties tagus nejauši, taču pastāv risks, ka kāds tags nākotnē sabojās dizaina saderību.

Iepriekšējā diagramma ilustrē iespēju izmantot papildu laukus bzip2, ar un bez Zip64. Abiem grafikiem ir pārtraukuma punkts, kurā izaugsme mainās no kvadrātveida uz lineāru. Bez Zip64 tas notiek, ja tiek sasniegts maksimālais nesaspiestā faila lielums (2 32–2 baiti); tad var palielināt tikai failu skaitu, nevis to lielumu. Grafiks pilnībā beidzas, kad failu skaits sasniedz 1809, un šajā brīdī mums trūkst vietas papildu laukā papildu nosaukumu citēšanai. Izmantojot Zip64, pārtraukums notiek pie 1171 faila, pēc kura var palielināt tikai failu lielumu, nevis failu skaitu. Papildu lauks palīdz arī ar DEFLATE, taču atšķirība ir tik maza, ka tā nav vizuāli pamanāma. Tas palielina zbsm.zip kompresijas pakāpi par 1,2%; zblg.zip par 0,019%; un zbxl.zip par 0,0025%.

Diskusija

Savā darbā par šo tēmu Pletz un kolēģi izmanto failu pārklāšanos, lai izveidotu gandrīz pašreplicējošu zip arhīvu. Failu pārklāšanos iepriekš (47. slaids) ierosināja Ginvael Coldwind.

Mēs izstrādājām citātu pārklājošo rāvējslēdzēju, paturot prātā savietojamību, vairākas ieviešanas atšķirības, dažas no kurām ir parādītas tālāk esošajā tabulā. Rezultātā iegūtā konstrukcija ir savietojama ar zip parsētājiem, kas darbojas parastajā veidā, t.i., vispirms pārbaudot centrālo direktoriju un izmantojot to kā faila indeksu. Starp tiem ir unikālais zip parsētājs no Nail, kas tiek automātiski ģenerēts no formālās gramatikas. Tomēr dizains nav saderīgs ar "straumes" parsētājiem, kas vienā piegājienā parsē zip failu no gala līdz galam, vispirms neizlasot centrālo direktoriju. Straumes parsētāji pēc savas būtības nepieļauj nekāda veida failu pārklāšanos. Visticamāk, viņi izvilks tikai pirmo failu. Turklāt viņi pat var radīt kļūdu, kā tas ir gadījumā

Rakstā ir minēti 9 zip failu slāņi, tāpēc tas nav tikai nulles. Kāpēc 9, kāpēc 10 faili katrā?

Pirmkārt, Wikipedia rakstā pašlaik ir teikts, ka 5 slāņi no 16 failiem. Neesat pārliecināts, kur notiek neatbilstība, bet tas nav viss, kas ir būtiski. Patiesais jautājums ir, kāpēc vispirms izmantot ligzdošanu.

DEFLATE, vienīgā atbalstītā zip failu saspiešanas metode*, maksimālā saspiešanas pakāpe ir 1032. To var sasniegt asimptotiski jebkurai atkārtotai 1–3 baitu secībai. Neatkarīgi no tā, ko jūs darāt ar zip failu, ja vien tas tiek izmantots tikai ar DEFLATE, atspiestā faila lielums būs ne vairāk kā 1032 reizes lielāks par sākotnējā ZIP faila lielumu.

Tāpēc, lai sasniegtu patiesi pārsteidzošas saspiešanas pakāpes, ir jāizmanto ligzdoti zip faili. Ja jums ir 2 saspiešanas slāņi, maksimālā attiecība ir 1032^2 = 1065024. 3 slāņiem tā ir 1099104768 un tā tālāk. 5 slāņiem, ko izmanto 42.zip, teorētiskā maksimālā kompresijas pakāpe ir 1170572956434432. Kā redzat, faktiskais 42.zip izmērs ir tālu no šī līmeņa. Daļa no tā ir zip formāta pieskaitāmās izmaksas, un daļa no tā ir tāda, ka viņiem vienkārši ir vienalga.

Ja vajadzētu uzminēt, tad teiktu, ka 42.zip izveidojās, izveidojot lielu tukšu failu un daudzkārt kopējot un kopējot. Nav iespējams palielināt formāta ierobežojumus vai palielināt saspiešanu vai kaut ko citu — viņi vienkārši nejauši izvēlējās 16 kopijas vienam slānim. Mērķis bija bez lielas piepūles izveidot lielu kravnesību.

Piezīme. Citi saspiešanas formāti, piemēram, bzip2, piedāvā daudz, daudz, daudz augstāku maksimālo saspiešanas pakāpi. Tomēr lielākā daļa zip parsētāju tos nepieņem.

P.S. Ir iespējams izveidot zip failu, kas izsaiņos savu kopiju (quine). Varat arī izveidot tādu, kas izpako vairākas kopijas. Tātad, ja jūs rekursīvi atspiedīsit failu uz visiem laikiem, maksimālais iespējamais izmērs ir bezgalīgs. Vienīgais ierobežojums ir tas, ka katrā iterācijā tas var palielināties tikai par 1032.

P.P.S. Vērtība 1032 pieņem, ka zip faila dati nepārklājas. Viena no zip faila formāta iezīmēm ir tā, ka tam ir centrālais direktorijs, kurā ir uzskaitīti arhīvā esošie faili un failu datu nobīdes. Ja failos izveidojat vairākus ierakstus, kas norāda uz vieniem un tiem pašiem datiem, jūs varat sasniegt daudz lielāku saspiešanas pakāpi pat bez ligzdošanas, taču parsētāji, visticamāk, noraidīs šādu zip failu.

pastāsti draugiem