Steganografio per dosieroj: kaŝi datumojn rekte en sektoroj

Mallonga antaŭparolo

Steganografio, se iu ne memoras, kaŝas informojn en iuj ujoj. Ekzemple, en bildoj (diskutitaj tie и tie). Vi ankaŭ povas kaŝi datumojn en servotabeloj de la dosiersistemo (pri tio estis skribita tie), kaj eĉ en TCP-protokola servopakoj. Bedaŭrinde, ĉiuj ĉi tiuj metodoj havas unu malavantaĝon: por nerimarkeble "enigi" informojn en ujon, vi bezonas ruzajn algoritmojn, kiuj konsideras la proprecojn de la interna strukturo de la ujo. Kaj problemoj aperas kun la rezisto de la ujo al manipulado: ekzemple, se vi iomete redaktas la bildon, kaŝitaj informoj perdiĝas.

Ĉu eblas iel fari sen ruzaj algoritmoj kaj subtilaj manipuladoj kun datumoj, kaj ankoraŭ certigi la funkciecon de la ujo kaj akcepteblan nivelon de sekureco de kaŝitaj datumoj? Rigardante antaŭen, mi diros - jes, vi povas! Mi eĉ proponos utilon.

Sangaj detaloj de la metodo

La baza ideo estas tiel simpla kiel bato al la frunto: estas areoj sur la disko, al kiuj la operaciumo neniam skribas (aŭ skribas en maloftaj kazoj). Por eviti la bezonon serĉi ĉi tiujn areojn per ruzaj algoritmoj, ni uzos redundon - tio estas, ni duobligos niajn kaŝitajn informojn multajn, multajn fojojn tra ĉiuj sektoroj de la disko. Tiam, tuj aldone al ĉi tiu tuta grandiozeco, vi povas krei la necesajn sekciojn, formi dosiersistemojn, skribi dosierojn kaj instali OS-ojn - tute egale, parto de la sekretaj datumoj estos konservita kaj povas esti retrovita, kaj ripeta duobligo helpos nin. kunmeti la originalan tuton el la pecoj.

La avantaĝo de ĉi tiu metodo estas evidenta: ni ne dependas de la dosierformato, aŭ eĉ de la tipo de dosiersistemo uzata.

La malavantaĝoj ankaŭ estas, mi opinias, evidentaj:

  • Sekretaj datumoj nur povas esti ŝanĝitaj per komplete reverkado de la tuta disko, sekvita per rekreado de la enhavo videbla por la uzanto. Tamen, vi ne povas uzi programaron kiu rekreas la diskon de bildo: ĝi ankaŭ rekreos la antaŭajn sekretajn datumojn.
  • Ju pli granda estas la volumo de sekretaj datumoj, des pli granda estas la probableco perdi iujn informojn.
  • Reakiro de datumoj de disko povas preni longan tempon. De kelkaj minutoj ĝis pluraj tagoj (modernaj diskoj estas grandaj).

Nun ni transiru al specifaĵoj.

Estas klare, ke se vi simple ŝmiras sekretajn datumojn tra la tuta disko, ĝi nur estos kaŝita de la nuda okulo. Se vi ekipas vian rigardon per, ekzemple, diskredaktilo, la datumoj aperos en sia tuta gloro. Tial, estus bona ideo ĉifri la datumojn por ke ĝi ne aperu. Ni ĉifris simple, sed bonguste: uzante la algoritmon aes256-cbc. Ni petos de la uzanto la ĉifradan ŝlosilon kaj lasos lin elpensi bonan pasvorton.

La sekva demando estas kiel ni povas distingi "bonajn" datumojn de malbonaj datumoj. Ĉi tie kontrolsumo helpos nin, sed ne simpla, sed SHA1. Kaj kio? Ĝi estas sufiĉe bona por git, do ankaŭ konvenos al ni. Decidite: ni provizas ĉiun konservitan informon per ĉeksumo, kaj se post malĉifrado ĝi kongruas, tio signifas, ke la malĉifrado sukcesis.

Vi ankaŭ bezonos la fragmentan nombron kaj la totalan longon de la sekretaj datumoj. La fragmenta nombro estas konservi trakon de kiuj pecoj ni jam deĉifris kaj kiuj restas. La tuta longeco estos utila al ni dum la prilaborado de la lasta fragmento, por ne skribi nenecesajn datumojn (tio estas, kompletigo). Nu, ĉar ni ankoraŭ havas kaplinion, ni aldonos tie la nomon de la sekreta dosiero. Ĝi estos utila post deĉifrado, por ne diveni kiel malfermi ĝin.

Provante la metodon praktike

Por kontroli, ni prenu la plej oftan rimedon - flash drive. Mi trovis malnovan kun 1 GB-kapacito, kiu sufiĉe taŭgas por eksperimentoj. Se vi, kiel mi, elpensis la ideon ne ĝeni fizikajn rimedojn, sed testi ĝin sur dosiero - diska bildo, tiam mi tuj diros: ĝi ne funkcios. Dum formatado de tia "disko", Linukso kreas la dosieron denove, kaj ĉiuj neuzataj sektoroj estos plenigitaj per nuloj.

Kiel maŝino kun Linukso, bedaŭrinde, mi devis uzi veterstacion sur la Raspberry Pi 3 kuŝanta sur la balkono.Ne estas multe da memoro tie, do ni ne kaŝos grandajn dosierojn. Ni limigas nin al maksimuma grandeco de 10 megabajtoj. Ankaŭ ne utilas kaŝi dosierojn kiuj estas tro malgrandaj: la ilo skribas datumojn al disko en 4 KB-grupoj. Sekve, ĉi-sube ni limigos nin al 3 kb-dosiero - ĝi taŭgas en unu tia areto.

Ni mokos la flash drive en etapoj, kontrolante post ĉiu etapo ĉu la kaŝitaj informoj estas legeblaj:

  1. Rapida formatado en FAT16-formato kun amasgrandeco de 16 KB. Jen kion Vindozo 7 proponas fari kun flash drive kiu ne havas dosiersistemon.
  2. Plenigi la flash drive per ĉiaj rubaĵoj je 50%.
  3. Plenigi la flash drive per ĉiaj rubaĵoj je 100%.
  4. "Longa" formatado en formato FAT16 (anstataŭigante ĉion).

La unuaj du provoj, kiel atendite, finiĝis en kompleta venko: la utileco povis sukcese eltiri 10 megabajtojn da sekretaj datumoj de la poŝmemoro. Sed post kiam la poŝmemoro pleniĝis al kapablo kun dosieroj, malsukceso okazis:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Kiel vi povas vidi, nur 158 aretoj estis sukcese malĉifritaj (632 kilobajtoj da krudaj datumoj, kio donas 636424 10 bajtojn da utila ŝarĝo). Estas klare, ke ne estas maniero akiri 1 megabajtojn ĉi tie, kaj tamen inter ĉi tiuj aretoj estas klare duplikatoj. Vi eĉ ne povas reakiri 3 megabajton tiamaniere. Sed ni povas garantii, ke ni reakiros 120 kilobajtojn da sekretaj datumoj de flash drive eĉ post kiam ĝi estos formatita kaj skribita laŭ kapablo. Tamen eksperimentoj montras, ke estas tute eble ĉerpi dosieron longan de XNUMX kilobajtoj el tia poŝmemoro.

La lasta provo, bedaŭrinde, montris, ke la tuta poŝmemoro estis anstataŭita:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Eĉ ne unu areto pluvivis... Malĝoja, sed ne tragika! Antaŭ formatado, ni provu krei subdiskon sur la flash drive, kaj jam en ĝi dosiersistemon. Cetere, ĝi venis el la fabriko kun ĝuste ĉi tiu formatado, do ni faras nenion suspektindan.
Estas sufiĉe atendite, ke la disponebla spaco sur la flash drive iomete malpliiĝis.

Ankaŭ estas sufiĉe atendite, ke 10 megabajtoj ne povus esti kaŝitaj sur tute plena disko. Sed nun la nombro da sukcese deĉifritaj aretoj pli ol duobliĝis!

