Criptologia (greacă: κρυπτός kryptós = ascuns, -λογία -logia = studiu) este știința scrierilor ascunse (secrete), având drept obiect securizarea… [308782]

Capitolul 1. Introducere

1.1. Noțiuni introductive

Criptologia (greacă: κρυπτός kryptós = ascuns, -λογία -logia = studiu) este știința scrierilor ascunse (secrete), [anonimizat]. [anonimizat]:

criptografia;

criptanaliza.

Cu toate că este o [anonimizat] 1970, criptologia a fost studiată și utilizată încă de pe vremea romanilor de către Împăratul Cezar în scopuri militare[1].

Criptografia (greacă: κρυπτός kryptós = ascuns, γράφειν graphein = scriere) este latura defensivă a criptologiei, având drept obiect de activitate elaborarea (conceperea) sistemelor criptografice și a regulilor folosite în criptologie.

Criptanaliza (greacă: κρυπτός kryptós = ascuns, analýein = a dezlega) este latura ofensivă a criptologiei, având drept obiect de activitate studierea sistemelor criptografice proprii pentru a [anonimizat]-și îndeplinească funcția pentru care au fost concepute. Totodată criptanaliza poate analiza sistemele criptografice ale terțelor părți (prin intermediul criptogramelor realizate cu ele) astfel încât prin spargerea acestora să aibă acces la informații utile ale instituției pe care o deservește.

[anonimizat] (criptare) și descifrare (decriptare). Schema reprezentativă pentru criptologie este:

În acest caz expeditorul vrea să trimită destinatarului un mesaj pe o cale nesigură față de adversar. [anonimizat]. [anonimizat], cu scopul de a cunoaște conținutul mesajului va utiliza metode de criptanaliză. În acest caz atitudinea adversarului poate fi:

pasivă (atacuri pasive): acesta se mulțumește doar să intercepteze și să citească mesajele;

activă (atacuri active): [anonimizat]-se astfel de identitatea expeditorului. [anonimizat] (destinatarul trebuie să fie sigur că mesajul primit este de la expeditor).

Securitatea mesajelor poate cuprinde mai multe servicii:

confidențialitatea – protecția datelor transmise față de atacurile pasive. Există o [anonimizat];

autenticitatea – [anonimizat]: [anonimizat]. Inițial, [anonimizat], pentru ca mai apoi pe parcursul transferurilor de informație acesta să se asigure că transferul nu este interferat de către o a treia entitate care să se legitimeze ca fiind una din celelalte două;

integritatea – presupune consistența (nealterarea) datelor de către o entitate neautorizată;

nerepudiere – previne posibilitatea ca o entitate să refuze să recunoască transmiterea unor informații. În momentul transmiterii unor informații, destinatarul trebuie să poate demonstra că informațiile primite sunt cele trimise de expeditor;

controlul accesului – limitarea și controlul accesului la sistemul de transfer, fie acesta reprezentat de componente fizice sau virtuale. Pentru concretizarea acestui serviciu, fiecare entitate care dorește să aibă acces la sistem trebuie mai întâi identificată și apoi verificată în ceea ce privește drepturile de acces.

Disponibilitate – sistemul de transfer trebuie să fie întotdeauna disponibil pentru entitățile autorizate.

1.2. Istoric

Nevoia ascunderii mesajelor și a informațiilor a apărut în momentul în care oamenii au evoluat părăsind peșterile, aceștia începând să trăiască în grupuri. O dată cu formarea triburilor și mai târziu a popoarelor și civilizațiilor oamenii au început să se confrunte cu probleme cum ar fi nevoia de expansiune, de hrană, de forță de muncă, dezvoltând astfel comportamente de violență, diplomație, strategie și manipulare. Primele forme rudimentare ale criptografiei au apărut astfel în regiunile geografice cuprinse astăzi de Egipt, Grecia și Italia.

Încă din anii 1900 î.Hr. cărturarii egipteni foloseau hieroglifele într-o manieră particulară pentru a le ascunde înțelesul.

Ideea grecilor de a codifica mesajele se baza pe înfășurarea unei benzi de hârtie pe un băț (scytale) și apoi se scria mesajul (figura 1). În momentul în care hârtia era desfășurată, mesajul era lipsit de înțeles. Descifrarea mesajului de către destinatar presupunea ca acesta sa posede un băț de aceeași grosime[2]. Descifrarea acestui cod presupunea încercarea mai multor bețe de grosimi diferite, până când mesajul devenea lizibil.

O altă metodă de criptare, de data aceasta folosită de romani a fost reprezentată de Cifrul lui Cezar[1]. Aceasta se baza pe înlocuirea fiecărei litere din textul inițial cu o literă care se află în alfabet la o distanță fixă față de cea înlocuită. În istorie, aceasta distanță a fost 3. Astfel litera B din alfabet era înlocuită cu litera E (figura 2). Destinatarul trebuia sa realizeze operația inversă pentru a descifra mesajul.

figura 2 – Cifrare Cezar cu distanta 3

Cifrul lui Cezar este un exemplu de cifru mono-alfabetic. Acesta este totuși ușor de spart, tot ceea ce ar trebui un adversar să facă este să ia alfabetul de la început și, prin încercări, să înlocuiască succesiv literele. La fiecare încercare (iterație) se verifică dacă rezultatul descifrării mesajului are înțeles. În momentul în care mesajul este lizibil, cifrul a fost spart. O altă metodă de spargere a cifrurilor mono-alfabetice este analiza frecvenței de apariție a literelor într-un cuvânt. Această metodă este atribuită arabilor (1000 d.Hr.) și se bazează pe ideea că într-un alfabet unele litere sunt folosite mai des decât altele. Astfel în limba română cea mai utilizată literă este E[3] (figura 3).

figura 3 – Frecvența utilizării literelor în limba română

Cunoscând acest lucru un adversar ar putea analiza frecvența literelor dintr-un mesaj codat și apoi să le înlocuiască cu cele mai utilizate litere din alfabetul respectiv.

Până în Evul Mediu criptografia nu a evoluat foarte mult. Până atunci toate conducerile țărilor vest europene au folosit criptografia într-o formă sau alta, în principal ca mijloc de comunicare între ambasadori. Unul dintre aceștia a fost Leon Battista Alberti, supranumit și „părintele criptografiei vestice” datorită dezvoltării cifrului poli-alfabetic. Metoda acestuia presupunea utilizarea a două discuri de cupru, fiecare având inscripționat alfabetul (figura 4). După fiecare câteva cuvinte, discurile erau rotite pentru a schimba logica de criptare astfel limitând eficacitatea decriptării prin analiza frecvenței literelor.

Substituția poli-alfabetică a cunoscut o multitudine de variante, una dintre acestea fiind atribuită lui Blaise de Vigenère. Cifrul Vigenère presupunea o serie de cifruri Cezar ce utilizau literele unui „cuvânt cheie”. Pentru criptare se folosea o tablă asemănătoare cu tabla înmulțirii denumită „tabula recta” (figura 5). Aceasta cuprindea alfabetul scris pe 26 de rânduri în mod decalat cu distanță de o literă față de rândul precedent. Literele cuvântului cheie se repetau până când cheia de criptare avea aceeași lungime ca textul de cifrat (criptat).

figura 5 – Tabula Recta

Exemplu:

Daca textul de criptat este: „cavaleriapeparteastanga”, iar cuvântul cheie este „soldat” cheia de criptare devine „soldatsoldatsoldatsolda”, astfel mesajul criptat va fi „uogdlxjwlseisfehalloyja”[4].

O îmbunătățire a cifrului Vigenère a fost cifrul Vernam-Vigenère creat în anul 1918 de către Gilbert Vernam care folosea o cheie de criptare de lungimea textului de criptat, cu litere aleatorii. Acest cifru s-a dovedit a fi aproape imposibil de spart.

