Kui me rÀÀgime steganograafiast, siis inimesed nĂ€evad silme ees terroriste, pedofiile, spioone ja parimal juhul krĂŒptoanarkiste ning muid teadlasi. Ja tĂ”epoolest, kellele muule vĂ”iks olla vaja vaikimisi midagi vĂ€listest pilkudest? Milline vĂ”iks sellest olla kasu tavalisele inimesele?
Selgub, et mingi kasu on. Just seetĂ”ttu hakkame tĂ€na andmeid tihendama steganograafia meetodite abil. Ja lĂ”puks saab lugeja isegi kasutada oma vÀÀrtuslikke JPEG-fotokollektsioone, et suurendada vabade gigabaitide arvu failisĂŒsteemis.

Mis?
Kui lugeja mĂ€letab, siis steganograafia on sellised kummalised algoritmid, mis vĂ”imaldavad peita ĂŒhe teabe olemasolu teise sisse. Veel lihtsamalt öeldes: pilt + fail == umbes sama pilt, aga mitte pĂ€ris (koos piltidega vĂ”ib olla midagi, aga tavaliselt on see nende peal selgem). Samuti ei tohiks olla lihtsat viisi kindlaks tegemiseks, kas sees on midagi vĂ”i mitte.
Kuid kui ĂŒhte teisest eristada ei saa, siis kas mingi vahe on? Tarbija ja kasutaja seisukohalt ei huvita matemaatiline tĂ€psus (mida peegeldab konkreetne bitide kogum), vaid vaid see, kuidas ta seda tajub.
NĂ€iteks vaatame kolme armsa koera pilti:
Olge ettevaatlikud, JPEG!

Vaatamata tohutule suuruse erinevusele, valib vĂ€hesed kolmanda variandi. Teisest kĂŒljest ei ole esimeste kahe foto vahel vahe nii mĂ€rgatav ja teabe hulk neis (minu arvates) on ligikaudu vĂ”rdne.
See pĂ”himĂ”te iseenesest on juba vana ning on aastaid aktiivselt kasutatud kaotusega andmete tihendamise meetodites. Kuid purustada â ei tĂ€henda ehitada, meid huvitab kĂŒsimuse arenenum kĂŒlg. Kas on vĂ”imalik sisestada tĂ€iendavat teavet suuruses N faili nii, et selle suurus suureneks M < N, ja muudatused ei oleks kasutajale nĂ€htavad?
Muidugi on see vÔimalik. Kuid tuleb kohe teha paar mÀrkust:
- Esiteks peab meetod olema universaalne ja andma positiivse tulemuse enamiku sisendandmete puhul. See tÀhendab, et keskmiselt, juhusliku sisendi puhul, peaks toimuma tegelik salvestatava teabe hulga vÀhenemine. "Keskmiselt" tÀhendab, et vastupidised juhused vÔivad esineda, kuid ei tohi domineerida.
- Teiseks, enne teabe sisestamist peab kokkusurutud konteineri suurus olema suurem kui selle kokkusurutud sarnane modifikatsioon. BMP-pilte LSB meetodil bittide kuhjamisega ei saa pidada steganograafiliseks kokkusurutiseks, kuna pÀrast DEFLATE'i kasutamist on originaalpilt tÔenÀoliselt oluliselt vÀiksem.
- Kolmandaks, tulemusi tuleb vĂ”rrelda klassikaliste meetoditega juba kokku surutud andmete suhtes. See aitab kĂ”rvaldada tĂ”enĂ€osusliku eriĂŒlesande mĂ”ju ja tagab tĂ”husama kokkusurumise ĂŒldiselt.
Kus?
Steganograafia kasutamine eeldab, et lisaks kokkusurutavale teabele on meil vaja ka konteinereid, kuhu see sisse kirjutatakse. Maksimaalne sisestatav teabe hulk sÔltub paljuski eraldiseisvatest omadustest, kuid see skaleerub nende arvu tÔttu palju lihtsamalt. SeetÔttu peaks konteinerite formaat olema levinud, et kasutajal oleks piisavalt neist valikuid, et saavutada mingit kasu kokkusurumise protsessist.
Sellises kontekstis on head kandidaadid graafika-, audio- ja videofailid. Kuid erinevate formaatide, koodekite jm mitmekesisuse tÔttu on valik tegelikult mitte nii suur.
Arvestades kÔike seda, langetasin oma valiku JPEG'i kasuks. See on peaaegu kÔigil olemas, seda kasutatakse laialdaselt nii isiklikel kui ka Àriotstarbel, olles peaaegu de facto formaat enamikule piltidele.

