Ascunderea Unor Mesaje In Fisiere Bitmap Folosind Tehnici Steganografice

LUCRARE DE LICENȚĂ

ASCUNDEREA UNOR MESAJE ÎN FIȘIERE BITMAP FOLOSIND TEHNICI STEGANOGRAFICE

ORADEA

2013

Cuprins

1.INTRODUCERE

Scurt istoric

2. NOȚIUNI TEORETICE GENERALE

2.1. Concepte generale

Limbajul C

3. IMPLEMENTAREA TEMEI PROPUSE: SteganographyApp

4. CONCLUZII

BIBLIOGRAFIE

Introducere

Scurt istoric

Steganografia este știința și arta cu ajutorul căreia se pot scrie mesaje ascunse astfel încât nicio altă persoană, în afara expeditorului și destinatarului, să nu poată măcar suspecta existența acestor mesaje. Cuvântul steganografie provine din limba greacă, din cuvintele steganos care înseamnă “protejat sau voalat” și graphos care s-ar traduce prin “scris”. Impreună, cele două cuvinte semnifică “scriere voalată”. Termenul de steganografie a fost prima dată utilizat de către Johannes Trithemius în “Steganographia”, un tratat despre steganografie și criptografie mascat sub forma unei cărți despre magie, în anul 1499.

Figura 1.1.1: Pagina de titlu a cărții lui Johannes Trithemius [2]

Primele folosiri ale steganografiei datează din anul 440 î.e.n., când sunt menționate de către Herodot două exemple de steganografie în opera sa, “Istorii”. Primul exemplu este cel în care Demeratus trimite un avertisment cu privire la un viitor atac în Grecia, scriind mesajul direct pe suportul din lemn al unei tăblițe cerate, înainte de aplicarea învelișului din ceară de albine. Tăblițele de ceară erau folosite la acea vreme ca suprafețe reutilizabile pentru scris și uneori pentru stenografie. Al doilea exemplu dat de Herodot se referă la tatuarea mesajului pe corpul mesagerului. Aceasta este povestea sclavului lui Histiaeus, pe capul ras al căruia a fost tatuat mesajul secret, care a fost ascuns mai apoi de creșterea părului și expus după ce acesta a fost ras iar. Mesajul secret era tot un avertisment pentru Grecia cu privire la planurile de invazie persane. Bineînțeles că această metodă are dezavantaje evidente, cum ar fi transmiterea întârziată de așteptarea creșterii părului de pe capul sclavului și restricțiile privind numărul și dimensiunea mesajelor ce pot fi codate pe scalpul unei persoane. [1] Totuși, această metodă a mai fost folosită inclusiv în secolul XX de către spionii germani.

Metoda lui Demeratus, un grec la curtea persană, este totuși mai eficientă decât cea care presupune tatuarea scalpului deoarece este mai rapidă. Demeratus a reușit să-și avertizeze compatrioții asupra atacului iminent plănuit de regele Xerxes al Persiei care viza Sparta. Acesta a scris mesajul pe partea de lemn a tăbliței de scris și a acoperit-o cu ceară.

Un număr impresionant de tehnici steganografice au fost inventate sau raportate de către tacticianul Enea. Acesta menționează scrierea de mesaje pe tălpile pantofilor, pe cerceii femeilor, texte scrise pe tăblițe de lemn și apoi văruite în alb, mesaje purtate de porumbei călători. El a propus și realizarea unor mici găuri deasupra sau dedesubtul literelor dintr-un cover text sau modificarea înălțimii liniilor din care sunt alcătuite literele. Termenul cover text se referă la textul în care este ascuns mesajul.

Tehnica ce presupune realizarea unor găuri mici deasupra sau dedesubtul literelor a fost folosită inclusiv până în secolul al XVII-lea, dar a fost perfecționată de către Wilkins. El a folosit cerneală invizibilă cu care a pus mici puncte în loc de mici găuri. Această tehnică perfecționată a fost reutilizată de spionii germani în timpul celor două Războaie Mondiale. O adaptare modernă a acestei tehnici se folosește și azi pentru securitatea documentelor și constă în desenarea unor blocuri de pixeli foarte mici de-a lungul unei pagini pentru a codifica informații ca data, identificatorul de imprimantă și identificatorul de utilizator. [2]

Brewster a sugerat în anul 1857 ascunderea mesagelor secrete în spații nu mai mari decât un punct. Problema imaginilor mici a fost rezolvată în anul 1860 de către un fotograf francez numit Dragon. În timp ce Parisul a fost asediat , pe timpul războiului franco-prus din 1870-1871, messaje pe microfilm au fost trimise cu ajutorul porumbeilor călători. În 1905, în timpul războiului dintre Rusia și Japonia au fost ascunse în nări, urechi și sub unghii mesaje microscopice. Dar ideea lui Brewster a devenit reală abia în timpul Primului Război Mondial, când mesajele spionilor au fost reduse la micropuncte cu ajutorul a câtorva etape de reducție fotografică. Bineînțeles, acestea erau stocate deasupra virgulelor sau punctelor printate.

În ceea ce privește cerneala invizibilă, aceasta a fost folosită pe scară largă. La început, se obținea din substanțe organice cum ar fi laptele sau urina. Odată cu progresul în domeniul chimiei, s-au diversificat și rețetele pentru cerneluri de acest gen. Dar această tehnologie nu a mai fost utilă odată cu apariția reactivilor chimici universali de developare. Prin acest procedeu mesajele scrise cu cerneală invizibilă ieșeau la iveală. Aceste cerneluri sunt folosite pentru a putea diferenția obiectele contrafăcute de cele originale. Cele originale sunt inscripționate cu cerneală care devine vizibilă la lumină ultravioletă.

Alte exemple de tehnici steganografice vin din arthitectură. Încă de la început, artiștii si-au dat seama că picturile sau sculpturile lor arată altfel în funcție de unghiul din care sunt privite. Ei au stabilit niște reguli pentru anamorfoză și perspectivă. Imaginile anamorfice au constituit între secolele XVI-XVII un mijloc ideal de camuflare pentru afirmațiile politice periculoase și pentru ideile eretice. O capodoperă a imaginii anamorfice a fost creată prin anul 1530 de Shö, un gravor din Nürnberg, elev al lui Dürer. Aceasta poartă numele de Vexierbild și dacă este privită din față se poate observa un peisaj ciudat. Dacă este privită dintr-o parte, ea dezvăluie portretele unor regi renumiți.

O altă metodă utilizată în steganografie este reprezentată de acrostih. Probabil cel mai faimos exemplu este Amorosa visione a lui Giovanni Boccaccio, supranumită cel mai mare acrostih din lume. Boccaccio a scris prima dată trei sonete (care conțineau împreună 1500 de litere) și apoi alte poezii astfel încât inițiala terțetelor succesive corespunde exact literelor sonetelor. Alt exemplu celebru de acrostih este Hypnerotomachia Poliphili, publicată în anul 1499. Această carte enigmatică, cu autor anonim dezvăluie dragostea interzisă dintre o femeie și un călugăr: prima literă din cele 38 de capitole formează mesajul "Poliam frater Franciscus Columna peramavit.". [2]