În al doilea război mondial victoria din Pacific a americanilor în fața japonezilor s-a datorat utilizării limbajului tribului amerindian Navajo ca bază a criptografiei. Inițial mesajele criptate ale americanilor fiind interceptate de către japonezii care fuseseră crescuți și educați în SUA.

În zilele noastre cea mai utilizată metodă de criptare este criptarea cu cheie publică. Aceasta este o demonstrație de criptare asimetrică și presupune folosirea unei chei publice pentru destinatar și a unei chei private pentru expeditor. Astfel oricine primește mesajul criptat și deține o cheie publică poate descifra mesajul și identifica expeditorul. Această metodă stă la baza semnăturilor digitale.

Se poate observa că istoria nu oferă foarte multe detalii în ceea ce privește acest domeniu, însă criptografia sau, extrapolând, criptologia a avut un rol important în dezvoltarea multor societăți și culturi. Istoria prezintă doar prim-planul conflictelor, cele duse prin foc și sabie, însă în spatele acestora au existat totodată metode de criptare, cifrare și secretizare precum și metode de criptanaliză cu scopul de a decripta, descifra și desecretiza informațiile adversare.

Capitolul 2. Criptografie și securitate informatică

2.1. Aspecte generale

Daca deceniul anilor '90 a fost marcat de apariția și perfecționarea calculatoarelor personale, în timp acestea devenind din ce în ce mai accesibile publicului larg, începutul mileniului III este caracterizat de o conectivitate și o portabilitate tot mai pronunțată. Fuziunea intensă și rapidă dintre calculatoare și comunicații au determinat dezvoltarea rețelelor locale (LAN), metropolitane (MAN) și a rețelelor de arie largă (WAN).

Astfel informatica și electronica devin un pilon important în asigurarea, menținerea și securizarea conexiunilor și transferurilor de date științifice, militare, de afaceri sau bancare între persoane și instituții. Tehnologia dezvoltă noi și noi capabilități în ceea ce privește viteza de transfer, portabilitatea și accesibilitatea. O dată cu aceasta, toate mediile unei civilizații (social, comercial, guvernamental, militar, medical etc.) încearcă să se adapteze și să profite de posibilitățile pe care le oferă atât calculatoarele cât și conexiunile dintre acestea.

Cea mai mare rețea de calculatoare din lume este Internetul. Din punct de vedere statistic Internetul conectează zilnic câteva milioane de utilizatori și peste 40.000 de rețele[5]. Multitudinea de servicii pe care internetul o oferă a determinat oamenii, în scopul eficientizării din punct de vedere al vitezei și al accesibilității informațiilor, să abstractizeze unele sisteme, transferându-le în mediul virtual: grupuri de lucru și conferințe prin intermediul calculatoarelor, sisteme bancare de transferuri și plăți, poștă electronică, magazine virtuale, televiziune online, platforme de promovare publicitară, rețele de socializare etc.

O dată cu computerizarea și centralizarea unor sisteme s-a eficientizat accesibilitatea, disponibilitatea și viteza de transfer a informațiilor, dar astfel a crescut vulnerabilitatea în fața accesului necontrolat și/sau nepermis.

Majoritatea rețelelor de calculatoare sunt structuri în cadrul cărora se pot conecta un număr indefinit de utilizatori. În momentul conectării la rețea aceștia pot accesa resursele rețelei, fie acestea dispozitive fizice sau elemente virtuale: fișiere, aplicații, baze de date, conturi de utilizator, informații bancare etc. În acest sens este necesară o securizare a accesului la rețele.

Utilizatorii care accesează rețelele de la distanță trebuie identificați prin utilizarea de parole de nivel ridicat de securitate. Este cunoscut faptul că metodele hackerilor au evoluat foarte mult, însă principala vulnerabilitatea a parolei unui utilizator este chiar utilizatorul. De multe ori utilizatorii, în scopul de a reține cât mai ușor parolele aleg aceeași parolă pentru mai multe conturi sau folosesc parole „slabe”, ce conțin un număr mic de caractere alfabetice sau reprezintă un cuvânt uzual. Recomandarea specialiștilor în această privință este folosirea caracterelor alfanumerice (cifre, litere mari, litere mici) însoțite de semne de punctuație sau ortografie.

Astfel, la nivel înalt, în vederea securității datelor trebuie să se asigure anumite servicii cum ar fi:

autenticitatea datelor (siguranța că datele provin de la o sursă autentică);

confidențialitatea;

integritatea (nealterarea acestora pe parcursul transmisiei)

nerepudierea (imposibilitatea ca expeditorul să nu recunoască transmisia de date).

La nivel scăzut, dispozitivele de rețea, serverele, calculatoarele trebuie să facă diferența între utilizatorii autorizați și cei neautorizați.

În această situație, în scopul asigurării securității informatice apare criptografia computaționala, utilizată o lungă perioadă de timp în securitatea militară și diplomatică. Un sistem criptografic este format din:

mulțimea mesajelor lizibile;

mulțimea mesajelor cifrate;

mulțimea cheilor;

transformările de criptare;

transformările de decriptare.

Fiecare criptare este definită de un algoritm de criptare, comun tuturor criptărilor și o cheie diferită pentru fiecare transformare. Analog pentru decriptare.

Formalizarea matematică a acestor concepte a determinat un studiu academic profund, astfel fiind descoperite noi metode și algoritmi criptografici din ce în ce mai complecși.

2.2. Algoritmi criptografici

2.2.1. Algoritmi simetrici (cu cheie secretă)

Algoritmii simetrici sunt preponderent folosiți pentru securizarea datelor ce urmează a fi transmise prin rețele de calculatoare. Acești algoritmi presupun existența unei chei secrete pe care expeditorul o va folosi pentru criptare, iar destinatarul o va folosi pentru decriptare.

Datorită faptului că algoritmul este valabil în ambele sensuri, utilizatorii se bazează pe încredere reciprocă. Stabilitatea securității oferită de acest algoritm este dată de lungimea cheii și de secretizarea acesteia. Problema acestui algoritm este numărul mare de chei necesare. Pentru o rețea de x utilizatori este nevoie de un număr de conexiuni bidirecționale, respectiv chei. Astfel generarea, distribuția și managementul unui număr mare de chei devine dificil. Avantajul unui astfel de algoritm este că, un cifru creat nu poate fi spart chiar dacă se cunoaște algoritmul, cu condiția ca lungimea cheii să fie convenabilă și cheia să fie schimbată destul de des.

Aceasta logică stă la baza standardul american de cifrare a datelor – DES[6], utilizat pe scară largă de către guvernul SUA și alte companii de renume internațional. Acest sistem propus inițial de către IBM sub numele de Lucifer, a fost supus timp de 2 decenii la numeroase experimente de spargere a criptării realizate atât de specialiști de la NSA cât și de matematicieni de la mari universități mondiale. DES a devenit standard în anul 1977 și s-a evidențiat prin viteza de criptare. Astfel a ajuns să fie folosit de către armate din întreaga lume și de către sisteme bancare internaționale.

Datorită progresului tehnologic în ceea ce privește numărul de procesări pe minut ale calculatoarelor din zilele noastre, acest sistem criptografic devine învechit și nu mai oferă aceeași securitate ca la început. Se preconizează că în scurt timp acesta va fi înlocuit de alte sisteme cum ar fi IDEA[7] sau Clipper[8].

2.2.2. Algoritmi asimetrici (cu chei publice)

În anul 1976, Whitfield Diffie și Martin Hellman, doi cercetători de la Universitatea Stanford din California au creat un articol („New Directions în Cryptography” – „Noi direcții în criptografie”[9]) prin care au pus bazele criptografiei cu chei publice. Acesta a fost un moment de turnură în care a fost adoptat un nou principiu, diferit de ceea ce s-a folosit timp de mii de ani.

Noul principiu presupunea ca în locul unei singure chei secrete să existe două chei diferite, una pentru criptare și una pentru decriptare. Astfel oricine dorește să trimită un mesaj criptat poate folosi cheia de criptare, însă doar destinatarul care este în posesia celei de-a doua chei poate decripta și vedea mesajul. Cele două chei sunt independente și nu depind una de cealaltă. Acest principiu poate fi utilizat pentru autentificarea mesajelor, jucând rolul de semnătură digitală.