Kuidas?
Edasi tulevad umbes tehnilised skeemid ja kirjeldused ilma erilise selgituseta, nii et soovijad vÔivad need vahele jÀtta ja liikuda jaotisse 'Tipptehnoloogia'.
Ăldised jooned
Andmete sisestamiseks tuleb esmalt kindlaks teha, kuhu. FailisĂŒsteemis vĂ”ib olla mitmeid erinevaid fotosid, millest kasutaja soovib kasutada vaid mĂ”nda. Seda soovitud konteinerite kogumit nimetame raamatukoguks.
See tekib kahes olukorras: enne kokkusurumist ja enne lahtipakkimist. Esimesel juhul saab lihtsalt kasutada failide nimede komplekti (ja veelgi parem, regulaaravaldust nende jaoks), kuid teisel juhul on vajalik midagi usaldusvÀÀrsemat: kasutaja vĂ”ib neid kopeerida ja liikuda failisĂŒsteemi piiresse, mistĂ”ttu on keeruline neid Ă”igesti tuvastada. SeetĂ”ttu on vajalik nende hashide (md5 piisab) salvestamine pĂ€rast kĂ”iki modifikatsioone.
Algne otsing regulaaravaldusega ei oma mĂ”tet lĂ€bi kogu failisĂŒsteemi teostada, piisab, kui nĂ€idata mĂ”nda juurdirectory. Sellesse salvestatakse spetsiaalne arhiivifail, milles asuvad need hashid koos muu meta-informatsiooniga, mis on vajalik edasise tihendamise teabe taastamiseks.
KÔik see kehtib vÔrdselt iga steganograafilise andmekokkusurumise algoritmi rakenduste kohta. Andmete kokkusurumise ja taastamise protsesse vÔib nimetada pakkimiseks ja lahtipakkimiseks.
F5
NĂŒĂŒd, kui on selge, mida ja miks teeme, on jÀÀnud kirjeldada eesmĂ€rgi saavutamise algoritmi. Tuletame meelde JPEG-faili kodeerimise protsessi (tĂ€nu Bauman National Library wiki-le):

Seda vaadates on parem kohe teha mÔned mÀrkused:
- JPEG faili suurust vÔib pidada optimaalseks, isegi mitte proovimata seda nÀiteks WinRARiga tihendada;
- Muudatada tohib ainult salvestatud teavet (seda, mis on diskreetse kosinusse muundamise, DCT, vÀljundis), et tagada vÀhemalt mingisugune vastuvÔetav jÔudlus.
- Et mitte kaotada andmeid kasutaja jaoks mĂ€rgatavas tööstuslikus skaalas, tuleb iga ĂŒksiku pildi puhul teha minimaalne muudatus;
Sellistele tingimustele sobib terve algoritmide perekond, millega saab tutvuda. . KĂ”ige arenenum neist on algoritm autoriĂ”igusega Andreas Westfeld, kes töötab DCT heleduskomplekti koefitsientidega (inimese silm on nende muutumise suhtes kĂ”ige vĂ€hem tundlik). Tema töö ĂŒldine skeem olemasoleva JPEG-failiga töötamisel on jĂ€rgmine skeem:

F5 plokk kasutab edasijĂ”udnud sisestusmeetodit, mis pĂ”hineb maatrixkoodil. Lisainfot selle ja algoritmi kohta saab lugeda ĂŒlaltoodud lingilt, kuid meid huvitab eelkĂ”ige see, et selle abil saab teha seda vĂ€hem muudatusi, kui sisestatakse sama palju teavet, kui containeri suurus kasvab, ja algoritmi teostamiseks on vajalikud vaid lihtsad (de)koodi operatsioonid, nagu Haffmani ja RLE dekodeerimine.
Muutused ise toimuvad tĂ€isarvuliste koefitsientide ĂŒle ning need vĂ€henevad nende absoluutvÀÀrtuse vĂ”rra ĂŒhe vĂ”rra, mis vĂ”imaldab, et F5-d saab kasutada andmete surumisel. See tuleneb asjaolust, et absoluutvÀÀrtuse poolest vĂ€hendatud koefitsient kasutamise ajal tĂ”enĂ€oliselt vajab Haffmani kodeerimise tĂ”ttu vĂ€hem bitti, arvestades JPEG'i vÀÀrtuste statistilist jaotust.

Kui tekib null (nn lĂŒhendamine), vĂ€heneb salvestatud teabe maht selle suuruse vĂ”rra, kuna endine iseseisev koefitsient muutub osa kodeeritud RLE nullide jadast:

Muudatused
Andmete kaitse ja nende kokkusurumine on ortogonaalsed ĂŒlesanded, seetĂ”ttu saab disainida salajase parooli ĂŒmberpaigutamise algorĂŒtmist. Veelgi enam, meil on vaja tĂ€pselt teada, kuidas andmeid taastada, seetĂ”ttu peab kogu vajalik teave (millised konteinerid on kasutatud, millises jĂ€rjekorras jne) olema salvestatud eraldi faili ja olema avatud ilma piiranguteta arhiveerijale.
Algne algoritm on mĂ”eldud salajaste sĂ”numite edastamiseks, seetĂ”ttu töötab see korraga vaid ĂŒhe konteineriga, eeldades, et kasutaja jagab selle vajadusel osadeks, kui see peaks tekkima. Veelgi enam, iseseisva sisestamise korral igasse konteinerisse tuleb eelnevalt teada, kui palju biti andmeid igasse mahutada. SeetĂ”ttu tasub iga elemendi koefitsiendid ĂŒhendada ĂŒheks abstraktseks suureks ja töötada selle pĂ”hjal algse algoritmiga.
Kuna originaalne F5 vĂ”imaldab kasutada kuni 12% konteineri suurusest, suurendab see modifikatsioon ka maksimaalset mahtu: âkuni 12%â kogu raamatukogu suurusest on suurem vĂ”i vĂ”rdne iga selle elementi âkuni 12%â summa.
Kodeeritud ĂŒldskeem nĂ€eb vĂ€lja jĂ€rgmine:

Algoritm ise
NĂŒĂŒd on aeg kirjeldada algoritmi algusest lĂ”puni, et lugejat teadmatuses hoida:
- Kasutaja mÀÀrab binaarsed tihendatavad andmed M ja raamatukogu L regulaaravalduse ja otsingudirektori abil;
- FailisĂŒsteemis raamatukogu elemendid moodustavad MC:
- Failist dekodeeritakse koefitsientide seeria C;
- MC <- MC | C;
- MÀÀratakse parameeter k, lÀhtudes kohutavast ebavÔrdsusest:
|M| * 8 / (count_full(MC) + count_ones(MC) * k_rate(k)) < k / ((1 << k) - 1); - JÀrgemööda vÔetakse
n = (1 << k) - 1nulliga mittetÀielike elementide madalamad bitid MC-st ja salvestataksea:- Arvutatakse maagiline hash-funktsioon
f, mis tÔlgendab n-bitist sÔnaak-bitisekss; - Kui
s == 0, siis ei ole midagi muuta ja algoritm lÀheb jÀrgmistele koefitsientidele; - VÀhendada koefitsiendi absoluutset vÀÀrtust, mis vastutab
s-ndate bitide eest sĂ”nasa; - Kui vĂ€hendamise tulemusena toimus lĂŒhenemine (koefitsient sai 0), siis korrata sammu algusest;
- Arvutatakse maagiline hash-funktsioon
- KÔik koefitsiendid kodeeritakse RLE ja Huffmani jÀrgi, salvestatakse algsetesse failidesse;
- Arhiivifaili salvestatakse parameeter k;
- Iga faili L originaalses jÀrjekorras arvutatakse MD5-hash ja salvestatakse arhiivifaili.
Tipptehnoloogia
Algoritmi naiivne vorm ja rakendused teistes kĂ”rgematĂ€htsusega (eriti, prĂŒgikoristusega) keeltes annaksid kohutava jĂ”udluse, seega realiseerisin kĂ”ik need keerukused puhtas C-s ja tegin rida optimeerimisi nii tĂ€itmise kiirusel kui ka mĂ€lus (te ei oska ette kujutada, kui palju need pildid kaaluvad ilma tihendamiseta isegi DCT-le). Kuid ka nii, alguses jĂ€ttis tĂ€itmise kiirus pigem soovida, seega ei kavatse ma kogu protsessi ja kasutatud meetodeid kirjeldada.
PlatvormideĂŒlene toimimine on saavutatud libjpeg, pcre ja tinydir raamatukogude kombinatsiooni kasutamise kaudu, mille eest olen neile tĂ€nulik. Vaikimisi kompileeritakse kĂ”ik tavalisest tee, seega tahavad Windowsi kasutajad endale mingi Cygwini installida vĂ”i ise Visual Studio ja raamatukogudega tegeleda.
Rakendamine on saadaval kĂ€surea utiliidi ja teegi vormis. Ăksikasjade tutvumiseks viimasest saavad huvilised lugeda rida README failis GitHubis, mille lingi ma postituse lĂ”pus jagan. Siin liigume edasi kirjelduse ja töö demonstreerimise juurde.
Kuidas kasutada?
Olgem ettevaatlikud. Kasutatud pilte vĂ”ib liigutada, ĂŒmber nimetada ja kopeerida, kuid tuleb olla ÀÀrmiselt ettevaatlik ja mitte muuta nende sisu. Ăhe bitti muutmine toob kaasa rikka hĂ€ire ja teabe taastamise vĂ”imatuse.
Oletame, et kompileerimise kĂ€igus saime tĂ€itmisfaili f5ar. Saame analĂŒĂŒsida teegi suurust, et arvutada selle kasutamise vĂ”imalusi lipuga -a: .\/f5ar -a [otsingu kaust] [Perl-i ĂŒhilduv regulaaravaldis]. Pakendamine toimub kĂ€suga .\/f5ar -p [otsingu kaust] [Perl-i ĂŒhilduv regulaaravaldis] [pakendatav fail] [arhivi nimi], ja dekompresseerimine toimub kĂ€su abil .\/f5ar -u [arhvi fail] [taas taastatud faili nimi].
Töö demonstreerimine
Kuna meetodi efektiivsust nĂ€idata, laadisin ĂŒles kogu 225 tĂ€iesti tasuta koera fotograafia kogu teenusest. . IgaĂŒhel neist on veidi parem kvaliteet kui tavalised kasutaja fotod, kuid siiski. IgaĂŒks neist on kodeeritud libjpeg abil, et vĂ€hendada koodimisraamatukogu eripĂ€rade mĂ”ju ĂŒldisele suurusele. Halvimate tihendatavate andmete nĂ€itamiseks genereeriti dd abil juhuslik 36-meetrine (natuke ĂŒle 5% kogusuurusest) ĂŒhtlaselt jaotatud fail.
Testimise protsess on ĂŒsna lihtne:
$ 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
Compressing file... ok
Initializing the archive... ok
Analysing library capacity... done in 16.8s
Detected somewhat guaranteed capacity of 48439359 bytes
Detected possible capacity of upto 102618787 bytes
Compressing... done in 32.6s
Saving the archive... ok
$ .\/f5ar -u dogs/dogs.f5ar unpacked
Initializing the archive... ok
Reading the archive file... ok
Filling the archive with files... done in 1.2s
Decompressing... done in 17.5s
Writing extracted data... ok
$ sha1sum binary_data unpacked
ba7ade4bc77881ab463121e77bbd4d41ee181ae9 binary_data
ba7ade4bc77881ab463121e77bbd4d41ee181ae9 unpacked
$ du -sh dogs/
563M dogs/VÔi ekraanipildina selle huvitatud jaoks

Kuidas nÀha, algsetest 633 + 36 == 669 megabaidist andmeid kÔvakettal jÔudsime meeldivamatele 563-le, mis annab meile tihendustegevuse koefitsiendiks umbes 1,188. Selline radikaalne erinevus tuleneb ÀÀrmiselt vÀikestest kaotustest, mis on sarnased klassikaliste meetodite (nt tinyjpg) JPEG-failide optimeerimisega saadud tulemustele. Loomulikult, kasutades steganograafilist tihendamist, ei kaotata teave lihtsalt, vaid seda kasutatakse teiste andmete kodeerimiseks. Veelgi enam, F5 kasutamise tÔttu on
ĂkskĂ”ik millised modifikatsioonid ei ole silmale absoluutselt mĂ€rgatavad. Allpool oleva spoileriga saab lugeja hinnata erinevust nii visuaalselt kui ka muudatuste komponentide vÀÀrtuste originaalist lahutamise teel (mida vĂ€hem kĂŒllastunud on vĂ€rv, seda vĂ€iksem on erinevus):
Pildilinkide kohta, mis ei mahtunud habrastorage'i
Originaal â
Muudetud â
Erinevus â
LÔpetuseks
Loodan, et suutsin veenda lugejat, et sellised meetodid on vĂ”imalikud ja vÀÀrivad ellujÀÀmist. Samas vĂ”ib olla palju lihtsam osta kĂ”vaketas vĂ”i tĂ€iendav kanal (vĂ”rgus edastamiseks), kui proovida sel viisil kokku hoida. Ăhelt poolt on see tĂ”si, ekstensiivne areng on sageli lihtsam ja usaldusvÀÀrsem. Kuid teisest kĂŒljest ei tohiks unustada ka intensiivset lĂ€henemist. LĂ”ppude lĂ”puks ei ole mingit garantiid, et homme saab poodi minna ja osta endale uus kĂ”vaketas tuhande terabaidi mahuga, aga juba kodus olemasolevaid saab alati kasutada.
->
Allikas: habr.com
