Kursejmë hapësirën në hard disku me anë të steganografisë

Kur kur flasim për steganografinë, njerëzit imagjinojnë terroristë, pedofilë, spiunë, në më të mirën rast, kriptoanarkistë dhe shkencëtarë të tjerë. Dhe me të vërtetë, kush tjetër ka nevojë për të fshijë diçka nga sytë e jashtëm? Cila mund të jetë dobi për një njeri të zakonshëm nga kjo?

Duket se ka disa. Kjo është arsyeja pse sot do të kompresojmë të dhënat duke përdorur metoda steganografie. Në fund, lexuesi madje do të jetë në gjendje të përdorë fotografitë e tij të çmuara në JPEG për të rritur numrin e gigabajteve të lira në sistemin e skedarëve.

Kursejmë hapësirën në hard disku me anë të steganografisë

ÇfarĂ«?

Nëse lexuesi e mban mend, steganografia është algoritme të çuditshme, që lejojnë fshehjen e një informacioni brenda të tjerit. Me fjalë të thjeshta: imazhi + skedari == përafërsisht i njëjti imazh, por jo plotësisht (në vend të imazheve mund të jetë çfarëdo, por zakonisht është më e qartë). Në të njëjtën kohë, nuk duhet të ketë një mënyrë të thjeshtë për të përcaktuar nëse ka diçka brenda apo jo.

Por nëse nuk mund të dallosh një nga tjetra, a ka vërtet ndonjë diferencë? Nga pikëpamja e konsumatorit, përdoruesi nuk shqetësohet për saktësinë matematike (të reflektuar nga një grup specifik bitësh), vetëm për atë që perceptohet.

Për shembull, të shohim tre imazhe të një qeni të bukur:

Kujdes, JPEG!

Kursejmë hapësirën në hard disku me anë të steganografisë Kursejmë hapësirën në hard disku me anë të steganografisë Kursejmë hapësirën në hard disku me anë të steganografisë

Pavarësisht ndryshimit kolosal në madhësi, pak njerëz do të zgjedhin versionin e tretë. Nga ana tjetër, ndryshimi midis dy fotografive të para nuk është aq i dukshëm, dhe sasia e informacionit në to (nga pikëpamja ime) mund të barazohet.

Ky princip vetë është i vjetër dhe për shumë vite është shfrytëzuar aktivisht nga metodologjitë e kompresimit të informacionit me humbje. Por të prishësh nuk është ndërtim, ne na intereson ana më së avancuar e çështjes. A është e mundur të futësh informacion të shtuar madhësie N në një skedar në një mënyrë që madhësia e tij të rritet me M < N, dhe ndryshimet të mos jenë të dukshme për përdoruesin?

Sigurisht që është e mundur. Por duhet të bëjmë disa ndalesa menjëherë:

  • SĂ« pari, metoda duhet tĂ« jetĂ« universale dhe tĂ« japĂ« rezultat pozitiv nĂ« shumicĂ«n e tĂ« dhĂ«nave hyrĂ«se. KĂ«shtu, nĂ« mesatare, pĂ«r njĂ« hyrje tĂ« rastĂ«sishme, duhet tĂ« ndodhĂ« njĂ« zvogĂ«lim i faktik i sasisĂ« sĂ« informacionit tĂ« ruajtur. “NĂ« mesatare” do tĂ« thotĂ« se raste tĂ« kundĂ«rta mund tĂ« ndodhin, por nuk duhet tĂ« dominojnĂ«.
  • PĂ«r mĂ« tepĂ«r, madhĂ«sia e enĂ«s sĂ« kompresuar para integrimit tĂ« informacionit duhet tĂ« jetĂ« mĂ« e madhe se ajo e modifikimit tĂ« kompresuar nĂ« mĂ«nyrĂ« tĂ« ngjashme. Thjesht tĂ« integroni nĂ« BMP imazhin pĂ«rmes metodĂ«s LSB me shumĂ« bita nuk Ă«shtĂ« kompresim steganografik, pasi, kur kalon pĂ«rmes ndonjĂ« DEFLATE, imazhi origjinal me siguri do tĂ« jetĂ« dukshĂ«m mĂ« i vogĂ«l.
  • NĂ« tĂ« tretĂ«, duhet tĂ« kryhen dhe tĂ« krahasohen rezultatet nĂ« lidhje me tĂ« dhĂ«nat e kompresuara me metoda klasike. Kjo do tĂ« lejojĂ« eliminimin e efektit probabilistik tĂ« ndryshimit tĂ« tepĂ«rt dhe tĂ« realizohet njĂ« kompresim mĂ« efikas nĂ« rastin e pĂ«rgjithshĂ«m.