Cel mai popular algoritm cu chei publice este RSA. Aceasta a fost dezvoltat în 1977 la MIT (Massachusetts Institute of Technology) și publicat în 1978 de către Ron Rivest, Adi Shamir și Leonard Adleman. Numele algoritmului este de fapt un acronim al numelor autorilor.

Puterea criptografică a acestui algoritm are la bază dificultatea problemei factorizării numerelor întregi, pentru care toți algoritmii de rezolvare cunoscuți au complexitate exponențială.

Acest algoritm s-a bucurat de-a lungul timpului de o mare popularitate, atât în domeniul comercial cât și în cel guvernamental și este în prezent recunoscut ca fiind cel mai sigur algoritm de criptare și autentificare disponibil comercial. În prezent este folosit de mari organizații guvernamentale, economice și comerciale pentru securitatea transferurilor de date, a documentelor și parolelor: DOD (Department of Defense – Departamentul Apararii al SUA), NASA (National Aeronautics and Space Administration), SWIFT (Society for Worldwide Interbank Financial Telecommunication), Boeing, Motorola, DEC, Lotus, Novell etc.

Compania Lotus a implementat un nou sistem de lucru în rețea ce cuprinde numeroase calculatoare și persoane care lucrează în paralel și transmit date prin intermediul unei rețele. Astfel se folosește sistemul RSA în vederea utilizării semnăturii digitale și a secretizării informațiilor.

Firma Novell a dezvoltat un sistem de operare pentru rețelele locale ce utilizează cripto-sistemul RSA pentru autentificarea utilizatorilor pe nivelurile de securitate ale sistemului, implicit ale serverelor.

Compania Motorola produce și comercializează telefoane ce încorporează algoritmi RSA pentru securizarea, prin confidențialitate și autentificare, atât a utilizatorilor de telefoane cât și a corespondenților acestora.

În istorie, sistemul RSA a devenit la un moment dat mărul discordiei intre organizațiile guvernamentale ale SUA. Până în luna decembrie a anului 1990 NIST (National Institute of Standards and Technology – Institutul Național de Standarde și Tehnologie) promova utilizarea RSA ca standard, luând în considerare faptul că acesta exista deja în industrie. În luna august 1991 NIST a renunțat la promovarea RSA îndreptându-și interesul spre de un alt algoritm cu chei publice dezvoltat de cercetătorii de la NSA numit DSS (Digital Signature Standard – Standardul pentru Semnături Digitale) ce avea la bază un algoritm publicat de Taher Elgamal în anul 1985[10]. Această decizie a declanșat un val de controverse, nu cauzate de securitatea și performanța algoritmului în sine ci de creatorul acestuia, care era și o binecunoscută organizație cu puternice abilități criptanalitice și de spargere a criptărilor.

2.2.3. Sisteme cu chei în custodie

Un nou concept în curs de dezvoltare în SUA de către NSA este sistemul cu chei în custodie (Escrowed Key System). Acest sistem dezvolta o nouă tehnologie criptografică bazată pe un circuit integrat ce poartă numele de Clipper[8]. Rolul acestui sistem este de a intercepta și decripta (în mod legal) informațiile transmise atât prin telefon și fax cât și prin intermediul Internetului. Decriptarea se face pe baza unor fragmente de chei obținute legal prin solicitări de aprobare de la agențiile ce au în custodie cheile.

Acest cip va fi înglobat atât în plăcile de rețea ale calculatoarelor cât și în telefoanele fixe, mobile și faxuri. Cipul conține un algoritm simetric de criptare pe 64 de biți ce poartă numele de Skipjack[11]. Acest algoritm este secret, dezvoltat sub jurământ de către specialiști, folosește o cheie de 80 de biți, cuprinde 32 de runde de iterații și suportă toate cele 4 moduri de operații ale standardului DES[6]. Comparativ, standardul DES folosește o cheie pe 56 de biți și are doar 16 runde de iterație.

Cele 4 componente ale cipului Clipper sunt:

algoritmul de criptare;

cheie de 80 de biți comună tuturor chipurilor;

număr serial;

cheie secretă pe 80 de biți (lăsată în custodie sub forma de fragmente).

Cipurile Clipper sunt programate de către Mycrotronx Inc sub denumirea de MYK-78. Partea fizică este realizată de VLSI Tehnology Inc. utilizând tehnologii de circa 0.8 microni și costând aproximativ 30$ bucata (figura 6).

Cu toate acestea, atât companiile cât și societatea civilă refuză aceasta tehnologie deoarece:

a fost creată și dezvoltată în secret fără consultarea celorlalți producători din domeniu;

nu există documentații ale algoritmilor;

existența unei nișe ca să ofere posibilitatea pentru FBI (Federal Bureau of Investigation – Biroul Federal de Investigații) sau CIA (Central Intelligence Agency – Agenția Centrală de Informații) să decripteze informațiile;

se creează premisele restricționării și inhibării afacerilor datorită controlului intens exercitat de guvernul SUA;

există teama că CIA sau FBI ar putea intercepta transferurile de informații fără autorizare.

2.2.4. Sisteme electronice de plăți

Atât globalizarea cât și răspândirea calculatoarelor și mărirea ariei de acoperire a internetului a dus la dezvoltarea rețelelor de calculatoare la nivel global, astfel creând cadrul perfect pentru activități financiare de la distanță. Sistemele electronice de plăți permit transferul comod, sigur și rapid al banilor atăt între partenerii de afaceri cât și între clienți și vânzători sau prestatori de servicii. De asemenea, abstractizarea noțiunii de „bani” din numerar (bancnote și monede) în bani electronici determină din punct de vedere economic scăderea costurilor de emitere și menținere în circulație a numerarului și scăderea cheltuielilor privind forța de muncă necesară.

Schematic, o tranzacție poate fi ilustrată în felul următor:

Majoritatea sistemelor electronice de plăți funcționează online, astfel transferurile de bani electronici se fac prin intermediul tranzacțiilor. Acest lucru necesită un nivel înalt de securitate al întregului sistem de gestiune, atât pe partea de încasări cât și pe partea de plăți. Datorită faptului că, în momentul realizării unei tranzacții, informațiile parcurg mai multe rețele și mai multe nivele de securitate este necesară asigurarea confidențialității și autentificarea prin intermediu certificatelor și a semnăturii digitale.

Astfel se impun o serie de măsuri de securitate:

secretizarea bazelor de date și a documentelor;

secretizarea comunicațiilor privind transferul de documente, e-mail-uri, telefonie fixă, mobilă, internet și fax;

autentificarea originii oricărui tip de informație fizică sau virtuală;

protejarea aplicațiilor de criptare (secretizare).

În general, sistemele electronice de plăți folosesc algoritmi criptografici cu chei publice. Majoritatea algoritmilor au la bază problema algoritmilor discreți, o problemă la fel de puternică și complexă ca factorizarea algoritmului RSA.

Dezvoltările viitoare cuprind organizarea și implementarea unui sistem finanțat de Comunitatea Europeana ce va încerca să impună un standard comun în toate statele comunitare în ceea ce privește sistemele electronice de plăți.

Capitolul 3. Descrierea proiectului

Acest proiect reprezintă atât o demonstrație superficială de criptografie cât și o posibilitate de îmbinare a criptografiei cu informatica, mai exact spus cu domeniul software și sistemul de operare Windows.

Din punct de vedere criptologic acest proiect reprezintă o metodă neconvențională de criptare și anume criptarea unei imagini. Cu toate că sistemul de criptare – decriptare prezentat respectă schema unui sistem tradițional, neconvenționalitatea acestuia este dată atât de formatul informației de criptat/decriptat cât și formatul cheii de criptare și de algoritmul folosit:

informația de criptat este o imagine;

