Kui me rÀÀgime steganograafiast, siis inimesed kujutavad endale ette terrorismi, pedofiile, spioone, ehkki parimal juhul ka krĂŒptoanarchiste ja teisi teadlasi. Ja tĂ”epoolest, kellele veel seda ĂŒldse vĂ”iks vaja minna? peita midagi vĂ€liste pilkude eest? Mis kasu sellest tavalisele inimesele vĂ”iks olla?
Selgub, et mingi kasu on olemas. Just seepĂ€rast hakkame tĂ€na andmeid steganograafia meetoditega kokkupanema. Ja lĂ”puks saab lugeja isegi kasutada oma vÀÀrtuslikke JPEG-fotoarhiive, et suurendada vabade gigabaitide arvu failisĂŒsteemis.

Mida?
Kui lugeja mĂ€letab, siis steganograafia â need on kummalised algoritmid, mis vĂ”imaldavad peita ĂŒht infot teise sisse. Veel lihtsamalt öeldes: pilt + fail == umbes sama pilt, aga mitte pĂ€ris (pilti vĂ”ib asendada millega iganes, aga tavaliselt on piltide puhul kĂ”ik arusaadavam). Samas ei tohiks olla lihtsat viisi mÀÀrata, kas sees on midagi vĂ”i mitte.
Aga kui ĂŒhte teisest eristada ei saa, kas siis ĂŒldse on vahet? Tarbija, kasutaja ei muretse matemaatilise tĂ€psuse pĂ€rast (mida peegeldab konkreetne bittide kogum), vaid ainult selle ĂŒle, kuidas nad seda tajuvad.
Vaatame nÀiteks kolme armsa koera pilti:
Olge ettevaatlik, JPEG!

Vaatamata tohutule suuruse erinevusele valib vÀhe inimesi kolmanda versiooni. Teiselt poolt ei ole kahe esimesse foto vahel vahe nii mÀrgatav ja nende informatsiooni hulk (minu arvates) on sarnane.
See pĂ”himĂ”te on iseenesest juba vana ja on mitu aastat aktiivselt kasutusel kaotava infokasutatuse meetoditega. Kuid purustamine ei ole ehitamine; meie huvi on arenenumate kĂŒsimuste poole. Kas on vĂ”imalik lisada tĂ€iendavat teavet suuruses N faili nii, et selle suurus suureneks M < N, ja muudatused ei oleks kasutajale mĂ€rgatavad?
Muidugi on see vÔimalik. Kuid tasub kohe teha paar tÀhelepanekut:
- Esiteks peab meetod olema universaalne ja andma positiivse tulemuse enamus sisendandmete korral. See tÀhendab, et keskmiselt, mistahes sisendi jaoks, peab toimuma tegelik salvestatud teabe vÀhenemine. "Keskmiselt" tÀhendab, et vastupidised juhtumid vÔivad esineda, kuid ei tohi olla enamuses.
- Teiseks peab komprimeeritud konteineri maht enne teabe sisestamist olema suurem kui sarnasel viisil komprimeeritud selle modifikatsioon. Lihtsalt BMP-pilte LSB meetodil mitmete bittide sisestamine ei ole steganograafiline kompressioon, kuna originaalpilt, kui see lÀbi nÀiteks DEFLATE'i viia, on tÔenÀoliselt mÀrgatavalt vÀiksem.
- Kolmandaks tuleb tulemusi hinnata ja vĂ”rrelda juba klassikaliste meetoditega komprimeeritud andmete suhtes. See vĂ”imaldab kĂ”rvaldada tĂ”enĂ€osusliku efekti nende liigsete andmete erinevustest ja viia ellu tĂ”husamat kompressiooni ĂŒldjuhul.
Kus?
Steganograafia kasutamine eeldab, et lisaks surutud teabele on meil vaja ka konteinerite faile, kuhu see integreeritakse. Integreeritava teabe maksimaalne hulk sĂ”ltub paljuski individuaalsetest omadustest, kuid nende arvu suurenedes muutub see palju lihtsamaks. SeetĂ”ttu peaks konteineriformaat olema levinud, et kasutajal oleks piisavalt nende varusid, et protsessist âsurumineâ mingit kasu saada.
Selles kontekstis on head kandidaadid graafilised, audio- ja videofailid. Kuid, erinevate formaatide, koodekite jms mitmekesisuse tÔttu jÀÀb meile praktikas valik mitte kuigi paljusid variante.
Kuna arvesse tuleb vÔtta kÔiki neid aspekte, langetasin otsuse JPEG-i kasuks. See on praktiliselt kÔigil kasutuses, laialdaselt nii isiklikel kui Àritegevuse eesmÀrkidel, olles de facto formaat enamikule piltidest.

K̶o̶g̶d̶a̶ Kuidas?
Edasi liikudes on umbes tehnilised skeemid ja kirjeldused, ilma eriliste selgitusteta, seega soovijad vĂ”ivad need vahele jĂ€tta, kerides jaotisse âTipptehnoloogiaâ.
Ăldised jooned
Andmete lisamiseks on kĂ”igepealt vaja mÀÀrata, kuhu need paigutada. FailisĂŒsteemis vĂ”ib olla palju erinevaid fotosid, millest kasutaja soovib valida ainult mĂ”ned. Sellist soovitud konteinerite kogumit nimetame raamatukoguks.
See kujuneb kahes olukorras: enne kokkusurumist ja enne lahti pakkimist. Esimeses olukorras vĂ”ib kasutada lihtsalt failide nimede komplekti (veel parem, regulaarset vĂ€ljendit nende jaoks), kuid teises olukorras on vajalik midagi usaldusvÀÀrsemat: kasutaja vĂ”ib neid failide sĂŒsteemide vahel kopeerida ja liigutada, mistĂ”ttu on keeruline neid korrektselt mÀÀrata. SeetĂ”ttu on vajalik nende hash-koodide (md5 piisab) salvestamine pĂ€rast kĂ”iki muudatusi.
Algne otsing regulaarse vÀljendi abil ei ole mÔtet teha kogu FS-i ulatuses, piisab, kui mÀÀrata mÔni juurkataloog. Just sellesse salvestatakse eriline arhivifail, kus hoitakse neid hash-koodide koos muu meta-informatsiooniga, mis on vajalik edasiseks kokkusurutud teabe taastamiseks.
KÔik see kehtib igasuguste steganograafilise andmekompressiooni algoritmide rakenduste kohta. Andmete kokkusurumise ja taastamise protsesse vÔib nimetada pakkimiseks ja lahtipakkimiseks.
F5
NĂŒĂŒd, kui on selge, mida ja miks teeme, jÀÀb veel 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 kui ei proovita seda nÀiteks WinRARiga tihendada;
- Muutma tohib ainult salvestatud teavet (seda, mis on diskreetse kosinuse transformatsiooni, DCT, vÀljundis), et tagada mingisugune vastuvÔetav jÔudlus.
- Et vÀltida andmete kadumist mÀrgatavates tööstuslikes mÔÔtmetes, on vajalik teha iga eraldi pildi korral minimaalne muudatus;
Nende tingimuste jaoks sobib terve algoritmide perekond, millega on vĂ”imalik tutvuda . KĂ”ige arenenum neist on algoritm Andreas Westfeldi autorlusega, kes töötas DCT komponentide heleduse koefitsientide peal (inimese silm on kĂ”ige vĂ€hem tundlik nende muutuste suhtes). Tema ĂŒldine skeem olemasoleva JPEG-faili töötlemiseks on jĂ€rgmine:

F5 plokk kasutab edasijĂ”udnud sisestamismeetodit, mis pĂ”hineb maatriksi kodeerimisel. Lugeja vĂ”ib selle ja algoritmiga tutvuda ĂŒlaltoodud lingil, kuid meid huvitab eelkĂ”ige tĂ”siasi, et selle abil vĂ”ib sama teabe sisestamiseks teha seda vĂ€hem muudatusi, mida suurem on kasutatav konteiner, samas kui algoritmi lĂ€biviimiseks on vajalikud vaid lihtsad (de)koodimise Haffmanni ja RLE toimingud.
Muutused toimuvad tĂ€isarvuliste koefitsientide ĂŒle ning need vĂ€hendavad nende absoluutvÀÀrtust ĂŒhe vĂ”rra, mis vĂ”imaldab ĂŒldiselt kasutada F5 andmete tihendamiseks. Asi on selles, et absoluutvÀÀrtuse vĂ€henenud koefitsient vĂ”tab tĂ”enĂ€oliselt pĂ€rast Huffmani kodeerimist vĂ€hem bitti tĂ€nu JPEG-vÀÀrtuste statistilisele jaotusele.

Kui moodustub null (nn lĂŒhendamine), vĂ€heneb salvestatud teabe hulk selle suuruse vĂ”rra, kuna endine iseseisev koefitsient muutub osa kodeeritud RLE jĂ€rjestusest nullidest:

Muutmised
Andmete kaitsmine ja nende tihendamine on ortogonaalsed ĂŒlesanded, seega vĂ”ib originaalalgoritmi salajast parooliga segamist puudutada. Veelgi enam, peame tĂ€pselt teadma, kuidas andmeid vĂ€lja vĂ”tta, seega kogu vajalik info (milliseid konteinerit kasutati, missuguses jĂ€rjekorras jne) peab olema salvestatud eraldi faili ja olema avatud arhivaatori vabaks lugemiseks.
Algoritm on loodud salajaste sĂ”numite edastamiseks, seega töötab see korraga vaid ĂŒhe konteineriga, eeldades, et kasutaja jagab selle vajadusel osadeks, kui seda peaks ĂŒldse vajalikuks pidama. Veelgi enam, iga konteineri iseseisva sisestamise korral tuleb eelnevalt teada, kui palju bitsid andmeid igasse paigutada. SeetĂ”ttu on mĂ”istlik kĂ”ik elemendid raamatukogust koondada ĂŒheks abstraktseks suuremaks, millega töötada algset algoritmi jĂ€rgides.
Kuna originaalne F5 lubab kasutada kuni 12% konteineri suurusest, suurendab selline muudatus ka maksimaalset mahtu: 'kuni 12%' kogu raamatukogu suurusest on suurem vÔi vÔrdne summaga 'kuni 12%' iga selle elementi puhul.
Koodifitseeritud ĂŒldskeem nĂ€eb vĂ€lja jĂ€rgmine:

Algoritm ise
NĂŒĂŒd on aeg kirjeldada algoritmi algusest lĂ”puni, et mitte jĂ€tta lugejat teadmatusse:
- Kasutaja mÀÀratleb binaarsed kompressitavad andmed M ja raamatukogu L koos regulaaravalduse ning otsingu juurdirektori abil;
- JĂ€rjekorras FS-is kujundavad raamatukogu elemendid MC:
- Failist dekoeeritakse C koefitsientide seeria;
- MC <- MC | C;
- Parameeter k mÀÀratakse kohutavast ebavÔrdsusest:
|M| * 8 / (count_full(MC) + count_ones(MC) * k_rate(k)) < k / ((1 << k) - 1); - JÀrjekorras vÔetakse
n = (1 << k) - 1nulli elementide madalamaid bitte MC-st ja kirjutataksea:- Arvutatakse maagiline hash-funktsioon
f, mis kaardistab n-bitise sÔnaak-bitisekss; - Kui
s == 0, siis ei ole vaja midagi muuta ja algoritm lÀheb jÀrgmistele koefitsientidele; - VÀhendada koefitsiendi absoluutvÀÀrtust, mis vastutab
s-nå biti sÔnasa; - Kui vÀhendamise tulemusel toimus kokkuvÔte (koefitsient sai 0), siis alusta samast sammust;
- Arvutatakse maagiline hash-funktsioon
- KÔik koefitsiendid kodeeritakse RLE ja Huffmaniga, kirjutatakse algfailidesse;
- Arhiivifaili kirjutatakse parameeter k;
- Iga faili L puhul, nende algse leidmise jÀrjekorras, arvutatakse MD5-hash ja kirjutatakse arhiivifaili.
Tipptasemel tehnoloogia
Algoritmi ja rakenduste naiivne vorm teistes kĂ”rgema taseme (eriti prĂŒgikorjatega) keeltes annaks horrikultöötava jĂ”udluse, seetĂ”ttu oleme need keerukused rakendanud puhtas C-s ja teinud rida optimeerimisi nii tĂ€itmise kiirusel kui ka mĂ€lus (te ei kujuta ette, kui palju need pildid ilma tihendamiseta kaaluvad isegi DCT tasemeni). Kuid sellele vaatamata jĂ€ttis tĂ€itmise kiirus alguses palju soovida, seega ei hakka ma kogu protsessi ja kasutatud meetodeid kirjeldama.
Platvormidevahelisuse oleme saavutanud libjpeg, pcre ja tinydir teekide kombinatsiooni kasutamisega, mille eest rÔÔmustame. Vaikimisi kompileeritakse kÔik tavalise kaudu make, seega soovivad Windowsi kasutajad endale Cygwini installida vÔi ise Visual Studio ja teekide kallal vaeva nÀha.
Teostus on saadaval konsoolirakenduse ja teekide kujul. Soovijad saavad viimase kasutamise kohta rohkem teavet lugeda readmi-st GitHubi repole, mille linki ma postituse lĂ”pus jagan. NĂŒĂŒd liigume edasi töötamise kirjelduse ja demonstreerimise juurde.
Kuidas kasutada?
Ole ettevaatlik. Kasutatud pilte vĂ”ib soovitud viisil liikuda, ĂŒmber nimetada ja kopeerida. Siiski tuleb olla ÀÀrmiselt ettevaatlik ja mitte muuta nende sisu. Ăhe bitti muutmine rikub hash'i ja hĂ€irib teabe taastamist.
Olgu, pĂ€rast kompileerimist saime tĂ€itmise faili f5ar. Raamatukogu suurust saab analĂŒĂŒsida selle kasutusvĂ”imaluste arvutamiseks lipu abil -a: ./f5ar -a [otsingukaust] [Perl-ĂŒhilduv regulaaravaldis]. Pakkimine toimub kĂ€suga ./f5ar -p [otsingukaust] [Perl-ĂŒhilduv regulaaravaldis] [pakkitav fail] [arhiivi nimi], ja lahtipakkimine toimub ./f5ar -u [arhiivi fail] [taasloodud faili nimi].
Demonstratsioon
Meetodi efektiivsuse nĂ€itamiseks laadisin ĂŒles 225 tĂ€iesti tasuta koerapilti teenusest . Iga neist omab veidi kĂ”rgemat kvaliteeti kui tavalised kasutajafotod, kuid sellegipoolest. Iga ĂŒks neist on ĂŒmberkodeeritud libjpeg'i abil, et vĂ€hendada kodeerimise teegi mĂ”ju ĂŒldisele suurusele. Halvima tihendatud andmete nĂ€itamiseks genereeriti juhuslik 36-megabaidine (veidi rohkem kui 5% kogusuurusest) ĂŒhtlaselt jaotatud fail.
Testimisprotsess 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
Reading 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 huvilistele

Nagu nÀha, oleme alates algsetest 633 + 36 == 669 megabytist kettal jÔudnud meeldivamate 563-ni, mis annab meile kokkusurumise teguri ~1,188. Selline radikaalne erinevus on seletatav ÀÀrmiselt vÀikeste kadudega, mis on sarnased klassikaliste JPEG-failide optimeerimiseks kasutatavate meetodite (nt tinyjpg) kaudu saadud tulemustele. Loomulikult ei kaota steganograafilise kokkusurumise puhul teave lihtsalt "kaotatakse", vaid seda kasutatakse teiste andmete kodeerimiseks. Veelgi enam, "optimeeritud" koefitsientide arv, kasutades F5-d, on tunduvalt vÀiksem kui traditsioonilise optimeerimise puhul.
Olenemata modifikatsioonidest ei ole need silmale absoluutselt nÀhtavad. Allolevas spoileris vÔib lugeja hinnata erinevust nii pilguga kui ka muudetud komponendi vÀÀrtuste originaalsetest lahutades (mida vÀhem on vÀrv tÔlgendatud, seda vÀiksem on erinevus):
Lingid piltidele, mis ei mahtunud habrastorage'i
Originaal â
Muudetud â
Erinevus â
KokkuvÔtte asemel
Loodan, et suutsin veenda lugejat, et sellised meetodid on vĂ”imalikud ja nendele on koht olemas. Kuid kĂ”vaketta ostmine vĂ”i lisakanali hankimine (vĂ”rguedastuseks) vĂ”ib tunduda palju lihtsam lahendus kui sellise meetodi kasutamine. Ăhelt poolt on see tĂ”si, et ulatuslik areng on tihti lihtsam ja usaldusvÀÀrsem. Teiselt poolt ei tohiks unustada ka intensiivseid meetodeid. LĂ”ppude lĂ”puks ei ole mingit garantiid, et homme on vĂ”imalik minna poodi ja osta endale jĂ€rgmine tuhande terabaiti kĂ”vaketas, kuid kodus juba olemasolevate kasutamine on alati vĂ”imalik.
->
Allikas: habr.com