Ku?

Përdorimi i steganografisë nënkupton se, përveç informacionit që do të kompresohet, na nevojiten enë në të cilat do të integrohet. Sasia maksimale e informacionit të integrueshëm varet shumë nga veçori të veçanta, por është shumë më e lehtë të shkallëzohet me sasinë e tyre. Prandaj, formati i enëve duhet të jetë i zakonshëm, në mënyrë që përdoruesi të ketë një sasi të mjaftueshme për të marrë ndonjë përfitim nga procesi i 'kompresimit'.

Në këtë kontekst, kandidatët e mirë bëhen skedarë grafikë, audio dhe video. Por, për shkak të larmisë së formateve të ndryshme, kodeve etj., në praktikë, na mbetet të zgjedhim nga një numër të vogël mundësish.

Duke marrë parasysh gjithçka, zgjedhja ime ra në JPEG. Ai është praktikisht në të gjithë, përdoret gjerësisht si në raste personale ashtu edhe për qëllime biznesi, duke qenë praktikisht formati de-fakto për shumicën e imazheve.

Kursejmë hapësirën në hard disku me anë të steganografisë

Kur? Si?

Më pas pasojnë skemat dhe përshkrimet teknike dhe afërore pa shpjegime të veçanta, kështu që ata që dëshirojnë mund t'i kalojnë ato, duke e kaluar në seksionin 'Teknologji të Larta'.

Karakteristikat e Përgjithshme

Për të integruar të dhëna diku, së pari duhet të përcaktojmë se ku. Në sistemin e skedarëve mund të ndodhen një numër i pakufizuar fotosh të ndryshme, nga të cilat përdoruesi mund të dëshirojë të përdorë vetëm disa. Ky grup i dëshiruar enësh do quhet bibliotekë.

Kjo formohet në dy raste: para kompresimit dhe para shpërndarjes. Në rastin e parë, mund të përdorim thjesht një grup emrash (ose më mirë, një shprehje të rregullt për ta), por në rastin e dytë kërkohet diçka më të besueshme: përdoruesi mund të kopjojë dhe të zhvendosë ato brenda sistemit të skedarëve, duke mos lejuar që të identifikohen siç duhet. Prandaj, është e nevojshme të ruajnë hash-a të tyre (md5 mjafton) pas kryerjes së të gjitha modifikimeve.

Kërkimi fillestar me anë të shprehjes së rregullt nuk ka kuptim të bëhet në të gjithë FS-në, është mjaft për të treguar një direktori rrënjësore. Ajo do të ruajë gjithashtu një skedar të veçantë-arkiv, në të cilin do të jenë ato hash-a, së bashku me një informacion tjetër meta, të nevojshëm për rikthimin e informacionit të kompresuar.

Të gjitha këto janë të aplikueshme njësoj për çdo implementim të çdo algoritmi të kompresimit të të dhënave steganografike. Proceset e kompresimit dhe rikthimit të të dhënave mund të quhen paketim dhe shpërndarje.

F5

Tani që e kuptuam qartë se çfarë bëjmë dhe përse, mbetet të përshkruajmë algoritmin e arritjes së qëllimit. Le të rikujtojmë procesin e kodimit të skedarit JPEG (falë Wikipedisë së Bibliotekës Kombëtare të Baumanit):

Kursejmë hapësirën në hard disku me anë të steganografisë

Duke e shqyrtuar atë, është më mirë të bëjmë disa vërejtje menjëherë:

  • MadhĂ«sia e skedarit JPEG mund tĂ« konsiderohet optimale, pa e provuar ta kompresoni me ndonjĂ« program si WinRAR;
  • Mund tĂ« modifikohet vetĂ«m informacioni i ruajtur (atĂ«, qĂ« Ă«shtĂ« nĂ« dalje tĂ« transformimit diskret tĂ« kosinĂ«ve, DCT), pĂ«r tĂ« siguruar njĂ« performancĂ« tĂ« pranueshme.
  • PĂ«r tĂ« mos humbur tĂ« dhĂ«na nĂ« masa tĂ« dukshme pĂ«r pĂ«rdoruesin, kĂ«rkohet tĂ« bĂ«hen minimum modifikimesh nĂ« çdo imazh tĂ« veçantĂ«;

Për këto kushte i përshtatet një familje e tërë algoritmash, me të cilën mund të njihet në këtë prezantim të mirë. Algoritmi më i avancuar ndër ta është F5 nga Andreas Westfeld, që punon me koeficientët DCT të komponentës së ndriçimit (sytë e njeriut janë më pak të ndjeshëm ndaj ndryshimeve të saj). Skema e tij e përgjithshme kur punon me një skedar JPEG ekzistues paraqitet si në vijim:

Kursejmë hapësirën në hard disku me anë të steganografisë

Bloku F5 përdor një metodë të avancuar të inkorporimit, e bazuar në kodimin e matricave. Më shumë rreth saj dhe algoritmit të vet mund të mësoni përmes lidhjes së sipërme, por ajo që na intereson kryesisht është fakti se me ndihmën e tij mund të bëni më pak ndryshime gjatë inkorporimit të të njëjtit sasi informacioni, sa më i madh të jetë rasti i përdorur, ndërsa për të realizuar vetë algoritmin kërkohen vetëm operacione të thjeshta (de)kodimi të Huffman dhe RLE.

Ndryshimet vetë kryhen mbi koeficientët e plotë dhe reduktohen në zvogëlimin e vlerës së tyre absolute me një njësi, e cila e bën, në përgjithësi, të mundur përdorimin e F5 për kompresimin e të dhënave. E vërteta është se koeficienti i zvogëluar në vlerën absolute, shumë pranë gjasave do të zërë më pak bit pas përfundimit të kodimit Huffman për shkak të shpërndarjes statistikore të vlerave në JPEG.

Kursejmë hapësirën në hard disku me anë të steganografisë

Në rastin e krijimit të zeros (e njohur si reduktim), numri i informacionit të ruajtur do të pakësohet me madhësinë e saj, duke qenë se koeficienti i mëparshëm, i vetëdijshëm, do të bëhet pjesë e sekuencës RLE të koduar të zeros:

Kursejmë hapësirën në hard disku me anë të steganografisë

Modifikime

Mbrojtja e të dhënave dhe kompresimi i tyre janë detyra ortogonale, prandaj është e mundur të injorohet ri-zhvendosja sekrete të fjalëkalimit nga algoritmi origjinal. Për më tepër, na nevojitet të dimë saktësisht se si të nxjerrim të dhënat, prandaj të gjitha informacionet e nevojshme për këtë (cilat konteinerë janë përdorur, në cilën rend dhe etj.) duhet të shkruhen në një skedar të veçantë dhe të jenë të hapura për lexim të lirë nga arkivuesi.

Algoritmi origjinal është i dizajnuar për të transferuar mesazhe sekrete, prandaj punon njëherësh vetëm me një konteiner, duke supozuar se përdoruesi do të ndajë atë në pjesë sipas nevojës, nëse ndonjëherë do të shfaqet. Për më tepër, për inkorporimin e pavarur në çdo konteiner, është e nevojshme të dihet paraprakisht sa bit të dhënash të vendosen në çdo një. Prandaj, koeficientët e secilës element të bibliotekës duhet të mblidhen në një të madhe abstrakte dhe të punohet me të sipas algoritmit origjinal.

Duke origjinali F5 lejon përdorimin e deri në 12% të madhësisë së kontejnerit, një modifikim i tillë do të rrisë gjithashtu kapacitetin maksimal: "deri në 12%" të madhësisë së të gjithë bibliotekës është më e madhe ose e barabartë me shumën "deri në 12%" të çdo prej elementeve të saj.

Skema totale e kodifikuar duket si më poshtë:

Kursejmë hapësirën në hard disku me anë të steganografisë

Algoritmi i vetë

Tani është koha për të përshkruar algoritmin nga fillimi deri në fund, për të mos mbajtur lexuesin në të(paktën).

  • PĂ«rdoruesi pĂ«rcakton tĂ« dhĂ«nat binarĂ« tĂ« kompresuar M dhe bibliotekĂ«n L me ndihmĂ«n e njĂ« shprehje tĂ« rregullt dhe drejtorisĂ« rrĂ«njĂ«sore tĂ« kĂ«rkimit;
  • NĂ« renditjen e ndjekjes nĂ« sistemin e skedarĂ«ve, elementĂ«t e bibliotekĂ«s formojnĂ« MC:
    • Nga tĂ« dhĂ«nat e skedarit dekodohet njĂ« seri koeficientĂ«sh C;
    • MC <- MC | C;
  • PĂ«rcaktohet parametri k bazuar nĂ« barazimin e frikshĂ«m: |M| * 8 / (count_full(MC) + count_ones(MC) * k_rate(k)) < k / ((1 << k) - 1);
  • Merrni radhazi n = (1 << k) - 1 bitĂ«t mĂ« tĂ« rinj tĂ« elementeve jo-zero nga MC dhe shkruhen nĂ« a:
    • Kalkulohet funksioni magjik i hash-it f, qĂ« shfaq njĂ« fjalĂ« n-bit a nĂ« njĂ« k-bit s;
    • NĂ«se s == 0, atĂ«herĂ« nuk ka nevojĂ« pĂ«r asnjĂ« ndryshim dhe algoritmi kalon te koeficientĂ«t e tjerĂ«;
    • Ulet vlera absolute e koeficientit qĂ« pĂ«rkon me s-bitin e -Ă« nĂ« fjalĂ« a;
    • NĂ«se si rezultat i uljes ka ndodhur njĂ« shkurtim (koeficienti Ă«shtĂ« bĂ«rĂ« 0), atĂ«herĂ« pĂ«rsĂ«ritni hapin nga fillimi;
  • TĂ« gjithĂ« koeficientĂ«t kodifikohen me RLE dhe Huffman, shkruhen nĂ« skedarĂ«t burim;
  • NĂ« skedarin e arkivĂ«s shkruhet parametri k;
  • Nga çdo skedar L, nĂ« rendin e gjetjes sĂ« tyre origjinale, llogaritet hash-i MD5 dhe shkruhet nĂ« skedarin e arkivĂ«s.