cheia de criptare este o imagine de aceeași rezoluție ca imaginea de criptat sau mai mare;

algoritmii de criptare și de decriptare lucrează la nivel de biți ai pixelilor.

Crearea unui sistem sau a unei aplicații software cuprinde mai multe etape:

analiza: sunt analizate cerințele beneficiarului și căutate soluții cât mai avantajoase atât din punct de vedere financiar cât din punct de vedere al timpului de lucru. Rezultatul acestei etape exprimă clar, într-o manieră mai apropiată de limbajul dezvoltatorului decât de limbajul uzual al beneficiarului, cerințele ce trebuie îndeplinite. Tot acum se face o estimare a costurilor, a volumului de muncă și a timpului necesar realizării sistemului;

proiectarea: pe baza cerințelor rezultate în etapa anterioară se stabilesc tehnologiile necesare atingerii scopului și se concepe structura sistemului, modulele necesare, componentele interne, design-ul, modul de funcționare al acestora, dar și sistemul de operare vizat pentru rularea sistemului;

implementarea: construcția propriu-zisă a sistemului, în baza detaliilor stabilite anterior în proiect, fie prin implementarea și imbricarea de module deja existente și eventual particularizarea (customizarea) lor, fie prin crearea de la 0 a modulelor necesare. În timpul implementării, echipa de dezvoltare trebuie să gestioneze eficient problemele legate de performanță, calitate, interfața cu utilizatorul, controlul erorilor și să prezinte un mod defensiv de programare (limitarea erorilor atunci când se încearcă abuzurile din partea utilizatorului. Ex: introducerea de date în format incorect);

testarea: verificarea modului de funcționare a aplicației în diferite situații ce pot apărea în cazul utilizării de către o persoană necalificată.

3.1. Tehnologii utilizate

Am stabilit în prealabil faptul că scopul sistemului de criptare – decriptare este de a rula pe platforme cu sisteme de operare Windows. Pentru dezvoltarea aplicațiilor Windows este necesară utilizarea interfeței Windows API (Application Programming Interface – Interfața Programării Aplicațiilor). Windows API este cunoscut și sub numele de Win32. Această interfață oferă programatorului posibilitatea de lucru cu ferestre și componentele acestora, fie ele componente grafice sau abstracte (evenimente), accesul la memoria calculatorului, la procesele și serviciile pe care acesta le rulează, la dispozitivele de intrare (tastatură, mouse, microcontrolere, placi de achiziție de date, placi audio, placi de rețea etc.) sau de ieșire (monitor, boxe etc.).

3.1.1. Microsoft Visual Studio

Pentru realizarea unui produs software este nevoie de un mediu de dezvoltare. Pentru Windows cel mai cunoscut mediu de dezvoltare este pachetul Microsoft Visual Studio. În cazul de față s-a folosit versiunea Microsoft Visual Studio 2010.

Microsoft Visual Studio este un mediu de dezvoltare integrat (IDE – Integrated Development Environment) de la Microsoft. Acesta este utilizat pentru a dezvolta aplicații pentru toată suita de sisteme de operare Microsoft Windows, precum și pentru site-uri web, aplicații și servicii web. Visual Studio folosește platforme de dezvoltare software proprietare Microsoft, cum ar fi:

Windows API;

Windows Forms;

Windows Presentation Foundation;

Windows Store;

Microsoft Silverlight.

Acestea pot produce atât cod nativ cât și cod gestionat. Visual Studio include un editor de cod ce suportă tehnologia IntelliSense (autocompletarea codului). Debugger-ul (depanatorul) integrat funcționează atât ca un program de depanare la nivel de cod sursă cât și un debugger la nivel de cod mașină. Alte unelte integrate în acest mediu includ un designer de ferestre pentru construirea de interfețe grafice (GUI – Graphic User Interface), un web designer de tip WYSIWYG (What You See Is What You Get – Creezi ceea ce vezi), un designer de clase de obiecte și un designer pentru stabilirea relațiilor de legătură între tabelele unei baze de date.

Un designer WYSIWYG este de fapt un modul al unui designer sau editor care arată în timp real, pe măsura ce programatorul creează prin cod noi componente, felul în care ar arata interfața sistemului dacă blocurile de cod ar fi compilate în acel moment.

Mediul acceptă plug-in-uri care îmbunătățesc funcționalitatea la aproape orice nivel, inclusiv adăugarea de suport pentru sistemele de control al surselor (cum ar fi Subversion) și adăugarea de noi seturi de unelte, cum ar fi editori și designeri vizuali pentru anumite limbaje specifice sau seturi de unelte pentru alte aspecte ce pot interveni în ciclul de dezvoltare software (cum ar fi clientul Team Foundation Server: Team Explorer).

În luna februarie a anului 2002 Microsoft a lansat Visual Studio .NET (VS.NET) ce cuprindea un mediu de dezvoltare a codului gestionat, acesta având la baza platforma .NET. Programele realizate folosind această platformă nu sunt compilate în limbaj mașină ci intr-un format intermediar numit MSIL (Microsoft Intermediate Language) sau CIL (Common Intermediate Language). După ce sunt compilate, programele sunt executate în limbajul mașină corespunzător calculatorului curent. În acest fel codul poate fi folosit pe mai multe platforme (sisteme de operare) incluzând Linux și Mac OS X, cu ajutorul unor implementări ale platformei .NET cum ar fi Mono și DotGNU.

Visual Studio suportă diferite limbaje de programare și permite editorului de cod și debugger-ului să suporte (în în anumite limite) aproape orice limbaj de programare, cu condiția să existe un serviciu specific limbajului respectiv. Limbajele integrate în acest mediu sunt:

C;

C++ și C++/CLI (prin Visual C++);

VB.NET (prin Visual Basic .NET);

C# (prin Visual C#);

ASP.NET

F# (începând cu Visual Studio 2010)

Suportul pentru alte limbaje, cum ar fi Mumbs, Python, Ruby este disponibil prin intermediul serviciilor lingvistice instalate separat. De asemenea, mediul susține și limbajele: XML, XSLT, HTML/XHTML, JavaScript și CSS[13].

3.1.2. Platforma .NET

.NET este o platformă (framework) ce are ca scop dezvoltarea unitară a produselor software, permițând crearea, rularea și distribuirea aplicațiilor Windows și aplicațiilor Web. Această platformă este o imbricare a mai multor tehnologii:

ASP;

XML;

OOP;

SOAP;

WSDL;

UDDI.

Și cuprinde mai multe limbaje de programare :

C++;

C#;

J#;

F#;

VB.

Platforma asigură portabilitatea codului compilat pe mai multe calculatoare, în general cu sistem de operare Windows. De asemenea este posibilă reutilizarea codului de la o aplicație la alta indiferent de limbajul folosit.

Începând cu anul 2002 platforma .NET a început să fie inclusă în pachetele de dezvoltare software Visual Studio[14]:

Datorită faptului că platforma .NET a devenit necesară pentru multe aplicații ce rulează pe sistemele de operare Windows, versiuni ale acesteia au fost înglobate în sistemele de operare[15]:

Pentru realizarea aplicațiilor cu suport .NET sunt necesare 3 elemente:

un limbaj de programare (C++, C#, Visual Basic(VB), F#, J#, ASP.NET, Perl, Fortran, Cobol, Pascal, Lisp etc.);

un mediu de dezvoltare (Visual Studio, Visio etc.);

o bibliotecă de clase pentru aplicațiile Windows sau Web.

Pe lângă posibilitățile și funcționalitățile de programare, aplicațiile pe platforma .NET mai oferă și suport pentru:

servere de baze de date SQL (SQL Server);

servere de e-mail;

aplicații Bussiness to Bussiness (B2B) pentru comerț electronic;

module de autentificare (user login);

servicii web comerciale (.NET Passport);

servicii pentru dispozitive mobile (Tablet PC, Pocket PC, XBox).

Platforma .NET are la bază interfața .NET (.NET Framework), aceasta reprezentând ultimul nivel între aplicațiile .NET și sistemul de operare.

Pentru ca limbajele platformei să poată fi integrate acestea funcționează după niște standarde ale programării orientate obiect (OOP) numite CTS (Common Type System). Aceste standarde cuprind atât elemente de bază ale programării: clase, interfețe, variabile globale, obiecte, tipuri de date, referințe, pointeri, cât și unele mecanisme primordiale: abstractizare, încapsulare, polimorfism, moștenire, tratarea erorilor (excepțiilor).

Limbajele .NET (C++, C#, Visual Basic .NET, F#, J#) sunt executate pe o platformă comună ce poartă denumirea de CLR (Common Language Runtime). Această platformă înglobează CTS.

Ansamblul bibliotecilor utilizate pentru realizarea aplicațiilor pentru calculatoare sau pentru mediul web poarta numele de FCL (Framework Class Library).

Arhitectura platformei .NET se regăsește în Anexa 2.

O aplicație realizată într-unul din limbajele de programare incluse în .NET ce respectă specificațiile CLS este compilată în Microsoft Intermediate Language (MSIL sau IL). Deși codul rezultat în urma compilării are extensia „exe”, acesta nu este executabil ci se află doar sub formatul unic al MSIL.

CLR cuprinde o mașină virtuală (VM – virtual machine) asemănătoare cu o mașina vituală Java. Aceasta folosește un compilator special denumit JIT (Just-in-time) ce compilează codul din format MSIL producând cod mașină. Unul din marile avantaje ale modului de funcționare al compilatorului JIT este eficiența datorată faptului că acesta recunoaște blocurile de instrucțiuni (secvențele de cod) deja compilate în cod mașină și le reutilizează fără a le recompila. Din acest motiv, în timpul rulării, aplicațiile .NET își păstrează rapiditatea. Un alt mare avantaj este cantitatea mică de memorie ocupată sau utilizată la un moment dat. Acest lucru se datorează sistemului de eliberare automată a zonelor de memorie a unor date devenite inutile (Garbage Collection).

Schema compilării unei aplicații .NET[16]:

Interoperabilitatea și independența de platformă sunt rezultatele faptului ca pseudo-executabilul MSIL poate rezulta din compilarea unor limbaje diferite. Astfel, clasele și obiectele realizate cu unul din limbajele .NET pot fi utilizate și în celelalte limbaje.

3.1.3. C# (C Sharp)

Limbajul de programare în care este creat un proiect software depinde în primul rând de necesitățile, posibilitățile și funcționalitățile pe care le are acel limbaj și în al doilea rând de decizia persoanei sau a echipei de dezvoltare. Dat fiind faptul că în Visual Studio limbajele conțin biblioteci enorme de funcții și funcționalități, de multe ori limbajul în care este realizat un produs software este ales în funcție de abilitățile și experiența programatorului.

C# (se pronunță C șarp) este un limbaj de programare modern, dezvoltat de un număr mic de ingineri de la Microsoft, echipă din care face parte și autorul limbajului de programare Turbo Pascal (Anders Hejlsberg).

Principiile de bază ale programării C# sunt aceleași cu fundamentele programării orientate obiect (abstractizare, încapsulare, polimorfism, moștenire). Limbajul moștenește sintaxa și principiile din C++, conținând astfel aproximativ 80 de cuvinte cheie (Anexa 3) și 12 tipuri de date (Anexa 4).

Clase, atribute și metode

O aplicație C# conține una sau mai multe clase, organizate într-un namespace (spațiu de nume). Un spațiu de nume nu poate conține două clase cu același nume, dar pot exista clase cu același nume în spatii diferite. De asemenea este posibilă imbricarea spațiilor de nume. Numele unei clase conține numele spațiului separat printr-un punct de numele clasei (exemplu: nume_spațiu.nume_clasă).

O clasă este formată din atribute și metode. Atributele sunt variabilele clasei, iar metodele sau serviciile sunt funcțiile clasei. Majoritatea funcțiilor și variabilelor sunt interne. Acestea sunt de tip private și nu pot fi accesate de cât din interiorul altor funcții ale clasei. Pentru ca funcțiile și variabilele să poată fi accesate și din exteriorul clasei, acestea trebuie să fie de tip public. Cea mai importantă funcție a unei clase este constructorul. Aceasta este o funcție publică. Cu ajutorul constructorului se creează obiecte (instanțe) ale acelei clase.

Sintaxa

Sintaxa limbajului cuprinde litere mici și mari ale alfabetului englez, precum și cifre și anumite simboluri cu semnificații lexicale în programarea orientată obiect și nu numai.

Nomenclatura dată claselor, variabilelor și metodelor trebuie să respecte anumite reguli:

primul caracter al numelui trebuie să fie o litera sau unul din simbolurile _ sau @;

după primul caracter urmează o literă, o cifră sau _

numele nu pot reprezenta cuvinte cheie (lista cuvintelor cheie se regăsește în Anexa 3);

într-un nume caracterele mici diferă de cele mari.

Tipuri de date

Tipurile de date în C# se împart în două categorii:

tipuri valoare:

tip simplu: byte, char, int, float, decimal, bool etc;

tip enumerare: enum;

tip structură: struct;

tipuri referință:

tip clasa: class;

tip interfață: interface;

tip delegat: delegate;

tip tablou: array.

O listă a tipurilor simple predefinite de date și a domeniilor acestora de valori se în Anexa 4.

Expresii

O expresie este o secvență formată din operanzi și operatori. Un operator, este ca și în matematică, un simbol care arată operația efectuată, iar un operand este variabila sau valoarea asupra căreia se realizează operația. Analog cu matematica, dacă nu există paranteze, operațiile se execută în funcție de prioritatea acestora. Dacă există mai mulți operatori de aceeași prioritate, expresia se evaluează de la stânga la dreapta.

Instrucțiuni de bază

Instrucțiunea if este o instrucțiune condițională (dacă) ce execută o instrucțiune sau un bloc de instrucțiuni în funcție de valoarea de adevăr returnată de evaluarea unei condiții.

Sintaxa este:

if (condiție)

instrucțiuni1;

else

instrucțiuni2;

În cazul în care condiția este evaluată cu o valoare de adevăr TRUE se execută Instrucțiuni1 în caz contrar se executa Instrucțiuni2.

Instrucțiunea while este o instrucțiune repetitivă (cât timp) cu număr necunoscut de pași. Aceasta execută un set de instrucțiuni atât timp cât condiția este evaluată TRUE.

Sintaxa este:

while (condiție)

instrucțiuni1

Instrucțiunea for este o instrucțiune repetitivă cu număr cunoscut de pași. Aceasta execută un set de instrucțiuni la fiecare iterație.

Sintaxa este:

for (inițializareCiclu; condițieFinală; pas)

Instrucțiuni1

Variabila inițializareCiclu precizează la ce la valoarea încep iterațiile. Iterația (rularea) blocului de instrucțiuni Instrucțiuni1 se repetă de atâtea ori până se atinge sau se depășește condiția finală codițieFinală.

Instrucțiunea switch este o instrucțiune multi-condițională ce execută un set de instrucțiuni în funcție de valoarea unei variabile.

Sintaxa este:

switch (a)

{

case 1: instrucțiuni1; break;

case 2:

case 3: instrucțiuni2; break;

default: instrucțiuni3; break;

}

Dacă variabila a are valoarea 1 se execută setul instrucțiuni1, dacă are valoarea 2 sau 3 se execută setul instrucțiuni2, pentru alte valori ale variabilei a se execută setul default. Instrucțiunea break permite ieșirea din instrucțiunea în care se află.

Instrucțiunea foreach se utilizează pentru parcurgerea tablourilor, fie acestea uni-dimensionale (vectori) sau multi-dimensionale (matrice sau masive).

Sintaxa este:

string[] nume={“Ana”, “Ionel”, “Maria”};

foreach (string copil în nume)

instrucțiuni1;

Pentru fiecare element de tip string (sir de caractere) al variabilei nume de tip tablou unidimensional, se realizează câte o iterație în care variabila copil de tip string primește valoarea elementului iterației curente.

3.2. Implementarea proiectului

Implementarea unui proiect software presupune mai mulți pași:

instalarea și configurarea tehnologiilor necesare dezvoltării proiectului: medii de dezvoltare, biblioteci, module, servere și baze de date, conexiuni la rețea etc.;

crearea unui noi proiect;

realizarea interfeței grafice;

crearea instrucțiunilor ce trebuie executate în vederea atingerii scopului propus.

3.2.1. Instalarea și configurarea Visual Studio

Pentru realizarea aplicațiilor acestui proiect a fost utilizat Visual Studio 2010, în primul rând datorită multitudinii de funcționalități oferite de această versiune a mediului de programare, alături de platforma .NET 4.0 și în al doilea rând datorită performanțelor sistemului IntelliSense[17] de auto-completare și oferirea de sugestii și instrucțiuni de folosire a diverselor funcții în momentul scrierii codului.

Înainte de achiziționarea unui mediu de dezvoltate, de fapt a oricărei aplicații trebuie consultată lista de cerințe de sistem a aplicației respective. În acest caz, lista de cerințe pentru Visual Studio 2010 este:

Sistem de operare:

Windows XP (x86) cu SP3 – excluzând Starter Edition;

Windows Vista (x86, x64) cu SP2 – excluzând Starter Edition;

Windows 7 (x86, x64);

Windows Server 2003 (x86, x64) cu SP2 – este necesar MSXML6;

Windows Server 2003 R2 (x86, x64);

Windows Server 2008 (x86, x64) cu SP2;

Windows Server 2008 R2 (x64);

Arhitectura:

32-Bit (x86)

64-Bit (x64) (WOW[18])

Cerințe Hardware (minime):

Procesor (CPU) 1.6GHz;

Memorie RAM: 1GB RAM (1.5 GB pentru mașini virtuale);

Memorie HDD: 5.5 GB;

Viteză rotație HDD: 5400 RPM;

Placa video: compatibila DirectX 9;

Rezoluție video: minim 1024 x 768;

DVD-Rom.

Dacă aceste cerințe sunt îndeplinite, se poate continua la achiziționarea produsului Visual Studio 2010, în caz contrar, se recomandă utilizarea unei versiuni mai vechi (Visual Studio 2008 – conține platforma .NET 3.5), totuși nu se poate utiliza Visual Studio 2005.

Achiziționarea Visual Studio 2010 se poate face fie fizic, din magazinele de specialitate împreună cu o licență, fie online prin descărcarea pachetului de la adresa https://www.microsoft.com/en-us/download/details.aspx?id=23691 și mai apoi achiziționarea online a unei licențe. Pentru dezvoltarea proiectului de față s-a utilizat Visual Studio 2010 Professional x86 pe un sistem de operare Windows 7 Ultimate x64, instalarea acestuia realizându-se de pe un DVD.

După introducerea DVD-ului în calculator, se așteaptă citirea acestuia, apoi pe ecran va apărea o fereastra care arată astfel:

Se dă click pe Run autorun.exe.

În următoarea fereatră se da click pe Install Microsoft Visual Studio 2010.

Dacă nu se dorește trimiterea de informații către compania Microsoft conținând detalii despre modul de instalare dar și despre eventualele erori ce pot apărea în timpul instalării se debifează căsuța Yes, send information about my setup experiences to Microsoft Corporation și se dă click pe Next în momentul în care toate resursele au fost încărcate.

Se acceptă termenele și condițiile și se dă click pe Next. Deoarece nu dorim instalarea tuturor componentelor se bifează căsuța Custom, se alege adresa de instalare a pachetului și se da click pe Next.

Se lasă bifata doar căsuța Visual C# și apoi se da click pe Install.

După încărcarea barei din josul ferestrei instalarea este completă și se poate da click pe butonul Finish.

În această situație instalarea Visual Studio s-a încheiat cu succes, următorul pas este pornirea mediului de programare și crearea unui nou proiect.

3.2.2. Crearea unui proiect C#

Se deschide Microsoft Visual Studio 2010 din meniul de start sau de la adresa la care acesta a fost instalat. Pentru a crea un nou proiect C# se poate folosi combinația de taste Ctrl+Shift+N sau din meniul File se alege New și apoi Project… .

În următoarea fereastră trebuie stabilite mai multe detalii despre proiectul dorit. În primul rând, din coloana din stânga se alege Visual C#, apoi din lista apăruta Windows Forms Application. Tot aici se poate alege numele aplicației și versiunea platformei .NET pe care aceasta va rula, precum și numele proiectului.

În ceea ce privește numele proiectului și al aplicației există mai multe reguli:

nu pot conține caracterele: /, ?, :, &, \, *, ”, <, >, |, #, %;

nu pot conține caractere Unicode de control;

nu pot conține caractere surogat (în format UTF-16);

nu pot fi nume rezervate: „CON”, „AUX”, „PRN”, „COM1”, „LPT2” etc.

nu pot fi „.” sau „..” .

În cazul în care numele introdus pentru proiect sau aplicație conține caractere incorecte va apărea o fereastră de eroare:

3.2.3. Realizarea interfeței grafice

După stabilirea corectă a celor două nume, se poate trece la realizarea interfeței grafice. Fereastra designer-ului grafic arată astfel:

În partea stângă a ferestrei se regăsește Toolbox-ul ce conține toate elementele grafice care pot fi adăugate în fereastra aplicației. Principala fereastră a aplicației poartă numele de Form1 și se regăsește în zona centrală a spațiului de lucru. În partea dreaptă superioară se află structura arborescentă a proiectului ce conține toate elementele acestuia incluzând atât ferestrele și fișierele cu definirea claselor și obiectelor cât și referințele și resursele proiectului. Pentru modificarea proprietăților ferestrei, se dă click dreapta pe fereastra Form1 și apoi pe Properties. În acest caz, în partea dreaptă inferioară va apărea un tabel în care se pot seta atât proprietățile ferestrei Form1, cât și a altor componente grafice (dimensiune, text, culoare, poziționare, opacitate etc.). Elementele grafice din Toolbox se pot adăuga în fereastra Form1 fie prin drag-and-drop, fie prin executarea unui click pe elementul dorit și apoi un click în interiorul ferestrei.

O mare importanță o prezintă evenimentele (events). Acestea reprezintă abstractizarea unor acțiuni fizice (apăsarea unei taste la tastatura, a unui buton de mouse, redimensionarea ferestrei) sau virtuale (încărcarea ferestrei). În momentul în care se întâmplă un event acesta poate executa o funcție (un bloc de instrucțiuni). Fiecare componentă grafică, inclusiv fereastra are atașate mai multe event-uri. Pentru implementarea unui event fie se dă click pe iconița acestuia din zona Properties și apoi se atașează o funcție deja creată, fie se dă un dublu click pe elementul cu pricina. De exemplu, funcția care va rula în momentul încărcării ferestrei Form1 se defineste:

private void Form1_Load(object sender, EventArgs e)

{

}

Instrucțiunile dorite se vor introduce între parantezele acolade.

3.2.4. Importarea unui proiect existent

Se realizează în cazul în care se dorește introducerea (importarea) în mediul de programare a unui proiect deja creat. Acest lucru se realizează fie prin combinația de taste Ctrl+Shift+O, fie din meniul File, Open și apoi Project/Solution….

3.3. Descrierea aplicațiilor

Proiectul cuprinde două aplicații. O aplicație pentru criptarea imaginii și o aplicație pentru decriptare. Aplicația de criptare va fi deținută de expeditorul informației criptate, iar aplicația de decriptare, de către destinatar.

3.3.1. Aplicația de criptare

Realizează criptarea unei imagini cu ajutorul altei imagini, cu condiția ca imaginea ce se dorește a fi ascunsă să aibă o rezoluție cel mult egală cu imaginea folosită pentru ascundere.

Prezentarea interfeței grafice

Interfața aplicației este simplă, ușor de utilizat de către orice utilizator indiferent de cunoștințele acestuia în domeniul calculatoarelor sau a criptografiei.

Astfel aplicația se împarte în mai multe zone:

zona încărcării celor două imagini;

zona lansării în execuție a criptării;

zona alegerii numărului de biți în funcție de care se va face criptarea;

zona ce va prezenta cele 3 imagini: imaginea de bază, imaginea ce va fi ascunsă și imaginea finală;

zona ce conține butonul de salvare a imaginii rezultate în urma criptării.

Rularea aplicației

Rularea aplicației cuprinde mai mulți pași și are ca rezultat final obținerea unei noi imagini.

Aceasta este o copie fidelă a imaginii de bază, poate fi salvată în calculatorul utilizatorului și poate fi trimisă unui destinatar în vederea decriptării. Pe parcursul rulării se poate observa că în anumite momente, doar unele butoane devin active. Acest lucru este o dovadă de programare defensivă și previne utilizarea agresivă sau abuzivă a aplicației.

Pasul 1: este activ doar butonul Choose picture 1 cu ajutorul căruia se va alege imaginea de bază, cea în care se va ascunde cea de-a doua imagine (cea care se dorește a fi secretă). În momentul apăsării butonului se deschide o fereastră de dialog (o componentă C# de tip openFileDialog1) care permite alegerea unui fișier imagine. Trebuie precizat ca această fereastră de dialog acceptă doar fișiere de tip imagine cu extensiile: jpg, jpeg, jpe, jfif, png, bmp. După alegerea imaginii, în dreapta butonului apar detalii conținând adresa imaginii din calculatorul curent și rezoluția acesteia, devine activ al doilea buton de încărcare a imaginii, iar imaginea este încărcată în partea de stânga-jos a ferestrei:

Pasul 2: este asemănător pasului 1 doar că de această dată se alege cea de-a doua imagine, care urmează a fi ascunsă. Astfel se apasă butonul Choose picture 2 și se alege o altă imagine.

După alegerea imaginii, în dreapta butonului apar detalii conținând adresa imaginii din calculatorul curent și rezoluția acesteia, devine activ butonul de criptare a imaginii, iar imaginea este încărcată în partea centrală-jos a ferestrei.

Pasul 3: este cel mai important pas deoarece în acest moment se rulează algoritmul de criptare. Acest pas începe în momentul apăsării butonului Encrypt picture.

Algoritmul de criptare este unul foarte simplu dar eficient. Acesta lucrează la nivel de octet și de bit pentru fiecare pixel al imaginilor.

Primul lucru care se execută după apăsarea butonului Encrypt picture este verificarea dimensiunilor imaginilor. Astfel lungimea imaginii 2 trebuie să fie mai mică sau egală cu lungimea imaginii 1 și analog, înălțimea imaginii 2 trebuie să fie mai mică sau egală cu înălțimea imagini 1. Mai pe scurt, imaginea 2 trebuie să fie cel mult egală cu imaginea 1 sau se încadreze în imaginea 1 astfel:

În caz contrar va apărea un mesaj de eroare:

Pentru a înțelege modul de funcționare al algoritmului este necesară o discuție despre modul reprezentării unei imagini în format binar.

Fiecare imagine are o rezoluție (exemplu: 1024×768). Această rezoluție reprezintă de fapt lungimea și înălțimea imaginii exprimate în pixeli, astfel imaginea noastră conține 1024*768 = 786.432 pixeli. Fiecare pixel reprezintă o culoare. O culoare este reprezentata în codul RGB (Red Green Blue) ca fiind un triplet de valori cuprinse între 0 și 255 inclusiv, câte o valoare pentru fiecare culoare din RGB.

Între 0 și 255 inclusiv, sunt 256 de numere, ceea ce înseamnă 28, adică un octet (eng.: byte), adică un șir de 8 biți (eng.: bit). Astfel o valoare numerică poate fi transformată în sir de biți prin transformarea acesteia în baza 2, 0 fiind reprezentat ca 00000000, iar 255 ca 11111111.

20 + 21 + 22 + 23 + 24 + 25 +26 + 27 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255

Exemplificare:

Un pixel de culoare (dark blue, lighter 40%) are codul RGB: 84, 141, 212. Aceste numere exprimate în baza 2 sunt:

84(2) = 01010100;

141(2) = 10001101;

212(2) = 11010100;

Astfel codul binar ar pixelului este 010101001000110111010100.

În scopul criptării, utilizatorul poate alege numărul de biți după care se va face aceasta. Astfel criptarea se poate face pe 1, 2 sau 3 biți. Variația numărului de biți determină modificarea calității imaginilor (imaginea obținută în urma criptării și imaginea obținută în urma decriptării). Realizând o criptare pe 1 bit se va obține o imagine criptată mai fidelă, dar imaginea decriptată va avea o calitate mai scăzută, însă lizibilă. Realizând o criptare pe 3 biți se va obține o imagine criptată ce va conține mai mult „zgomot”, însă imaginea decriptată va avea o calitate mai bună.

Notând cu x numărul de biți ales de utilizator putem descrie modul de funcționare al algoritmului astfel: algoritmul folosește cei mai puțin semnificativi x biți ai imaginii de bază, înlocuindu-i pe aceștia cu cei mai semnificativi x biți ai imaginii care se va ascunde. Este de înțeles faptul ca astfel se pierde informație pentru că din totalul de 8 biți ai imaginii ce se va ascunde se vor folosi doar 3.

Demonstrație:

Se presupune că există 2 pixeli de culori diferite:

pixelul A – un pixel de culoare (aqua, darker 25%) al imaginii de bază;

pixelul B – un pixel de culoare (orange, lighter 60%) al imaginii ascunse.

Pixelul A are codul RGB: 49, 132, 155. Transformate în binar rezultă:

49(2) = 00110001;

132(2) = 10000100;

155(2) = 10011011;

Pixelul B are codul RGB: 251, 212, 180. Transformate în binar rezultă:

251(2) = 11111011;

212(2) = 11010100;

180(2) = 10010110;

Asupra acestora se va aplica o criptare pe n (n = [1, 2, 3]) biți care, se va realiza astfel: pentru fiecare culoare RGB a pixelului A cei mai nesemnificativi n biți vor fi înlocuiți de cei mai semnificativi n biți ai fiecărei culori din codul RGB al pixelului B. Rezultatul va fi un nou pixel denumit pixel C.

In fiecare din cele 3 cazuri pixelul C va fi asemănător cu pixelul A, însă va conține informație din pixelul B. Comparativ cu pixelul A este puțin diferit, însă luând în calcul dimensiunea unui pixel pe un ecran diferența de culoare este insesizabilă. În tabelul de jos, pentru cele 3 cazuri se vor juxtapune cele 2 culori pentru comparație:

Așa cum (nu) se poate observa diferența este insesizabilă.

Acești pași se repetă pentru fiecare pixel, în limita rezoluției imaginii de ascuns. Dacă imaginea de ascuns este mai mică decât cea de baza, pixelii externi imaginii de ascuns nu vor fi modificați.

Astfel se obține o a treia imagine (imaginea criptată) ce este o copie fidelă a imaginii de bază. Aceasta poate fi salvată în calculatorul curent și apoi transmisă destinatarului spre a fi decriptată.

3.3.2. Aplicația de decriptare

Aplicația de decriptare, după cum ii este și numele realizează decriptarea unei imagini. Aplicația nu conține vreun modul sau algoritm care recunoaște dacă o imagine a fost în prealabil criptată sau nu, ci aplică același algoritm pe orice imagine. Importantă este astfel imaginea introdusă în program pentru decriptare.

Interfața aplicației

Aplicația de decriptare este asemănătoare aplicației de criptare, însă puțin mai simplistă, datorită faptului că pentru decriptare este necesară doar o imagine și nu două.

Rularea aplicației

Pentru a se decripta o imagine se apasă butonul Choose picture care deschide o fereastră de dialog ce permite încărcarea unei imagini. Cu toate că filtrul ferestrei permite doar introducerea imaginilor cu extensiile jpg, jpeg, jpe, jfif, png, bmp, aplicația de criptare salvează imaginea criptată cu extensia png.

După alegerea imaginii, detalii cuprinzând adresa din calculatorul local și rezoluția acesteia apar în dreapta butonului. Imaginea este de asemenea încărcată în partea stânga jos a aplicației.

Numărul de biți folosit pentru a face decriptarea, poate fi comunicat o dată cu imaginea sau se pot face 3 decriptări (câte una pentru fiecare număr de biți) pentru obținerea unei imagini decriptate cat mai lizibile.

După alegerea numărului de biți dorit, se va apasă butonul Decrypt picture care va lansa în execuție algoritmul de decriptare. Acesta nu verifica daca imaginea introdusă este criptată sau nu.

Notând cu y numărul de biți ales pentru decriptare, se poate exprima faptul că algoritmul ia de la fiecare culoare RGB (exprimată în format binar) a fiecărui pixel cei mai nesemnificativi y biți și creează noi pixeli folosindu-i pe pozițiile celor mai semnificativi biți. Astfel se pot „decripta” și imagini necriptate.

Demonstrație

În această demonstrație se va folosi pixelul C obținut mai devreme la demonstrarea criptării. Pentru a omite diversele posibilități ce pot apărea în urma utilizării unui număr diferit de biți în cazurile de criptare – decriptare (de exemplu, criptare pe 2 biți, decriptare pe 3 biți) se va utiliza același număr de biți și în cazul decriptării. Astfel tabelul demonstrativ de mai sus poate fi completat cu încă un pixel D.

Pixelul D reprezintă de fapt rezultatul procesului de criptare – decriptare a pixelului B. Astfel în urma acestui proces culoarea pixelului B cu RGB(251, 218, 180) va ajunge:

Se poate observa astfel că o dată cu creșterea numărului de biți folosiți pentru criptare – decriptare creste și gradul de asemănare al culorilor. Astfel cu cât se folosesc mai mulți biți de criptare, cu atât culoarea rezultată în urma decriptării va fi mai apropiată de cea originală. Chiar dacă asemănarea culorilor nu prea este evidentă, trebuie luat în considerare atât faptul ca acesta este doar un pixel, de o dimensiune infimă cât și faptul că toți pixelii se modifică aproximativ proporțional pe toata suprafața imaginii, deci chiar daca imaginile nu vor avea aceleași culori, formele din imagini își vor păstra consistența.

După decriptare, imaginea decriptata va apărea în partea din dreapta jos a aplicației, aceasta putând fi salvată în calculatorul utilizatorului prin utilizarea butonului Save Picture. Imaginea va fi salvată în format png și va avea rezoluția imaginii asupra căreia s-a realizat decriptarea.

Se poate observa că imaginea obținută nu are aceeași calitate ca imaginea originală însă majoritatea detaliilor si-au păstrat lizibilitatea.

Exemple de criptări – decriptări folosind diferite numere de biți:

Imaginea originala:

Criptare – decriptare pe 1 bit:

Criptare – decriptare pe 2 biți:

Criptare – decriptare pe 3 biți:

Imaginea ce se dorește a fi ascunsă poate conține:

una sau mai multe imagini;

harți;

text;

schițe etc.

Important este că în cazul criptării unei imagini cu detalii de dimensiuni mici cu contrast mare (text, harți, schițe) ce se doresc a fi lizibile după decriptare se recomandă utilizarea ca imagine de baza a unei imagini cu cât mai multe detalii, pentru ca aceste detalii să nu devină parțial vizibile în imaginea obținută în urma criptării.

Astfel în următoarea imagine, datorita faptului ca imaginea de bază conține zone de culori deschise și foarte apropiate, criptarea unei imagini ce conține text este în mare parte inutilă deoarece acesta va fi vizibil în imaginea criptată datorită diferenței mari de contrast dintre cele 2 imagini. De asemenea se poate observa faptul ca scrisul nu este la fel de lizibil pe zona cu munți așa cum este pe cer.

Exemplu:

Din aceasta cauză se recomandă utilizarea unor imagini de bază cât mai colorate și cât mai complexe din punct de vedere al detaliilor conținute.

Capitolul 4. Dezvoltări ulterioare și concluzii

4.1. Concluzii

Considerând atât funcționalitățile celor 2 aplicații cât și metoda inovativă utilizată, putem afirma că acestea reprezintă cu succes exemplificări ale aplicațiilor criptografiei în domeniul informatic.

Aplicațiile sunt simpliste, securitatea acestora fiind reprezentată doar de modul și locul de stocare și/sau instalare, însă faptul ce mărește securitatea criptării informațiilor este reprezentat de „elementul surpriză”. Aceasta însemnând că, un adversar se va aștepta la texte criptate în mod binar sau lingvistic cu algoritmi mai mult sau mai puțin cunoscuți, însă niciodată nu se va aștepta la criptarea în interiorul unei imagini. Astfel, pentru a disimula o interceptare a unui transfer de date se pot folosi imagini combinate cu text, atrăgând astfel mai mult atenția asupra textului decât a imaginii în sine.

4.2. Dezvoltări ulterioare

Dezvoltările ulterioare presupun în mare parte mărirea gradului de securitate al sistemului de criptare – decriptare.

În primul rând se recomandă ca o primă dezvoltare securizarea accesului la aplicații prin implementarea unui sistem de autentificare pe bază de conturi cu nume de utilizator și parole, sau doar pur și simplu pe baza unei parole cunoscute de una sau mai multe persoane. Acest lucru va limita accesul la aplicații în cazul în care securitatea calculatorului pe care este stocată/instalată aplicația a fost compromisă.

O altă posibilitate de dezvoltare este mărirea complexității algoritmului de criptare. În acest sens se oferă următoarele sugestii:

criptarea numărului de biți utilizat pentru criptare cu ajutorul unei funcții de tip hash cum ar fi MD5[19], transformarea acestuia în format binar și înglobarea în imagine în cadrul mai multor biți

folosirea unui număr mai mare de biți pentru exprimarea fiecărei culori din RGB, respectiv pixel. Se pot utiliza 12 sau 16 biți (Anexa 5)

folosirea unui algoritm simetric de criptare a numerelor din formatul RGB

Anexa 1 – Abrevieri utilizate

Anexa 2 – Arhitectura platformei .NET

Anexa 3 – Cuvinte cheie în C#

Anexa 4 – Tipuri de date în C#,

Anexa 5 – Culori în 8, 12, 16 biți

Bibliografie

http://ro.wikipedia.org/wiki/Cifrul_Cezar.

http://en.wikipedia.org/wiki/Scytale

http://www.sepln.org/revistaSEPLN/revista/26/vlad.pdf

http://planetcalc.com/2468/

http://www.itu.int/ITU-D/ict/statistics/ict/

http://ro.wikipedia.org/wiki/Data_Encryption_Standard

http://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm

http://en.wikipedia.org/wiki/Clipper_chip

http://www.cs.rutgers.edu/~tdnguyen/classes/cs671/presentations/Arvind-NEWDIRS.pdf

http://en.wikipedia.org/wiki/ElGamal_encryption

http://en.wikipedia.org/wiki/Skipjack_(cipher)

http://ro.wikipedia.org/wiki/Windows_API

https://msdn.microsoft.com/en-us/library/vstudio/dd831853(v=vs.100)

http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_.NET_.282002.29

http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is-included-in-what-version-of-the-os.aspx

http://www.c-sharpcorner.com/uploadfile/prvn_131971/chapter-1-introducing-Asp-Net/

http://en.wikipedia.org/wiki/Intelligent_code_completion

http://en.wikipedia.org/wiki/WoW64

https://ro.wikipedia.org/wiki/MD5

Similar Posts