Alte exemple provin din lumea tabelelor matematice. Cei care publicau tabele logaritmice și efemeride astronomice în secolul al XVII-lea și al XVIII-lea obișnuiau să introducă greșit cele mai nesemnificative cifre zecimale. În ziua de azi, cei care vând baze de date și liste de contacte email inserează intrări false pentru a putea identifica dacă vreunul din clienți încearcă să revândă produsul. [2]

Lista exemplelor de steganografie ar mai putea continua, dar exemplele amintite mai sus sunt suficiente pentru a putea forma o imagine de ansamblu asupra acestei științe pe care oamenii o foloseau pentru a ascunde mesaje secrete încă din cele mai vechi timpuri. Se poate observa inventivitatea surprinzătoare a oamenilor care de-a lungul istoriei au încercat să țină departe de ochii cititorilor neavizați tot felul de mesaje sau informații.

În ziua de azi, metodele steganografice au evoluat și ele. Cel mai des sunt folosite fișiere media precum imagini, clipuri video sau fișiere audio drept cover files. Cover files se referă la fișierele în interiorul cărora sunt ascunse mesaje text sau chiar alte fișiere. Acestea au fost utilizate de teroriști pentru a transmite mesaje. Astfel comunicarea lor a avut loc fără să trezească suspiciuni.

Steganografia este o metodă de securitate prin obscuritate. În timp ce în criptografie mesajul criptat se află la vedere, în steganografie existența mesajului este ascunsă. Mesajul devine securizat deoarece nu poate fi citit de cineva care nici măcar nu știe de existența acestuia. Această abordare este interesantă și utilă deoarece nu trezește suspiciuni. Un text criptat va atrage atenția oamenilor. Aceștia vor deveni curioși și vor încerca să-l descifreze. În unele cazuri chiar reușesc să descopere mesajul ascuns, alteori nu. Însă ei nu vor putea niciodată descifra un mesaj despre care ei nici nu știu că există.

Criptografia și steganografia au același scop, de a securiza mesaje, dar realizează acest lucru în moduri diferite. Steganografia este chiar mai veche decât criptografia. Acest lucru este de înțeles oarecum, viclenia fiind mult mai răspândită și mai utilizată decât inteligența.

NOȚIUNI TEORETICE GENERALE

Concepte generale

Pentru a înțelege mai bine cum anume funcționează steganografia este necesară o privire atentă asupra principiilor steganografiei. În acest scop, se pornește de la modelul clasic de comunicare cu ajutorul steganografiei.

Modelul clasic de comunicare ascunsă a fost propus prima dată de Simmons sub denumirea de problema prizonierilor. Alice și Bob sunt arestați pentru niște infracțiuni și sunt puși în două celule diferite. Ei doresc să facă un plan de evadare din închisoare, dar din păcate toate comunicațiile dintre ei sunt omologate de Wendy, care are rolul de gardian al închisorii. Ea nu le va permite să comunice prin mesaje criptate, iar dacă observă cumva orice comunicare suspicioasă, ea îi va plasa pe fiecare în detenție solitară și va suprima astfel schimbul de mesaje. Deci ambele părți sunt nevoite să comunice într-un mod invizibil, pentru a nu-i trezi suspiciuni lui Wendy. Așa că cei doi prizonieri trebuie să creeze un canal de comunicație subliminal. O metodă practică în acest sens ar fi ascunderea informației semnificative într-un mesaj inofensiv. De exemplu, Bob ar putea desena o vacă albastră pe o pajiște verde pe care l-ar putea trimite mai apoi lui Alice. Wendy nu ar avea idee că prin intermediul culorilor din imagine sunt transmise informații. [2]

În acest model, se presupune că Alice și Bob au acces la sisteme informatice în celulele lor și pot să își trimită unul altuia mesaje sub diferite forme. Ei iși pot trimite fișiere text, imagini sau fișiere audio. Cu alte cuvinte,fișiere multimedia.

Figura 2.1: Problema prizonierilor sub formă ilustrată [2]

Dar cum nicio situație nu este perfectă, există unele probleme care ar putea apărea în realizarea corectă a comunicării dintre Bob și Alice, iar acest lucru ar putea impiedica încercarea de evadare a celor doi prizonieri.

O problemă care ar putea apărea este alterarea imaginii. Wendy ar putea să schimbe culoarea vacii din albastru în roșu. În urma acestei modificări, informația conținută ar fi distrusă. În acest caz, Wendy poate fi numită gardian activ.

Bineînțeles, la fel cum se întâmplă și în viață, situația se poate înrăutăți și mai mult de atât. Wendy ar putea să acționeze într-un mod rău întenționat. Ea ar putea construi alte mesaje pe care le-ar putea trimite unuia din cei doi prizonieri prin canalul subliminal pretinzând că e celălalt prizonier.

Modelul acesta este general aplicabil multor situații în care are loc steganografia. Alice și Bob reprezintă cele două părți de comunicare ce doresc să facă schimb de mesaje secrete într-un mod invizibil. Wendy reprezintă spărgătorul de coduri care este capabil să citească și probabil să modifice mesajele secrete pe care cei doi parteneri de comunicare.

Acest model este reprezentat sub formă ilustrată în figura 2.1. Am ales să atașez și forma ilustrată a modelului pentru a ușura înțelegerea acestuia. De multe ori doar textul simplu nu este suficient de expresiv.

Două persoane pot comunica în mod ascuns prin schimbul de mesaje neclasificate care conțin informații confidențiale. Însă ambele părți trebuie să ia în considerare prezența unui atacator pasiv, activ sau în cel mai rău caz, rău intenționat. [2]

În comparație cu criptografia, al cărei scop este ascunderea conținutului unui mesaj, steganon considerare prezența unui atacator pasiv, activ sau în cel mai rău caz, rău intenționat. [2]

În comparație cu criptografia, al cărei scop este ascunderea conținutului unui mesaj, steganografia merge puțin mai departe. Steganografia are ca scop ascunderea faptului că mesajul există.

Cele mai multe aplicații ale steganografiei au la bază un principiu general, care este ilustrat în figura 2.2. Alice, care dorește să îi transmită un mesaj secret lui Bob, alege la întâmplare folosind sursa privată aleatoare r un mesaj inofensiv c, numit cover file care poate fi transmis lui Bob fără a trezi suspiciuni. Ea încorporează apoi mesajul secret în c, probabil utilizând o cheie k, numită stego key sau cheie stego. Prin urmare, Alice transformă cover file-ul c într-un stego-object s. Termenul stego-obiect denumește fișierul care rezultă în urma încorporării mesajului secret în cover-file. [2]

Figura 2.2: Descriere schematică a steganografiei [2]

Acest proces trebuie realizat cu foarte mare atenție pentru ca o a treia persoană, care aparent cunoaște doar mesajul inofensiv c să nu poată depista existența mesajului secret conținut în interiorul mesajului c.

Într-un sistem ideal, un cover file nu ar putea fi deosebit de un stego-object, nici de către o persoană, nici de către un computer care caută un model statistic. Teoretic, cover files pot fi reprezentate de orice format de date electronic. Cele mai utilizate sunt imaginile, fișierele text și fișierele audio.

Canalul pe care Alice transmite mesajul pentru Bob este unul nesigur. Ea speră că mesajul încorporat va putea trece fără să fie observat de Wendy. Bob cunoaște metoda de încorporare folosită de Alice, așa că el poate reconstitui mesajul m, având acces și la cheia k folosită în procesul de încorporare. Procesul de extracție a mesajului secret ar trebui să poată avea loc fără cover file-ul original.