Teknologji të larta

Forma naive e algoritmit dhe implementimet në gjuhë të tjera të nivelit të lartë (sidomos, ato me grumbullim të plehrave) do të jepnin një performancë të tmerrshme, prandaj të gjitha këto kompleksitete unë i realizova në C të pastër dhe kryeva një sërë optimizimesh si për shpejtësinë e ekzekutimit ashtu edhe për kujtesën (nuk mund ta besoni sa shumë peshojnë këto figura pa kompresim edhe deri në DCT). Por edhe kështu, fillimisht shpejtësia e ekzekutimit la shumë për të dëshiruar, prandaj nuk do ta përshkruaj të gjithë procesin dhe metodat e përdorura.

Kros-platforma është arritur duke përdorur një kombinim bibliotekash libjpeg, pcre dhe tinydir, për të cilat falenderojmë. Defaulti është të kompiloni përmes një make, prandaj përdoruesit e Windows duan të instalojnë një Cygwin, ose të kuptojnë me Visual Studio dhe bibliotekat vetë.

Zbatimi është i disponueshëm në formën e një utilitari konsolë dhe libërkosh. Më shumë rreth përdorimit të fundit ata që dëshirojnë mund të informohen në ridhimin në depo në GitHub, lidhjen e së cilës do ta bashkangjis në fund të postimit. Tani, le të kalojmë në përshkrimin dhe demonstrimin e funksionit.

Si të përdorni?

Me kujdes. Imazhet e përdorura mund të lëvizin, riemërohen dhe kopjohen sipas dëshirës. Megjithatë, duhet të jeni jashtëzakonisht të kujdesshëm dhe të mos ndryshoni përmbajtjen e tyre. Ndryshimi i një blloku do të çojë në shkeljen e hashes dhe pamundësinë e rikuperimit të informacionit.

Le të themi se pas kompaktimit morëm një skedar ekzekutues f5ar. Mund të analizoni madhësinë e librit për të llogaritur mundësitë e përdorimit të saj me ndihmën e flagut -a: .\/f5ar -a [folderi i kërkimit] [shprehje rregullore për Perl]. Kompresimi bëhet me komandën .\/f5ar -p [folderi i kërkimit] [shprehje rregullore për Perl] [skedari i kompresuar] [emri i arkivit], ndërsa dekompresimi me anë të .\/f5ar -u [skedari i arkivit] [emri i skedarit të rikuperuar].

Demonstrimi i funksionimit

PĂ«r tĂ« treguar efikasitetin e metodĂ«s, kam ngarkuar njĂ« koleksion prej 225 fotografive tĂ« papaguara tĂ« qenve nga shĂ«rbimi Unsplash. Çdo njĂ«ra prej tyre ka pak mĂ« shumĂ« cilĂ«si sesa fotografitĂ« e zakonshme tĂ« pĂ«rdoruesve, por megjithatĂ«. Çdo njĂ«ra prej tyre Ă«shtĂ« rikoduara me ndihmĂ«n e libjpeg, pĂ«r tĂ« zbutur ndikimin e veçorive tĂ« kodimit tĂ« librit nĂ« madhĂ«sinĂ« totale. PĂ«r tĂ« treguar shembullin mĂ« tĂ« keq tĂ« tĂ« dhĂ«nave qĂ« mund tĂ« kompresohen me ndihmĂ«n e dd Ă«shtĂ« krijuar njĂ« skedar rastĂ«sor 36-metror (pak mĂ« shumĂ« se 5% e madhĂ«sisĂ« totale) me shpĂ«rndarje tĂ« barabartĂ«.