Total clusters read: 250752, decrypted: 405

Bedaŭrinde, estas neeble kunmeti megabajton el pecoj, sed ducent kilobajtoj estas facilaj.

Nu, la novaĵo pri la lasta, 4-a kontrolo, ĉi-foje estas ĝoja: tute formatado de tia poŝmemoro ne kaŭzis la detruon de ĉiuj informoj! 120 kilobajtoj da sekretaj datumoj konvenas perfekte en neuzatan spacon.

Testa resuma tablo:

Steganografio per dosieroj: kaŝi datumojn rekte en sektoroj

Iom da teoriado: pri libera spaco kaj neuzataj sektoroj

Se vi iam dividis vian malmolan diskon en sekciojn, vi eble rimarkis, ke ne ĉiam eblas asigni la tutan liberan spacon sur la disko. La unua sekcio ĉiam komenciĝas per iu indentaĵo (kutime 1 megabajto, aŭ 2048 sektoroj). Malantaŭ la lasta sekcio, okazas ankaŭ, ke restas malgranda "vosto" de neuzataj sektoroj. Kaj foje estas interspacoj inter sekcioj, kvankam malofte.

Alivorte, estas sektoroj sur la disko, kiuj ne estas alireblaj dum normala laboro kun la disko, sed datumoj povas esti skribitaj al ĉi tiuj sektoroj! Kaj tio signifas ankaŭ legi ĝin. Alĝustigita pro tio, ke ekzistas ankaŭ diskpartiga tablo kaj ekŝargilo-kodo, kiuj situas en la malplena areo komence de la disko.

Ni iom ripozu el la sekcioj kaj rigardu la diskon el birdorigardo, por tiel diri. Ĉi tie ni havas malplenan subdiskon sur la disko. Ni kreu dosiersistemon en ĝi. Ĉu ni povas diri, ke iuj sektoroj sur la disko restas neforigitaj?

E-e-e - tamburrulo! La respondo preskaŭ ĉiam estos jes! Efektive, en la plej multaj kazoj, krei dosiersistemon signifas skribi nur kelkajn blokojn da servaj informoj al la disko, kaj alie la enhavo de la sekcio ne ŝanĝiĝas.

Kaj ankaŭ - pure empirie - ni povas supozi, ke la dosiersistemo ne povas ĉiam okupi la tutan spacon atribuitan al ĝi ĝis la lasta sektoro. Ekzemple, FAT16-dosiersistemo kun aretgrandeco de 64 kilobajtoj evidente ne povas tute okupi subdiskon kun grandeco ne oblo de 64 kilobajtoj. Ĉe la fino de tia sekcio devos esti "vosto" de pluraj sektoroj, nealirebla por stoki uzantajn datumojn. Tamen, ĉi tiu supozo ne povus esti konfirmita eksperimente.

Do, por maksimumigi la disponeblan spacon por la steganogramo, vi devas uzi dosiersistemon kun pli granda amasgrando. Vi ankaŭ povas krei subdiskon, eĉ se ĉi tio ne estas necesa (ekzemple sur flash drive). Ne necesas krei malplenajn sekciojn aŭ lasi neasignitajn areojn - tio altiros la atenton de interesitaj civitanoj.

Utilo por eksperimentoj

Vi povas tuŝi la fontkodon de la ilo tie

Por konstrui, vi bezonos Qt-version 5.0 aŭ pli altan kaj OpenSSL. Se io ne funkcias, vi eble devos redakti la dosieron steganodisk.pro.

Vi povas ŝanĝi la aretgrandecon de 4 KB al, ekzemple, 512 bajtoj (en secretfile.h). Samtempe, la kosto de serva informo pliiĝos: la kaplinio kaj kontrolsumo okupas fiksajn 68 bajtojn.

Vi devas ruli la ilon, kompreneble, kun radikaj uzantrajtoj, kaj singarde. Ne estos demanditaj antaŭ ol anstataŭigi la specifitan dosieron aŭ aparaton!

Ĝuu.

fonto: www.habr.com

Aldoni komenton