O a treia persoană care privește comunicarea nu ar trebui să fie în stare să diferențieze dacă un expeditor este activ în sensul că el transmite mesaje sau sau doar cover files care nu conțin nicio informație ascunsă. Mai formal exprimat, dacă un observator are acces la setul de cover files {c1, . . . , cn} transmise între cele două părți ale comunicării, el ar trebui să nu poată distinge în care din acele cover files se ascunde un mesaj secret. Astfel, securitatea comunicării invizibile constă în principal în incapacitatea de a distinge cover files de stego-objects. [2]

În practică, totuși nu așa de simplu. Nu toate datele pot fi folosite ca acoperire pentru comunicarea secretă. Modificările utilizate în procesul de încorporare al mesajului secret nu ar trebui să fie vizibile pentru o altă persoană care nu este implicată în procesul de comunicare. Din acest motiv avem nevoie de cover files care să conțină suficiente date redundante care să poată fi înlocuite cu informații secrete.

De exemplu, din cauza unor erori de măsurare, orice date care sunt rezultatul unui process de scanare fizică vor conține o componentă stocastică numită noise (zgomot). Astfel de obiecte aleatoare se pot folosi pentru a transmite informații secrete. De fapt, se pare că datele care conțin noise au cele mai potrivite proprietăți pentru cele mai multe aplicații steganografice. [2]

Un cover file nu ar trebui niciodată folosit de două ori. Un atacator care are acces la două cover files poate detecta și reconstitui mesajul ascuns. Pentru a evita orice refolosire accidentală a unui cover file, este recomandabil ca acesta să fie distrus de către destinatat și expeditor după ce mesajul secret a fost extras și folosit de aceștia.

În literatura de specialitate sunt prezente trei tipuri de protocoale steganografice:

– steganografie pură

– steganografie cu cheie secretă

– steganografie cu cheie publică.

Steganografia cu cheie publică se bazează pe principiile criptografiei cu cheie publică.

În continuare vor fi prezentate cele trei tipuri de protocoale steganografice începând cu primul din lista de mai sus, steganografia pură.

Steganografia pură este un sistem steganografic ce nu necesită un schimb prealabil de informații secrete, de exemplu un stego key. În mod formal, procesul de încorporare poate fi descris ca o mapare E : C×M → C, unde C este un set de cover files posibile, iar M un set de mesaje posibile. Procesul de extracție constă într-o mapare D : C → M, extrăgând mesajul secret din cover file. În mod evident, este necesar ca |C| ≥ |M|. Atât expeditorul cât și destinatarul trebuie să aibă acces la algoritmul de încorporare și la algoritmul de extracție, dar acești algoritmi nu ar trebui să fie publici. [2]

Definiția steganografiei pure este următoarea: Cvadruplul σ = <C, M, D, E>, unde C este un set de cover files posibile, M este un set de mesaje secrete cu |C| ≥ |M|, E : C×M → C, funcția de încorporare și D : C → M, funcția de extracție, cu proprietatea că D(E(c,m)) = m pentru toți m ∈ M și c ∈ C se numește un sistem steganografic pur. [2]

În cele mai practice sisteme steganografice setul C, care conține cover files, este ales în așa fel încât constă în fișiere semnificative, cu cele mai inofensive mesaje. Exemple în acest sens constituie imaginile digitale semnificative sau textele produse utilizând tabele Trithemius. În acest fel, expeditorul și destinatarul vor putea comunica fără să ridice suspiciuni.

Procesul de încorporare este definit în așa fel încât cover file-ul și stego-object-ul corespunzător să fie perceptiv similare. Formal, similitudinea perceptuală poate fi definită printr-o funcție de similitudine.

Definiția funcției de similitudine este următoarea: Fie C o mulțime nevidă. O funcție sim: C → (- ∞, 1] se numește funcție de similitudine pe C, dacă pentru x, y ∈ C sim(x,y)= 1 x = y, pentru x ≠ y, sim(x, y) < 1. [2]

Dacă este vorba despre sunete digitale sau imagini digitale, putem folosi ca similitudine corespondența dintre două semnale. Prin urmare, sistemele steganografice care sunt cele mai practice încearcă să îndeplinească condiția sim(c, E(c, m)) ≈ 1 pentru oricare m ∈ M și c ∈ C [2].

Cele mai sigure cover files sunt cele private ale expeditorului. Ar fi bine ca atacatorul să nu aibă acces la ele. Pentru aceasta, există metode bune de a genera cover files de acest gen. Expeditorul își poate crea cover files cu ajutorul scanării sau al inregistrării unor sunete. Sau pur și simplu poate realiza niște poze cu aparatul de fotografiat digital propriu pe care le va folosi mai apoi drept cover files.

Pentru fiecare process de comunicare, expeditorul alege aleator un cover file din cele pe care le deține. De asemenea, dacă expeditorul stochează cover files într-o bază de date, îl poate alege pe cel pe care procesul de încorporare îl va modifica cel mai puțin.

În cazul în care cover file este rezultatul unei tehnici de scanare, originalul poate fi digitalizat de oricate ori se dorește. Din cauza existenței noise-ului în hardware, fiecare proces de digitalizare va produce un cover file puțin diferit. Expeditorul poate selecta apoi un cover file pe care îl consideră cel mai potrivit pentru comunicare. Această tehnică apare sub denumirea de metoda selecției de invizibilitate.

Unele metode de steganografie combină totuși steganografia cu criptografia tradițională. Aceasta presupune ca expeditorul criptează mesajul secret înainte de a-l încorpora într-un cover file. Evident că o astfel de combinație sporește securitatea per ansamblu a comunicării, deoarece atacatorului îi este mai greu să detecteze un text criptat într-un cover file. Acest lucru se întâmplă din cauza faptului că și textul criptat are un aspect destul de aleatoriu. Dar sistemele steganografice puternice nu au nevoie de criptarea mesajului secret înainte de a fi încorporat.

În steganografia pură nu avem nevoie de nicio altă informație în afara algoritmilor de încorporare și de extracție. Totuși, asta înseamnă că securitatea sistemului depinde în totalitate de secretizarea sa. Acest lucru nu este foarte sigur în practică însă.

Prin urmare, vom presupune că Wendy cunoaște algoritmul pe care Alice și Bob îl folosesc pentru a-si transmite mesaje. Deci, Wendy este capabilă să extragă înformația secretă din fiecare cover file care este trimis de către cei doi prizonieri. Securitatea unui sistem steganografic ar trebui să se bazeze astfel pe unele informații secrete schimbate de Bob și Alice. Acestea vor constitui stego key-ul. Pentru a extrage informația secretă din cover file va fi astfel nevoie de acest stego key. Fără stego key extracția informației nu este posibilă.

Un sistem steganografic cu cheie secretă este similar cu un cifru simetric: expeditorul alege un cover file c în care încorporează mesajul secret folosind cheia secretă k. Dacă destinatarul cunoaște cheia secretă folosită la încorporare, el poate inversa procesul și extrage astfel mesajul secret. Cineva care nu cunoaște cheia secretă nu ar trebui să poată identifica vreo dovadă că există informație codată. Din nou, cover file-ul c și stego-object-ul pot fi perceptive similare.

Steganografia cu cheie secretă se definește astfel: Cvintuplul σ = <C, M, K, DK, EK>, unde C este un set de cover files posibile, M este un set de mesaje secrete cu |C| ≥ |M|, K este un set de chei secrete, EK : C×M×K → C and DK : C×K → M cu proprietatea că DK(EK(c, m, k), k) = m pentru oricare m ∈ M, c ∈ C si k ∈ K, se numește sistem steganografic cu cheie secretă. [2].

Totuși, steganografia cu cheie secretă impune schimbul unei chei, cu toate că transmiterea de informații secrete suplimentare subminează intenția inițială de comunicare invizibilă. Deci, ca în criptografie, vom presupune că toate părțile de comunicare sunt în măsură să facă schimb de chei prin intermediul unui canal securizat. Alice și Bob ar putea conveni asupra unui stego-key înainte să fie arestați. Cu toate acestea, prin utilizarea unor trăsături caracteristice ale cover file-ului și a unei funcții hash H securizate este posibil să se calculeze o cheie folosită pentru comunicarea secretă direct din cover file: k = H(caracteristică). Dacă procesul de încorporare nu schimbă caracteristica, destinatarul este capabil să recalculeze cheia. Evident, o astfel de caracteristică trebuie să fie extrem de dependentă de cover file pentru a avea un nivel înalt de securitate. În cazul în care cover file-ul este o imagine digitală, s-ar putea considera toți cei mai semnificativi biți ai valorilor de culoare drept caracteristică. Această metodă ar putea fi folosită pentru a calcula o cheie secretă de sesiune dintr-o cheie generală k′ valabilă pentru o perioadă mai lungă de timp, dacă funcția hash depinde de k′. [2]

Unii dintre algoritmi necesită în plus fată de ceilalti și cover file-ul original sau unele informații care nu derivă din stego-object pentru etapa de decodare. Însă acest fel de sisteme sunt de interes limitat, deoarece utilizarea lor necesită transmiterea cover file-ului original. Aceasta este o problemă strâns legată de schimbul de chei secrete din criptografia tradițională. Acești algoritmi pot fi considerați un caz special de sisteme steganografice cu cheie secretă în care K = C or K = C×K′, unde K′ reprezintă un set adițional de chei secrete.

Steganografia cu cheie publică se aseamănă cu criptografia cu cheie publică. Aceasta nu se bazează pe schimbul unei chei secrete. Sistemele steganografice cu cheie publică necesită astfel două chei, o cheie publică și una privată. Cheia publică este stocată de obicei într-o bază de date publică. Ea este folosită în procesul de încorporare al mesajului secret în cover file. Cheia secretă se folosește pentru reconstituirea mesajului secret ce a fost încorporat în cover file.

Pentru a construi un sistem steganografic cu cheie publică se poate utiliza un criptosistem cu chei publice. Vom presupune că Bob și Alice pot face schimb de chei publice al unui algoritm de criptare cu chei publice înainte de arestare. Această ipoteză este una destul de rezonabilă. Steganografia cu cheie publică folosește faptul că funcția de decodare D într-un sistem steganografic se poate aplica oricărui cover file c, indiferent dacă el conține sau nu un mesaj secret, funcția D este o funcție pe întregul set (sau mulțime) C. În cazul în care este un cover file în care nu se află ascuns niciun mesaj secret, rezultatul va fi un element aleator din M, care se va numi dezordine naturală sau natural randomness al cover file-ului. [2]

Dacă se presupune că această dezordine naturală este imposibil de distins statistic de un text cifrat care este produs de un criptosistem cu chei publice, un sistem steganografic sigur poate fi construit prin încorporarea de text criptat, mai degrabă decât prin încorporarea de mesaje secrete necriptate.

Un protocol care permite steganografia cu chei publice a fost propus de către Anderson și se bazează pe faptul că informația criptată este suficient de aleatorie pentru a ramane ascunsă la vedere.

Așadar, Alice criptează mesajul folosind cheia publică a lui Bob pentru a obține un mesaj care apare foarte aleatoriu și îl incorporează într-un canal cunoscut lui Bob (și prin urmare cunoscut și lui Wendy), înlocuind astfel o parte din dezordinea naturală cu care este acompaniat procesul de comunicare. Se presupune că atât algoritmii de criptare cât și funcțiile de încorporare sunt cunoscute public. Bob, care nu poate decide de dinainte dacă informațiile secrete le va încorpora într-un anume cover file, va bănui sosirea unui mesaj și va încerca să extragă și să decripteze mesajul folosind cheia sa secretă. Dacă există într-adevăr un mesaj încorporat, informația decriptată va fi mesajul lui Alice. [2]

Deoarece se presupune că Wendy cunoaște metoda de încorporare utilizată, ea poate încerca să extragă mesajul secret trimit de Alice lui Bob. Cu toate acestea, dacă metoda de criptare produce text criptat cu aspect aleator, Wendy nu va avea nicio dovadă că textul extras de ea reprezintă mai mult decât niște biți aleatori. Prin urmare, ea nu poate decide dacă informația extrasă are vreo semnificație sau este doar o parte din dezodinea naturală, decât dacă este capabilă să spargă criptosistemul.

Un alt aspect foarte important este că Bob trebuie să bănuiască utilizarea unei tehnici steganografice și încearcă să decodeze fiecare cover file pe care îl primește de la Alice. Bob ar putea chiar să nici nu o cunoască personal pe Alice. Dacă mesajul ascuns nu vizează o anumită persoană, ci un grup de persoane, problema se agravează. Putem lua ca exemplu postarea unui stego-object pe internet, din care un grup de persoane vor încerca să extragă mesajul însă numai una are cheia secretă potrivită. Deși protocolul funcționează și în acest caz, toti posibilii destinatari trebuie să încerce să decodeze fiecare stego-object postat.

Craver a extins acest protocol pentru a simula steganografia pură folosind atât steganografia cu cheie publică, cât și steganografia cu cheie privată. În majoritatea aplicațiilor se preferă steganografia pură deoarece nu necesită niciun stego key care să trebuiască schimbată între cei doi parteneri de comunicare, deși un protocol de steganografie pură nu oferă niciun fel de securitate în cazul în care un atacator cunoaște metoda de încorporare. Prin implementarea unui protocol de steganografie cu cheie publică, Alice și Bob pot face schimb de chei secrete k, pe care le pot folosi mai târziu într-un sistem steganografic cu cheie secretă. Din moment ce niciun stego-key (în afară de cheia de criptare publică) nu trebuie cunoscut de dinainte, ne putem referi la procesul de comunicare ca la steganografie pură, deși acesta nu este conform definiției steganografiei pure. [2]

În acest protocol, Alice prima dată generează o pereche public/privat de chei aleatoare pentru a fi utilizate cu orice criptosistem cu chei publice. Apoi, ea încorporează cheia publică într-un canal cunoscut si vizibil de către Bob. Acest canal este vizibil și de către Wendy. Nici Wendy nici Bob nu pot determina dacă acest canal conține mai mult decât biți aleatori. Cu toate acestea, Bob suspectează că stego-object-ul trimis de Alice conține cheia publică a lui Alice și încearcă să o extragă. El folosește apoi cheia publică obținută pentru a încorpora o cheie k aleatorie împreună cu un scurt mesaj de confirmare, ambele criptate cu cheia publică a lui Alice, într-un cover file pe care îl trimite apoi lui Alice. Din nou, Wendy poate încerca să extragă informația secretă trimisă de Bob, dar va observa probabil doar text criptat cu aspect aleator. Alice bănuiește sosirea unui mesaj de la Bob, extrage informația secretă si decriptează mesajul folosind cheia sa privată. Acum, Alice și Bob impart un stego-key. [2]

Totusi, acest protocol este sensibil la primul pas. El este expus la atacul de tipul omul-din-mijloc sau man-in-the-middle. Dacă Wendy este un atacator activ, ea poate prinde primul stego-object trimis de Alice lui Bob și poate înlocui cheia publică a lui Alice cu cheia ei publică. Bob va cripta cheia secretă aleatoare k folosind cheia publică a lui Wendy în locul cheii publice a lui Alice. Acum Wendy cunoaște cheia secretă k aleasă de Bob și o poate transmite lui Alice. Ea o criptează cu cheia publică a lui Alice, o încorporează într-un cover file și trimite rezultatul lui Alice. Deși Alice recepționează corect cheia secretă k, ea nu este conștientă de faptul că și Wendy are acces la cheia secretă k. [2]

Figura 2.3: Protocolul steganografic al lui Craver sub formă ilustrată [2]

Este ușor de presupus că nici steganografia cu cheie publică, nici steganografia pură nu sunt posibile în prezența unui gardian rău intenționat. Wendy ar fi putut să-l păcălească pe Bob prin începerea unui protocol steganografic cu cheie publică sau a unui protocol steganografic extins în numele lui Alice. Din moment ce Bob nu are cum să verifice validitatea unei chei publice în acest prim pas al protocolului, el nu poate identifica cheia primită de la Alice. Situația aceasta este foarte similară criptografiei cu chei publice, unde este necesară o certificare a unei chei publice. În cazul steganografiei pure, Bob nu are cum să facă diferența între un mesaj primit de la Wendy și un mesaj primit de la Alice.

Un sistem steganografic devine nesigur dacă un atacator este capabil să dovedească existența unui mesaj. Totuși, spargerea unui sistem steganografic constă în trei etape:

Detectarea

Extracția

Dezactivarea informației incorporate.

Cum am mai precizat, steganografia folosește existența unor informații redundante într-un proces de comunicare. Sunetele sau imaginile digitale conțin în mod natural astfel de redundanțe sub forma componentei numită noise. Vom considera că un cover file este reprezentat sub forma unei secvențe de cifre binare sau biți. În cazul unui sunet digital această secvență este secvența de probe în unitatea de timp. Dacă este vorba de o imagine digitală, secvența poate fi obținută vectorizând imaginea, adică prin alinierea în nuanțe de gri sau colorate de la stanga la dreapta și de sus în jos. Vom numi l(c) numărul de elemente din secvență, mesajul secret îl vom nota cu m iar l(m) va reprezenta lungimea în biți a mesajului.

Principiul general care stă la baza celor mai multe metode steganografice este plasarea mesajului în componenta noise a unui semnal. Dacă este posibilă codarea informației în așa fel încât este imposibil de distins între ea și adevăratul noise aleatoriu, un atacator nu are nicio șansă în detectarea comunicării secrete. [2]

Modul cel mai simplu de a ascunde informație într-o secvență de numere binare este prin înlocuirea celui mai putin semnificativ bit sau LSB (least significant bit) al fiecărui element cu un bit din mesajul secret m. În aritmetica cu virgulă mobilă se poate folosi cel mai nesemnificativ bit din mantisă.

În mod normal, dimensiunea mesajului secret este mult mai mică decât numărul de biți disponibili pentru ascunderea mesajului, așa că restul de LSB rămași pot fi lăsați nemodificați. Deoarece modificarea celui mai nesemnificativ bit dintr-un byte înseamnă doar adunarea sau scăderea unei cantități foarte mici, expeditorul presupune că diferența se situează în zona de conținut redundant și că, în general, ar trebui să nu se observe vreo schimbare. Evident că această tehnică nu asigură un nivel ridicat de securitate deoarece un atacator poate pur și simplu să încerce să decodeze cover file-ul, ca și cum ar fi el destinatarul.

Algoritmul modifică proprietățile statistice ale cover file-ului semnificativ, chiar dacă mesajul constă în biți cu adevărat aleatori.

Această tehnică se poate îmbunătăți. Putem folosi doar anumite elemente din cover file, nu chiar pe toate. Acest lucru îl vom realiza într-un mod destul de aleatoriu în conformitate cu o cheie secretă, iar restul de biți vor rămăne neatinși. O selecție de acest gen se poate realiza folosind un generator de pseudonumerele aleatoare. Rezultatele acestui generator vor fi folosite pentru a răspândi secvența de biți în cover file prin determinarea numărului de elemente care sunt lăsate neatinse între două elemente folosite pentru transferul informației. [2]

Ultima metodă poate fi utilizată și pentru cover files de tip stream. Un cover file de acest gen este un fișier în care expeditorul nu are acces la întreaga secvență de numere în procesul de încorporare. Un astfel de exemplu ar putea fi o aplicație care stochează informații secrete în fișiere audio digitate în timp ce acestea sunt înregistrate. Pe de altă parte un cover file se numește cover file cu acces aleatoriu dacă expeditorul are acces la întreaga secvență în timpul procesului de încorporare.

Aura a introdus o schemă flexibilă care se aplică la cover files cu acces aleatoriu, dar în special imaginilor digitale. El a dezvoltat un sistem steganografic cu cheie secretă bazat pe permutări pseudoaleatoare. Datorită construcției sistemului, informația secretă este distribuită pe întreaga acoperire a cover file-ului într-o manieră destul de aleatorie. [2]

Prin urmare, comunicarea cu ajutorul steganografiei este posibilă în această eră a computerelor. Aproape orice mesaj poate deveni un cover file folosit pentru o comunicare secretă. Componenta redundantă a sunetelor sau a imaginilor digitale poate fi modificată. Rezultatul formatat pe care îl obținem cu orice editor de texte poate conține informații secrete. Se poate exploata vulnerabilitatea algoritmilor de semnătură digitală și chiar comunicarea dintre două procese ale unui sistem de operare poate fi folosită pentru schimburi de informații secrete.

Cu alte cuvinte, contextul actual a contribuit mult la dezvoltarea tehnicilor de steganografie și chiar la perfecționarea unor metode steganografice mai vechi. Această artă de a comunica într-un mod care trece neobservat își continuă dezvoltarea în același mod caracteristic, discret și departe de ochii oamenilor obișnuiți.

Limbajul C#

C# este un limbaj de programare multi-paradigmă, care cuprinde disciplinele de programare imperativă, declarativă, funcțională, procedurală, generică, orientată pe obiecte și orientată pe componente. Acesta a fost dezvoltat de Microsoft în cadrul inițiativei sale .NET. Ulterior a fost aprobat ca un standard de ECMA (ECMA-334) și ISO (ISO / IEC 23270:2006). [3]

Limbajul C# este unul din limbajele de programare conceput pentru Common Language Infrastructure. A fost destinat să fie un limbaj de programare simplu, modern, orientat-obiect. Echipa care a dezvoltat acest limbaj a fost condusă de către Anders Hejlsberg. Versiunea cea mai recentă a limbajului este C# 5.0 și a fost lansată pe data de 15 August 2012.

Numele C# a fost inspirat de notația muzicală în care un # indică faptul că nota muzicală scrisă ar fi mai mare cu un semiton. Această denumire este similară cu cea a limbajului C++, unde ++ indică faptul că varianta ar trebui să fie incrementată cu 1.

C# are 15 tipuri de date predefinite și 77 de cuvinte cheie. Cuvintele cheie sunt niște cuvinte rezervate care nu se pot folosi ca nume de variabile decât dacă se inserează în fața lor caracterul @.

Figura 2.2.1: Tabelul cuvintelor cheie ale limbajului C# [5]

Figura 2.2.2: Tabelul tipurilor de date predefinite ale limbajului C# [6]

Principiile de bază din programarea orientată pe obiecte, adică încapsulare, moștenire și polimorfism sunt elemente fundamentale în programarea în limbajul C#. Limbajul moștenește în mare principiile de bază și sintaxa limbajului C++. Au fost adăugate noi tipuri de date, altele au fost diversificate sau modificate. S-au introdus funcționalități noi cum ar fi delegații și interfețele iar pointerii către alte funcții și moștenirea multiplă au fost elimitate. S-a păstrat accesul direct la memorie utilizând pointeri, dar în acest caz se recomandă multă atenție în folosirea lor.

Pentru a putea programa în C# avem nevoie, evident, de un mediu în care vom dezvolta aplicațiile. În general, se folosește Visual Studio de la Microsoft. Acesta există și în variante free care pot fi descărcate de pe site-ul Microsoft. Bineînțeles că există și variante mai avansate de Visual Studio, iar acestea pot fi cumpărate.

Un instrument foarte util din Visual Studio este IntelliSense sau completarea codului în mod automat. IntelliSense crește productivitatea în ceea ce privește scrierea efectivă a codului de către programator. Când se tastează un cuvânt ce este recunoscut de editorul de cod și este urmat de “.”, C# afișează o listă a tuturor membrilor care sunt asociați cu namespace-ul respectiv sau cu clasa respectivă. Astfel se poate găsi mult mai ușor membrul căutat doar căutandu-l în acea listă fără a cunoaște toate numele membrilor respectivului obiect.

Dacă dorim să inchidem lista de membri deschisă de IntelliSense se apasă tasta Esc. Când dorim să redeschidem lista generată de IntelliSense o putem face cu ajutorul combinației de taste Ctrl + Space Bar.

În figura 2.2.2. de mai jos, se poate observa o listă generată de IntelliSense deschisă cu un membru al listei selectat:

Figura 2.2.2: IntelliSense în Visual Studio 2012 Premium

După cum se poate observa mai sus, membrii din listă au icoane diferite în funcție de tipul lor.În figura 2.2.3. avem un tabel cu icoanele din IntelliSense și semnificația lor:

Figura 2.2.3: Tabel cu icoanele din IntelliSense și semnificațiile lor [7]

Ca și limbajul C++ cu care se înrudește, limbajul C# are un alfabet format din litere mari și mici ale alfabetului englez, cifre și alte semne. Vocabularul limbajului este format din acele „simboluri” cu semnificații lexicale în scrierea programelor: cuvinte (nume), expresii, separatori, delimitatori și comentarii. [4]

În limbajul C# avem și posibilitatea de a crea interfețe. Acestea sunt componente ale unei aplicații care prin intermediul membrilor săi declară un comportament unitar ce poate fi aplicat mai multor clase dar care nu se poate defini prin ierarhia de clase din aplicație. Ele sunt asemănătoare cu clasele dar permit folosirea polimorfismului într-un mod mai extins.

Practic, într-o interfață nu se implementează nicio metodă, ci doar este specificată în interfață. Implementarea metodei se va afla într-o alta clasă din respectiva aplicației.

În C# avem posibilitatea de tratare a erorilor prin folosirea blocurilor try și catch. Partea de program care ar putea genera excepții se va pune într-un bloc try, iar cea care specifică tratarea lor va fi pusă într-un bloc catch. În cazul în care este generată o excepție în blocul try, Runtime va întrerupe execuția și va căuta un bloc catch apropiat care să poată trata acea eroare. [4]

IMPLEMENTAREA TEMEI PROPUSE: SteganographyApp

SteganographyApp este o aplicație realizată cu scopul de a face posibilă comunicarea prin mesaje între două persoane fără a se cunoaște existența acestei comunicări de către orice altă persoană în afara expeditorului și destinatarului. Pentru ca acest lucru să fie posibil se folosesc tehnici steganografice.

Aplicația a fost programată în limbajul C# în mediul de programare Visual Studio 2012 Premium folosind principiile programării orientate pe obiecte.

SteganographyApp este o aplicație de tipul Windows Form Application. Aceasta are un design grafic personalizat. Conceptul de design a fost modelat cu ajutorul Adobe Photoshop CS6.

Aplicația folosește drept cover files fișiere de tipul Bitmap. În conținutul redundant al acestor fișiere Bitmap, cu ajutorul operațiilor pe biți se stochează mesaje text sau fișiere text. În urma stocării mesajului text în fișierul Bitmap ales drept cover file rezultă un alt fișier de tip Bitmap care arată exact la fel ca cel original. Acesta este stego-object-ul rezultat și utilizatorul are posibilitatea să-l salveze sub orice nume dorește.

Formularul de început al aplicației conține două butoane principale, Encode și Decode.

Fiecare din aceste două butoane conține un link la formularul corespunzător secțiunii specificate pe buton.

Pentru un efect vizual mai interesant, în momentul în care cursorul ajunge pe unul din butoane, textul capătă un efect strălucitor care îl scoate în evidență. Acest efect este obținut prin adăugarea unui eveniment care să se manifeste în momentul în care utilizatorul ajunge să pună cursorul oriunde pe suprafața butonului respectiv. După ce cursorul iese de pe suprafața butonului, textul iși pierde acest efect de strălucire și ajunge la forma sa inițială.

Figura 3.1: Formularul de început al aplicației

Figura 3.2: Formularul de început al aplicației în care un buton conține text cu efect de strălucire

Dacă este apăsat butonul Encode acesta conduce la un alt formular din program, cel pentru încorporarea mesajului în interiorul fișierului Bitmap. În figura 3.3. este ilustrat formularul și controalele conținute de acesta:

Figura 3.3: Formularul de încorporare a mesajului într-un fișier Bitmap

După cum se poate observa cu ușurintă avem două groupBox-uri. Cel din stânga este dedicat selectării unui cover file reprezentat de un fișier Bitmap care conține un textBox și un buton de Browse pentru selectarea fișierului în care dorim să ascunde mesajul.El mai conține și un pictureBox în care va fi încărcat fișierul respectiv după ce este ales. Cel din dreapta corespunde mesajului ce urmează să fie ascuns în fișierul Bitmap. Acesta conține un buton Browse și un textBox pentru selectarea fisierului text, în cazul în care dorim să ascundem un fișier text și un richTextBox pentru cazul în care dorim să ascundem un mesaj scris manual. Selectarea provenienței mesajului se face cu ajutorul butoanelor radio. În partea de jos avem trei butoane: Home, Encode și Save encoded file. Butonul de Home este folosit pentru a ajunge la formularul initial, cel de Encode pentru a încorpora mesajul în fișierul Bitmap ales iar cel de Save encoded file pentru a salva fișierul rezultat în urma încorporării mesajului.

Figura 3.4: Formularul de încorporare a mesajului într-un fișier Bitmap în varianta completată

Dacă alegem să mergem pe ramura butonului Decode, vom ajunge într-un alt formular pe care îl vom utiliza în scopul extragerii mesajului ascuns într-un fișier Bitmap. În figura 3.5. putem observa acest formular precum și controalele pe care le conține. Există două groupBox-uri. Cel din stânga conține un buton Browse și un textBox cu ajutorul cărora selectăm fișierul Bitmap din care dorim să extragem mesajul. El mai conține și un pictureBox în care este afișat fișierul selectat. Cel din dreapta conține un richTextBox în care se va afișa mesajul extras din fișierul Bitmap selectat. În partea de jos avem patru butoane: Home, Decode, Decode Heuristic și Save generated file. Butonul de Home ne conduce la formularul de început al aplicației, cel de Decode extrage mesajul din fișierul Bitmap iar cel de Save generated file permite salvarea mesajului extras sub forma unui fișier text cu extensia rtf. Butonul Decode Heuristic conduce spre un alt formular care realizează scanarea unui folder și afișează fișierele ce conțin mesaje secrete.

Figura 3.5: Formularul de extracție a mesajului dintr-un fișier Bitmap

Figura 3.6: Formularul de extracție a mesajului dintr-un fișier Bitmap după decodarea unui mesaj

Formularul DecodeHeuristic a fost conceput pentru a putea selecta un anumit folder și a-l scana. În urma scanării se vor afișa într-un richTextBox fișierele care conțin mesaje ascunse într-o listă.

Figura 3.7: Formularul de scanare al unui folder și afișare a fișierelor ce au mesaje ascunse încorpoare

În acest formular avem iar un groupBox care conține un textBox și un buton Browse pentru selectarea folder-ului pe care dorim să îl scanăm. În richTextBox va apărea lista fișierelor ce conțin mesaje ascunse. În partea de jos avem două butoane: unul de Home și altul de Search for hidden messages. Cel de Home conduce spre fișierul de Decode, deoarece de acolo este accesibil acest formular. Cel de Search hidden messages efectuează scanarea folder-ului și afișează rezultatele. În cazul în care nu avem niciun mesaj ascuns nu se va afișa nimic.

În figura 3.8. este prezentat rezultatul scanării unui folder. Se poate observa că la finalul listei apare textul Scanned finished, ceea ce înseamnă că scanarea este finalizată.

Figura 3.8: Formularul de scanare al unui folder și afișare a fișierelor ce au mesaje ascunse încorpoare după scanare

StartAppForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace testStegano2

{

public partial class StartAppForm : Form

{

public StartAppForm()

{

InitializeComponent();

}

private void Encode_MouseClick(object sender, MouseEventArgs e)

{

}

private void Encode_Click(object sender, EventArgs e)

{

EncodeForm newForm = new EncodeForm();

newForm.Show();

}

private void Decode_MouseEnter(object sender, EventArgs e)

{

Decode.Image = ((System.Drawing.Image)(Properties.Resources.DecodeTp1Glow));

Decode.BackColor = Color.White;

}

private void Encode_MouseEnter(object sender, EventArgs e)

{

Encode.Image = ((System.Drawing.Image)(Properties.Resources.EncodeTpGlow1));

Encode.BackColor = Color.White;

}

private void Encode_MouseLeave(object sender, EventArgs e)

{

Encode.Image = ((System.Drawing.Image)(Properties.Resources.EncodeTp11));

Encode.BackColor = Color.Gray;

}

private void Decode_Click(object sender, EventArgs e)

{

DecodeForm newForm1 = new DecodeForm();

newForm1.Show();

}

private void Decode_MouseLeave(object sender, EventArgs e)

{

Decode.Image = ((System.Drawing.Image)(Properties.Resources.DecodeTp1));

Decode.BackColor = Color.Gray;

}

}

}

EncodeForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace testStegano2

{

public partial class EncodeForm : Form

{

public EncodeForm()

{

InitializeComponent();

}

private void textFileradioButton_CheckedChanged(object sender, EventArgs e)

{

if (textFileradioButton.Checked == true) MessagerichTextBox.ReadOnly = true;

else MessagerichTextBox.ReadOnly = false;

}

private void BrowseCoverbutton_Click(object sender, EventArgs e)

{

if (CoveropenFileDialog.ShowDialog() == DialogResult.OK)

{

CoverFiletextBox.Text = CoveropenFileDialog.FileName;

try

{

pictureBoxPreview.Image = Image.FromFile(CoverFiletextBox.Text);

if (!CoverFiletextBox.Text.ToLower().Contains("bmp"))

{

lblConverted.Visible = true;

pictureBoxConverted.Visible = true;

}

}

catch

{

MessageBox.Show("Please select image file only");

}

}

}

private void BrowseHiddenbutton_Click(object sender, EventArgs e)

{

if (HideopenFileDialog.ShowDialog() == DialogResult.OK)

HiddenFiletextBox.Text = HideopenFileDialog.FileName;

}

private void pictureBoxPreview_Click(object sender, EventArgs e)

{

try

{

Process.Start(CoverFiletextBox.Text);

}

catch

{

}

}

private void Encodebtn_Click(object sender, EventArgs e)

{

String fileSource = "";

if (pictureBoxPreview.Image == null)

{

MessageBox.Show("Please select cover file first");

return;

}

Dictionary<String, String> parameters = new Dictionary<string, string>();

if (ManuallyradioButton.Checked)

{

MessagerichTextBox.SaveFile(Application.StartupPath + "\\message.rtf");

fileSource = "message.rtf";

}

else

{

if (HiddenFiletextBox.Text == "")

{

MessageBox.Show("Please select file to hide");

return;

}

if(File.Exists( Application.StartupPath +"\\"+ Path.GetFileName(HiddenFiletextBox.Text)))

File.Delete( Application.StartupPath +"\\"+ Path.GetFileName(HiddenFiletextBox.Text));

File.Copy(HiddenFiletextBox.Text, Application.StartupPath +"\\"+ Path.GetFileName(HiddenFiletextBox.Text));

fileSource = Path.GetFileName(HiddenFiletextBox.Text);

}

Bitmap bmp = new Bitmap(pictureBoxPreview.Image);

bmp.Save(Application.StartupPath + "\\converted.bmp");

if (File.Exists(Application.StartupPath + "\\encoded.bmp"))

File.Delete(Application.StartupPath + "\\encoded.bmp");

SteganographyClass stegano = new SteganographyClass();

stegano.EncodeFile(fileSource, Application.StartupPath+"\\converted.bmp");

MessageBox.Show("Image was encoded succesfuly ","Steganography");

}

private void EncodeForm_Load(object sender, EventArgs e)

{

}

private void SaveEndodedFile_Click(object sender, EventArgs e)

{

SaveFileDialog saveEncodedfile = new SaveFileDialog();

saveEncodedfile.Filter = "Bitmap|*.bmp";

if (saveEncodedfile.ShowDialog() == System.Windows.Forms.DialogResult.OK)

File.Copy(Application.StartupPath + "\\encoded.bmp",saveEncodedfile.FileName);

}

private void btnhome_Click(object sender, EventArgs e)

{

this.Close();

}

}

}

DecodeForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace testStegano2

{

public partial class DecodeForm : Form

{

public static string decodedFile="";

public DecodeForm()

{

InitializeComponent();

}

private void BrowseCoverbutton_Click(object sender, EventArgs e)

{

if (DecodeopenFileDialog.ShowDialog() == DialogResult.OK)

{

DecodeFiletextBox.Text = DecodeopenFileDialog.FileName;

pictureBoxPreview.Image = Image.FromFile(DecodeFiletextBox.Text);

}

}

private void Decodebtn_Click(object sender, EventArgs e)

{

if (pictureBoxPreview.Image == null)

{

MessageBox.Show("Please select file first");

return;

}

SteganographyClass stegano = new SteganographyClass();

long fileSize=0;

stegano.ExtractFileSizeAndName(DecodeFiletextBox.Text, ref fileSize, ref decodedFile);

stegano.DecodeFile(DecodeFiletextBox.Text, decodedFile);

if (decodedFile == "")

{

MessageBox.Show("Hidden message not found");

}

else

if (decodedFile.Contains(".rtf"))

MessagerichTextBox.LoadFile(decodedFile);

else

{

MessagerichTextBox.Text = File.ReadAllText(decodedFile);

}

}

private void button2_Click(object sender, EventArgs e)

{

SaveFileDialog saveEncodedfile = new SaveFileDialog();

saveEncodedfile.Filter = "rich text format|*.rtf";

if (saveEncodedfile.ShowDialog() == System.Windows.Forms.DialogResult.OK)

MessagerichTextBox.SaveFile(saveEncodedfile.FileName);

}

private void btnHome_Click(object sender, EventArgs e)

{

this.Close();

}

private void btnDecodeHeuristic_Click(object sender, EventArgs e)

{

DecodeHeuristic decodeHeur = new DecodeHeuristic();

decodeHeur.Show();

}

}

}

DecodeHeuristic.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading;

using System.Windows.Forms;

namespace testStegano2

{

public partial class DecodeHeuristic : Form

{

Thread thread = null;

public DecodeHeuristic()

{

InitializeComponent();

}

private void btnSearchHiddenMessages_Click(object sender, EventArgs e)

{

thread = new Thread(new ThreadStart(searchHiddenMessages));

thread.Start();

}

private void searchHiddenMessages()

{

long fileSize=0;

String filename="";

String[] files = Directory.GetFiles(FoldertextBox.Text);

SteganographyClass stegano = new SteganographyClass();

foreach (String file in files)

{

if (file.Contains(".bmp"))

{

stegano.ExtractFileSizeAndName(file, ref fileSize, ref filename);

if (filename != String.Empty)

{

MessagerichTextBox.Text += Environment.NewLine + " file " + file+ " has hidden messages: " + filename + " – " + fileSize+" bytes";

}

}

}

MessagerichTextBox.AppendText("\nScan finished");

}

private void BrowseFolderbutton_Click(object sender, EventArgs e)

{

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

FoldertextBox.Text = folderBrowserDialog1.SelectedPath;

if (FoldertextBox.Text != null)

btnSearchHiddenMessages.Enabled = true;

}

private void btnHome_Click(object sender, EventArgs e)

{

this.Close();

}

}

}

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace testStegano2

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new StartAppForm());

}

}

}

CONCLUZII

O astfel de aplicație poate fi folosită dacă doriți să păstrați unele fișiere pe care nu vreți să le găsească o altă persoană, nici măcar din greșeală. Este ideală dacă se dorește păstrarea unor conversații private sau altor informații de acest gen, pe care nu doriți să știe nimeni că le dețineți. Este o metodă foarte discretă despre care majoritatea oamenilor nici nu au auzit vreodată.

În cazul în care nu aveți un computer personal, ci îl împărțiți cu mai multe persoane este chiar recomandabil să stocați informații sensibile în acest mod. Chiar dacă cineva ar încerca să caute printre fișierele pe care le aveți stocate în acel computer, nu le va găsi pentru că nu va ști unde să caute. Va efectua o căutare normală și în urma acesteia nu va găsi nimic din ce nu ați dori să fie găsit.

De asemenea, dacă doriti să postați fișierul Bitmap undeva pe internet ca să transmiteți un mesaj doar unei persoane anume, cu această aplicație puteți încorpora mesajul secret iar persoana care trebuie să-l primească va extrage mesajul tot folosind aplicația. De aceea expeditorul și destinatarul trebuie să aibă amandoi aplicația pentru a putea comunica pe această cale.

În orice caz, această știință a comunicării invizibile, steganografia, ne poate oferi un nou mod de a privi lucrurile. Ne face să ne întrebăm dacă nu cumva ne scapă foarte multe lucruri din vedere, lucruri la care nu ne-am fi gandit vreodată, sau lucruri de a căror existență nici nu suntem conștienți. Lucruri care stau ascunse în locuri la care nu ne-am fi gândit niciodată.

Aplicația prezentă utilizează doar metoda prin care informațiile se pot ascunde și extrage din fișiere Bitmap, dar există multe alte metode, inclusiv pentru alte tipuri de fișiere, de exemplu Waveform Audio File. Posibilitățile sunt diverse și pot fi folosite în funcție de necesități.

Bibliografie

[1] – http://en.wikipedia.org/wiki/Steganography

[2] – Stefan Katzenbeisser, Fabien A. P. Petitcolas – Information Hiding Techniques for Steganography and Digital Watermarking, Editura Artech House, 2000, Boston

[3] – http://en.wikipedia.org/wiki/C_Sharp_(programming_language)

[4] – http://www.cs.ubbcluj.ro/~vcioban/Bistrita/Manuale/Manual_POO_si_Vizuala.pdf

[5] – http://msdn.microsoft.com/en-us/library/x53a06bb(v=vs.71).aspx

[6] – http://msdn.microsoft.com/en-us/library/aa287910(v=vs.71).aspx

[7] – http://www.geekpedia.com/KB25_A-complete-list-of-what-each-IntelliSense-icon-from-Visual-Studio-.NET-means.html

Bibliografie

[1] – http://en.wikipedia.org/wiki/Steganography

[2] – Stefan Katzenbeisser, Fabien A. P. Petitcolas – Information Hiding Techniques for Steganography and Digital Watermarking, Editura Artech House, 2000, Boston

[3] – http://en.wikipedia.org/wiki/C_Sharp_(programming_language)

[4] – http://www.cs.ubbcluj.ro/~vcioban/Bistrita/Manuale/Manual_POO_si_Vizuala.pdf

[5] – http://msdn.microsoft.com/en-us/library/x53a06bb(v=vs.71).aspx

[6] – http://msdn.microsoft.com/en-us/library/aa287910(v=vs.71).aspx

[7] – http://www.geekpedia.com/KB25_A-complete-list-of-what-each-IntelliSense-icon-from-Visual-Studio-.NET-means.html

Similar Posts