Processi i testimit është mjaft i thjeshtë:

$ ls
binary_data dogs f5ar
$ du -sh dogs/
633M dogs/
$ du -h binary_data
36M binary_data

$ .\/f5ar -p dogs/ .*jpg binary_data dogs.f5ar
Duke lexuar skedarin e kompresuar... ok
Duke inisializuar arkivin... ok
Duke analizuar kapacitetin e librit... përfunduar në 16.8s
Kapaciteti i garantuar i identifikuar është 48439359 bytes
Kapaciteti i mundshëm i identifikuar është deri në 102618787 bytes
Duke kompresuar... përfunduar në 32.6s
Duke ruajtur arkivin... ok

$ .\/f5ar -u dogs/dogs.f5ar e dekompresuar
Duke inicializuar arkivin... ok
Duke lexuar skedarin e arkivit... ok
Duke mbushur arkivin me skedarë... përfunduar në 1.2s
Duke dekompresuar... përfunduar në 17.5s
Duke shkruar të dhënat e nxjerra... ok

$ sha1sum binary_data e dekompresuar
ba7ade4bc77881ab463121e77bbd4d41ee181ae9 binary_data
ba7ade4bc77881ab463121e77bbd4d41ee181ae9 e dekompresuar
$ du -sh dogs/
563M dogs/

Ose një screenshot për adhuruesit

Kursejmë hapësirën në hard disku me anë të steganografisë

Siç duket, nga 633 + 36 == 669 megabajt të të dhënave në diskun e ngurtë, ne erdhëm në 563 më të këndshëm, që na jep një raport kompresimi ~1,188. Kjo ndryshim radikal shpjegohet nga humbjet tejet të vogla, të ngjashme me ato që arrihen gjatë optimizimit të skedarëve JPEG me metoda klasike (si tinyjpg). Sigurisht, me përdorimin e kompresimit steganografik, informacioni nuk humbet thjesht, por përdoret për kodimin e të dhënave të tjera. Më shumë se kaq, numri i koeficientëve të 'optimizuar' falë përdorimit të F5 është shumë më i vogël, sesa gjatë optimizimit tradicional.

ÇfarĂ«do modifikimesh qĂ« tĂ« jenĂ«, ato nuk duken aspak pĂ«r syrin. NĂ«n spoilerin mĂ« poshtĂ«, lexuesi mund tĂ« vlerĂ«sojĂ« ndryshimin si me sy ashtu dhe duke zbritur vlerat e komponentĂ«s sĂ« ndryshuar nga origjinali (sa mĂ« e zbehtĂ« tĂ« jetĂ« ngjyra, aq mĂ« pak Ă«shtĂ« ndryshimi):

Linke për imazhe, që nuk kanë gjetur vend në habrastorage

Origjinali — https://i.ibb.co/wNDLNcZ/1.jpg
Modifikuar — https://i.ibb.co/qWvpfFM/1.jpg
Ndryshimi — https://i.ibb.co/2ZzhHfD/diff.jpg

Në përfundim

Shpresoj se kam arritur tĂ« bind lexuesin se tĂ« tilla metoda janĂ« tĂ« mundshme dhe meritojnĂ« tĂ« ekzistojnĂ«. MegjithatĂ«, blerja e njĂ« disku tĂ« ngurtĂ« ose e njĂ« ĐșĐ°Đœali shtesĂ« (pĂ«r transmetim nĂ« rrjet) mund tĂ« duket njĂ« zgjidhje shumĂ« mĂ« e thjeshtĂ« se sa tĂ« pĂ«rpiqesh tĂ« ekonomizosh nĂ« kĂ«tĂ« mĂ«nyrĂ«. NĂ« njĂ«rĂ«n anĂ«, kjo Ă«shtĂ« e vĂ«rtetĂ«, zhvillimi ekstensiv shpesh Ă«shtĂ« mĂ« i lehtĂ« dhe mĂ« i besueshĂ«m. Por nga ana tjetĂ«r, nuk duhet harruar zhvillimi intensiv. Sepse nuk ka garanci qĂ« nesĂ«r do tĂ« mundesh tĂ« shkosh nĂ« dyqan dhe tĂ« blesh njĂ« disk tĂ« ngurtĂ« me njĂ« mijĂ« terabajta, ndĂ«rsa pĂ«rdorimi i atyre qĂ« tashmĂ« i ke nĂ« shtĂ«pi Ă«shtĂ« gjithmonĂ« njĂ« mundĂ«si.

-> GitHub

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster