Criptosisteme Clasice

Lista abrevierilor

DES – Data Encryption Standard;

SEAL – Software-oplimised Encryption /llgorithm;

ECB – Electronic Code Book;

CBC – Cipher Block Chaining;

CFB – Cipher Feed Back;

OFB – Output Feedback Mode;

MIC – Message Integrity Check;

MDC – Manipulation Detection Code;

VCL – Visual Component Library;

GDI – Graphics Device Interface;

GUI – Graphical User Interface;

Introducere

Teza prezintă un studiu asupra algoritmilor de criptare si utilizarea acestra in securizarea datelor. Aici sunt descri doar cîțiva algoritmi printre care cei mai populari și mai utilizați .

În toate timpurile informația, fie ea religioasă, militară sau economică, a insemnat o putere enormă, prin urmare a aparut dorința de a o proteja, de a o face accesibilă doar unor grupuri specifice, a fost din cele mai vechi timpuri. Printre primele civilizații în care au fost descoperite texte cifrate se numără Egiptul Antic acestea datează de circa 4000 de ani, dar existența acestora poate fi chiar de la apariția scrierii în toate civilizațiile umane.

De o importanță nemaipomenită la dezvoltarea criptologiei este contribuția arabă,si anume David Kahn,unul din cei mai de importanță istoriografi ai domeniului, el evidenția în a sa cartea The Codebreakers că, defapt criptologia își are originea în lumea arabă.

Dezvoltările criptanalizei au fost susținute de studiile lingvistice ale limbii arabe, limba oficială unificatoare pentru un imperiu de o uriașă întindere. Arabii au preluat și au dezvoltat cunoștințele matematice ale marelor civilizațiilor grecești și indiene.

Dezvoltare sau recesiunea criptografiei / criptologiei conchide cu evoluția marilor imperii și civilizații. Ea nu apare și nu se dezvoltă decat acolo unde puterea trebuie protejata, drept urmare, apariția telegrafului și a radioului in secolul al XIX-lea precum și cele două războaie mondiale din secolul XX au fost stimulente puternice in dezvoltarea metodelor și tehnicilor de criptare.

Apariția și dezvoltarea continuă a utilizării calculatoarelor in practic toate domeniile de activitate, existenta și evoluția puternică a rețelelor teleinformatice la nivel național, globalizarea

comunicațiilor, existenta unor baze de date puternice, apariția și dezvoltarea comerțului electronic, a poștei electronice, constituie premisele societății informatice în care pășim. Toate acestea indică o creștere extraordinară a volumului și importanței datelor transmise sau stocate și implicit a vulnerabilității acestora. Protecția în aceste sisteme vizează:

eliminarea posibiltăților de distrugere voită sau accidentală.

asigurarea caracterului secret al comunicării pentru a preveni posibilitatea ca persoane neautorizate să extragă informații în sistem.

în situații cum ar fi transferurile electronice de fonduri , negocierile contractuale, este importantă existența unei semnături electronice pentru a evita dispute intre emițător și receptor cu privire la mesajul transmis.

Toate aceste obiective arată o lărgire puternică a domeniului de aplicare al criptografiei de la

domeniul diplomatic, militar, politic, la cel cu caracter economic și social. La ora actuală, 99% nu este utilizată pentru protejarea secretelor militare ci pentru carduri bancare, plăți de taxe radio/TV, taxe de drumuri, acces autorizat in clădiri sau la calculatoare, terminale de loterie, instrumente electronice de plăți anticipate. In aceste aplicații rolul criptografiei este de a face furturile dacă nu imposibil cel puțin mai greu de realizat.

Momentul istoric în care criptografia a devenit științific ramură individualizată a matematicii, a fost în anul 1949 când a fost publicat articolul "Communication Theory of Secrecy Systems". Această lucrare a pus bazele criptosistemelor simetrice.

Rolul criptografiei moderne este de a asigura prin mijloace matematice specifice, atât în teorie cât și în practică, cele patru caracteristici fundamentale ale informației: confidențialitatea, integritatea, autenticitatea și non-repudierea.

Criptografia modernă utilizează în principiu aceeași algoritmi ca și criptografia tradițională (transpoziția și substituția), dar accentul cade pe complexitatea algoritmilor. Obiectivul criptografic din actuala perioadă este de a concepe algoritmi de criptare atât de complecși și de ireversibili încât chiar și în situația în care atacatorul (sau criptanalistul) având la dispoziție cantități mari de text criptat la alegerea sa, el să nu poată face nimic fără cheia secretă.

În criptografia modernă un sistem criptografic (criptosistem) este definit ca o structură cu cinci componente:

P = { t / t T* } care este spațiul textelor în clar, scrise pentru un alfabet nevid T (în mod obișnuit T={0,1})

K spațiul cheilor de criptare, kK

Familia funcțiilor de criptare dependentă de chei și de un algoritm de criptare E

Ek : P C , Ek = {ek / ek(t)=w și ek este injectivă}

Familia funcțiilor de decriptare dependentă de chei și de un algoritm de decriptare D

Dk : C P , Dk = { dk / dk(ek( t )) = t t P }

C spațiul mesajelor cu text criptat unde:

C={ w / k K, aP, w = Ek(a) }

Importanța cripatării informației este evidentă de utilizare în tot mai multe domenii a legăturilor secretizate comunicații militare, comunicații le serviciilor speciale, comunicațiile guvernamentale, comunicațiile diplomatice, comunicațiile din mediile financiar-bancare, comunicațiile agenților economici, televiziunile companiilor private etc.

Comunicațiile protejate au scop de păstrarea confidențialitații informaționale și a caracterului secret atât politico-diplomatic cât și economico-financiar.

Cheia de criptare este o informație sau o secvență de caractere prin care se controlează cifrarea și descifrare a mesajului.

Cheie simetrică  este atât expeditorul cât și destinatarul folosesc aceeași cheie de criptare.

Cheie asimetrică – expeditorul și destinatarul folosesc chei de criptare diferite.

Cifrarea este o transformare criptografică a unor caractere sau biți.

Criptograma sau textul cifrat reprezintă un mesaj neinteligibil.

Codurile sunt o transformare care operează la nivelul cuvintelor sau frazelor.

Criptosistem – o mulțime de algoritmi necesari pentru a implementa o criptare sau o decriptare.

Criptanaliza este actul obținerii textului clar sau a cheii din textul cifrat, care este folosit pentru obținerea informațiilor necesare acestui scop.

Criptarea înseamnă realizarea formei neinteligibile a unui mesaj pentru ca acesta să nu fie utilizat de persoanele neautorizate să-l acceseze.

Criptarea înlănțuită – mesajul circulă prin mai multe noduri între expeditor și destinatar. Un nod intermediar primește mesajul, îl decriptează cu aceeași cheie cu care a fost cripta, îl recriptează cu o altă cheie și îl trimite la următorul nod unde procesul se repetă până când mesajul ajunge la destinatar.

Criptografia este arta și știința ascunderii semnificației unei comunicări împotriva unor interceptări neautorizate. Cuvântul vine din limba greacă, care înseamnă scriere ascunsă: kryptos graphein.

Criptologia reunește criptografia și criptanaliza.

Decriptarea este procesul prin care un text cifrat este transformat într-un mesaj inteligibil.

Sistemul de criptare este un set de transformări din spațiul mesajului clar la cel al textului cifrat.

Steganografia este o formă de comunicare secretă prin care se încearcă ascunderea mesajului secret într-o imagine digitală.

Criptografie

Criptografia reprezintă o știință care utilizează matematica pentru securizare datelor, informațiilor și deasemenea autentificarea și restricționarea accesului în sistemele informaționale.

Termenul criptografie este compus din cuvintele de origine greacă κρυπτός kryptos (ascuns) și yράφειν grafein (a scrie).

Criptologia este considerată ca fiind cu adevărat o știință de foarte puțin timp.Aceasta cuprinde atât criptografia – scrierea secretizată – cât și criptanaliza. De asemenea, criptologia reprezintă nu numai o artă veche, ci și o știința nouă: veche pentru că Iulius Cezar a utilizat-o deja, dar nouă pentru că a devenit o temă de cercetare academicoștiințfică abia incepand cu anii 1970 . Această disciplină este legată de multe altele, de exemplu de teoria numerelor, algebră, teoria complexității, informatică.

I.1. Istoria Criptografiei

Scytalul din Grecia Antică, probabil, a fost unul din cele mai vechi dispozitive de implementare a unui cifru.

Înainte de epoca modernă, criptografia se ocupa doar cu asigurarea confidențialității mesajelor (criptare) — conversia de mesaje dintr-o formă comprehensibilă într-una incomprehensibilă, și inversul acestui proces, pentru a face mesajul imposibil de înțeles pentru cei care interceptează mesajul și nu au cunoștințe secrete adiționale (anume cheia necesară pentru decriptarea mesajului). În ultimele decenii, domeniul s-a extins dincolo de problemele de confidențialitate și include, printre altele, și tehnici de verificare a integrității mesajului, autentificare a trimițătorului și receptorului, semnătură electronică, calcule securizate.

Cele mai vechi forme de scriere secretizată necesitau doar puțin mai mult decat hartie și creion (sau unelte similare acestora), întrucat majoritatea oamenilor nu știau să citească. Creșterea alfabetizării a necesitat creșterea complexității criptografiei. Principalele tipuri clasice de cifruri sunt cifrurile cu transpoziție, care modifică ordinea literelor dintr-un mesaj (de exemplu „ajutor” devine „ojartu” intr-o schemă trivială de rearanjare), și cifrurile cu substituție, care inlocuiesc sistematic litere sau grupuri de litere cu alte litere și grupuri de litere (de exemplu, „conexiune” devine „dpofyjvof” înlocuind fiecare literă cu următoarea din alfabet). Versiuni simple ale celor două tipuri de cifruri ofereau un grad mic de confidențialitate în cazul oponenților instruiți. Unul din primele cifruri cu substitutie a fost Cifrul lui Cezar, în care fiecare literă din textul clar era înlocuită cu o literă aflată la un număr fix de poziții distanță de ea în alfabet. Cifrul a fost denumit astfel după Iulius Cezar despre care se spune că l-a folosit, cu o deplasare de 3, în comunicația cu generalii săi in timpul campaniilor militare.

Criptarea încearcă să asigure secretul comunicațiilor cum sunt cele intre spioni, lideri militari, și diplomați, dar a avut și aplicații religioase. De exemplu, vechii creștini foloseau criptografia pentru a ascunde unele aspecte ale scrierilor lor religioase pentru a evita persecuțiile ce i-ar fi așteptat dacă ar fi fost mai puțin atenți; numărul 666 sau, în unele manuscrise mai vechi, 616, Numărul fiarei din Apocalipsă, este uneori considerat a fi o referință la împăratul roman Nero, ale cărui politici includeau persecuția creștinilor. Există și referințe, chiar mai vechi, la anumite cifruri evreiești .Steganografia (ascunderea existenței mesajului) a fost și ea dezvoltată in antichitate. Unul din primele exemple, de la Herodot, implica ascunderea unui mesaj tatuat pe capul unui sclav ras – sub părul crescut după tatuare. Exemple mai moderne de steganografie includ utilizarea de cerneală învizibilă, micropuncte și watermarking digital.

Textele cifrate produse de cifrurile clasice (și de unele moderne) dezvăluie informații statistice despre textul clar, care pot fi adesea folosite pentru spargerea acestora. După descoperirea analizei frecvenței (poate de către înțeleptul arab al-Kindi) in preajma secolului al IX-lea, aproape toate aceste cifruri au devenit mai mult sau mai puțin ușor de spart de un atacator informat. Astfel de cifruri clasice încă se bucură astăzi de popularitate, deși mai ales ca jocuri. Aproape toate cifrurile răman vulnerabile la această tehnică de criptanaliză pană la inventarea cifrurilor polialfabetice, de către Leon Battista Alberti in preajma anului 1467 (deși se pare că acesta era cunoscut inainte și de arabi). Inovația lui Alberti a constat in folosirea de cifruri diferite pe părți diferite ale mesajului (la limită, pentru fiecare literă diferită). El a inventat și ceea ce a fost poate primul dispozitiv autinat de cifrare, o roată ce implementa o realizare parțială a invenției sale. În cifrul polialfabetic Vigenere, criptarea se bazează pe un cuvant cheie, care controlează substituția în funcție de ce literă a cuvantului cheie se folosește. La jumătatea anilor 1800, Charles Babbage a arătat că cifrurile polialfabetice de acest tip răman vulnerabile la tehnicile de analiză a frecvenței.

Mașina Enigma, folosită in cateva variante de armata germană după anii 1920 și pană la sfarșitul celui de-al doilea război mondial, implementa un cifru polialfabetic electromecanic complex pentru a proteja comunicațiile sensibile. Spargerea codurilor mașinii Enigma de către Biuro Szyfrow, și, ulterior, decriptarea pe scară largă a traficului Enigma la Bletchley Park, a fost un important factor ce a contribuit la victoria Aliaților în război.

Deși analiza frecvenței este o tehnică puternică și generală, criptarea a rămas adesea eficientă în practică; mulți criptanaliști amatori nu stăpanesc această tehnică. Spargerea unui mesaj fără analiza frecvenței necesita cunoașterea cifrului folosit, ceea ce însemna că spargerea acestuia necesita spionaj, mită, dezertări. În cele din urmă, în secolul al XIX-lea, s-a recunoscut explicit că secretul algoritmului unui cifru nu oferă multă siguranță; de fapt, s-a constatat chiar că orice schemă criptografică adecvată (inclusiv cifrurile) trebuie să rămană sigure chiar și dacă adversarul cunoaște perfect algoritmul de cifrare. Secretul cheii ar trebui astfel să fie suficient pentru ca un bun cifru să-și păstreze confidențialitatea în caz de atac. Acest principiu fundamental a fost enunțat explicit în 1883 de Auguste Kerckhoffs și este in general numit Principiul lui Kerckhoffs; el a fost reenunțat mai succint și mai direct de Claude Shannon ca Maxima lui Shannon— „Inamicul cunoaște sistemul”.

Diferite dispozitive fizice au fost folosite pentru a ajuta lucrul cu cifrurile. Una din primele modalități a fost scytalul din Grecia antică, un sul folosit probabil de spartani ca ajutor la criptarea și decriptarea cu un cifru cu transpoziție. În epoca medievală, au fost inventate și alte unelte, cum ar fi grila de cifru, folosită și pentru un fel de steganografie. Inventarea cifrurilor polialfabetice, a declanșat inventarea unor unelte mai sofisticate, cum ar fi discul lui Alberti, schema cu tabula recta a lui Johannes Trithemius, și multicilindrul lui Thomas Jefferson (reinventat independent de Etienne Bazeries pe la 1900). Unele aparate mecanice de criptare/decriptare au fost inventate la inceputul secolului al XX-lea, printre care s-au numărat mașinile rotitoare — cea mai celebră fiind mașina Enigma folosită de Germania in al doilea război mondial. Cifrurile implementate de mașini similare dar îmbunătățite au adus o creștere a dificultății criptanalizei după al doilea război mondial.

Dezvoltarea electronicii și a calculatoarelor numerice după al doilea război mondial au făcut posibile cifruri mult mai complexe. Mai mult, calculatoarele au permis criptarea oricărui fel de date reprezentate de calculator în format binar, spre deosebire de cifrurile clasice care criptau doar texte în limbaj scris, dizolvand utilitatea abordării lingvistice a criptanalizei în multe cazuri. Multe cifruri informatice pot fi caracterizate prin operarea pe secvențe de biți (uneori pe grupuri sau blocuri), spre deosebire de schemele clasice și mecanice, care manevrează caractere tradiționale (litere și cifre) direct. Totuși, calculatoarele au ajutat și criptanaliștii, ceea ce a compensat pană la un punct creșterea complexității cifrurilor. Cu toate acestea, cifrurile moderne bune au rămas cu un pas inaintea criptanalizei; este cazul de obicei ca utilizarea unui cifru de calitate să fie foarte eficientă (rapidă și puțin costisitoare in ce privește resursele), in timp ce spargerea cifrului să necesite un efort cu multe ordine de mărime mai mare, făcând criptanaliza atât de ineficientă și nepractică incât a devenit efectiv imposibilă.

O carte de credit cu capabilități de smart card. Cipul de 3 pe 5 mm montat în card este arătat mărit. Smart cardurile încearcă să combine portabilitatea cu puterea de calcul în lucrul cu

algoritmi criptografici moderni.

Cercetările academice deschise desfășurate în domeniul criptografiei sunt relativ recente — au inceput doar la jumătatea anilor 1970 cu specificațiile publice ale DES (Data Encryption Standard) la NBS, lucrarea Diffie-Hellman, și publicarea algoritmului RSA. De atunci, criptografia a devenit o unealtă folosită pe scară largă în comunicații, rețele de calculatoare, și în

securitatea informatică in general. Nivelul prezent de securitate al multor tehnici criptografice moderne se bazează pe dificultatea unor anumite probleme computaționale, cum ar fi problema factorizării întregilor sau a calculului logaritmilor discreți. În multe cazuri, există demonstrații matematice care arată că unele tehnici criptografice sunt sigure dacă o anumită problemă computațională nu poate fi rezolvată eficient.

Proiectanții de sisteme și algoritmi criptografici, pe langă cunoașterea istoriei criptografiei, trebuie să ia în considerație în dezvoltarea proiectelor lor și posibilele dezvoltări ulterioare. De exemplu, îmbunătățirile continue în puterea de calcul a calculatoarelor au mărit gradul de acoperire al atacurilor cu forța brută la specificarea lungimii cheilor. Efectele potențiale ale calculatoarelor cuantice sunt deja luate în calcul de unii proiectanți de sisteme criptografice; iminența anunțată a implementării acestor mașini face aceste precauții necesare.

În principal, pană la inceputul secolului al XX-lea, criptografia s-a ocupat mai ales de șabloane lingvistice. De atunci, accentul s-a mutat pe folosirea extensivă a matematicii, inclusiv a aspectelor de teoria informației, complexitatea algoritmilor, statistică, combinatorică, algebră abstractă și teoria numerelor. Criptografia este și o ramura a ingineriei, dar una neobișnuită, întrucât se ocupă de opoziția activă, inteligentă și răuvoitoare; majoritatea celorlalte ramuri ale ingineriei se ocupă doar de forțe naturale neutre. Se fac cercetări și în examinarea relațiilor dintre problemele criptografice și fizica cuantică.

I.2 Tipuri de Criptosisteme

O cale de clasificare a criptosistemelor este in funcție de modul în care folosită cheia de criptare/decriptare, astfel distingem 2 tipuri de sisteme criptografice :

Cu cheie simetrica unde se folosește aceeași cheie pentru ambele proceduri, criptare și decriptare. Aceste sisteme sunt numite uneori criptosisteme cu cheie privată, deorece cheia trebuie folosită pentru doar de părțile comunicante vom avea k=k’.

Cu cheie publică se utilizează 2 chei diferite de criptare /decriptare. Aceste criptosisteme mai sunt numite criptosisteme asimetrice. Cheile folosite se numesc chei asimetrice si vom avea în vedere k≠k’.

Criptosistemele de tip simetric se împart în 2 categorii ,în funcție de modul în care se face criptarea.

Criptosisteme de tip stream .

Criptosisteme de tip block.

Criptarea de tip stream presupune generarea unei secvențe de biti cu o înfățișare cît de aleatoare posibil pe baza unei chei. Secvența de biți este deci obținută on urma criptării bit cu bit a textului în clar (biții textului în clar sunt adunați cu cei ai cheii). Este esențial pentru criptările de tip stream ca două mesaje să nu fie criptate cu același stream al cheii de criptare, în acest sens se iau măsuri speciale. Exemple de algoritmi de tip stream: SEAL, KC4, A5, Leviathan, Sober.

Algoritmii de tip block presupun împărțirea textului în clar in blocuri de biți care sunt criptate, aceasta facându-se în mai multe runde. Majoritatea algoritmilor cu cheie simetrică sunt de tip block cipher și folosesc diferite metode pentru a opera criptarea textului.

modul ECB presupune criptarea fiecărui bloc separat și independent de celelalte.

modurile CBC și CFB presupun dependențe între blocurile criptate la runda anterioară și cele de la runda curentă în funcție de un vector de inițializare.

modul OFB poate fi interpretat că folosește o cifrare de tip block pentru a genera un stream care este apoi adunat bit cu bit cu textul în clar.

Unii dintre algoritmi, spre exemplu DES folosesc S-box-uri sau tabele, denumite și Substitution-box, pentru a obține textul criptat, folosirea numelui de substituție este mai degrabă nepotrivită din moment ce o astfel de "cutie" poate avea mai multe intrări decît ieșiri sau mai multe ieșiri decît intrări. Un exemplu de S-box poate ti transformarea identică (0 — 0,1 — 1,2 — 2,,..) care în mod evident nu are nici un efect, în timp ce alte tipuri de transformări au anumite efecte, cantitatea si calitatea fiind diferite pentru fiecare. Efectele cel mai des menționate includ pe cel de avalanșă și nonliniaritatea funcției Booleene. Desigur este de așteptat ca structuri de cifrare diferite să dispună de caracteristici diferite ale tabelelor, de aceea discuții despre puterea S-box-urilor apar de fiecare dată la construirea unui nou cifru.

Avalanșa este o proprietate a algoritmilor de tip block construiți în mai multe runde. respectând o mică schimbare a datelor de intrare. Schimbarea unu» singur bit produce după o rundă multiple schimbări la nivel de bit. mai multe schimbări se produc după încă o rundă, până când on cele din urmă aproximativ jumătate din bloc va fi schimbat, aceasta ca o analogie cu o avalanșă naturala unde un mic efect inițial produce un rezultat mai mare.

"Pe măsura ce datele de intrare trec prin straturi succesive, modelul care produce cifra 1 este amplificat si rezultă o avalanșă imprevizibdă. la final, rezultatul va conține, in medie, jumate cifre 0 și jumate cifre 7… "

Feistel, H. 1973. Cryptography and Computer Privacy. Scientific American.

Din punct de vedere matematic, în criptografia cu cheie publică , fiecare entitate participantăla transmisia și recepția de mesaje are o cheie personală k = {pk, sk) care este formată din două părți, pk este cheia publică sau cheia de criptare și este cunoscută tuturor celor care vor să trimită mesaje deținătorului cheii sk. Cheia sk este ținută secretă și va fi folosităde către cel ce o deține pentru a decripta mesajele care îi sunt trimise. Să presupunem că Alice dorește sг oi trimitг un mesaj lui Bob, atunci ca va obține de la el, sau o terță persoană de încredere, cheia lui publică, va cripta mesajul CU cheia lui Bob, pk, și il va trimite.

E(pt,pk)=st

Bob va folosi cheia sa secretă sk pentru a decripta și citi mesajul, avem deci:

D(E(pt,pk),sk)=pt

Criptarea cu cheie publică are nevoie de calcule complexe și este mai puțin eficientă decât criptarea cu cheie simetrică, astfel criptările simetrice sunt folosite pentru volume mari de date. înainte ca Alice si Bob să comunice, știind că au un volum mare de informații pe care vor să-I transmită ei vor fi nevoiți să schimbe o cheie simetrică pe un canal sigur, pentru aceasta criptarea cu chei publice este ideală. Acest tip de criptare mai este cunoscut și ca funcție one-way cu trapdoor deoarece oricine poate foarte ușor folosi cheia publică pk pentru a cripta un mesaj, insă numai cel ce deține cheia privată sk îl poate decripta.

O funcție one-wai/ cu trapdoor este o funcție f{x) = y pentru care y este foarte 'ușor de calculat'dar având pe y și cunoscând funcția f este greu de calculat x. Cunoscând însă o informație secretă k (denumită cheie) si având pe y sau valoarea lui f(x) este foarte ușor să se calculeze x.

Un alt tip de funcție one-way este one-way hash function care mai are multe alte nume, printre care: funcție de compresie, funcție de contracție, message dlgest, fingerprint, oyptographic checksum, verificarea integrității mesajului MIC, și cod pentu detectarea manipulării mesajului MDC. Funcțiile de hash exista de mult timp în criptografie și fac parte din pilonii principali on construcția multor protocoale criptografice.

O funcție matematică sau de alta natura, care ia ca argument un șir de mărime variabila și întoarce ca rezultat un șir de mărime fixa denumit valoare hash se numește funcție de lutsh.

Ideea din spatele funcțiilor hash este aceea de a produce reprezentare exactă de mărime fixă a unor date de intrare ca apoi după ce datele au fost transmise printr-un canal de comunicație, la capătul la care se află destinatarul să se poată spune dacă datele au fost modificate de-a lungul canalului de comunicație. Acest lucru se poate face aplicând din nou funcția de hash datelor primite și compararea rezultatului cu cel obținut înaintea transmiterii.

O funcție de hash trebuie de asemenea să producă o valoare unică de ieșire pentru o singură valoare de intrare, adesea spunem că o funcție hash nu trebuie sa aibă coliziuni.

I.3 Semnătura Digitală

Semnăturile digitale sunt folosite în combinație cu metodele criptografiei cu cheie publică. La fel ca în viața obișnuită unde folosim semnătura olografă, semnăturile digitale trebuie să asigure non-repudierea, care este o trăsătură de bază on cazul în care spre exemplu se folosește o astfel de metodă pentru a semna contracte, sau alte acte oficiale. Să presupunem ca Alice vrea să semneze un contract pe care Bob i l-a propus, ea va aplica atunci algoritmul S, folosind cheia secretă tk pentru a obține semnătura S(sk.pt). La primirea semnăturii Bob va utiliza algoritmul V pentru a verifica semnătura V(pk,s,pt) =ok. Este de preferat a nu se semna întreg textul în clar ci numai valoarea rezultată în urma aplicării unei funcții hash asupra textului.

Un atac este o cale generala pe care un criptanatist o poate urma pentru a "sparge” sau descoperi secretele protejate de un cifru sau sistem criptografic. Atacurile nu sunt algoritmi precisi ci mai degrabă moduri de abordare pentru construirea unor algoritmi care să sțeargă un sistem criptografic.

I.4 Atac Criptografic

Atacurile criptografice pot beneficia de constrângeri informaționale care pot reduce strategiile de atac ce pot fi folosite, atacatorul dispune de unele din informațiile de mai jos și poate alege strategia care se potrivește cel mai bine informațiilor pe care le deține:

numai text criptal – atacatorul dispune numai de text criptat; adesea informațiile statistice rezultate din textul criptat pot oferi detalii care vor conduce la spargerea cifrului. Dacă o metodă criptograficг nu poate rezista acestui tip de atac este complet nesigură. Chiar dacă Eve nu poate folosi metode criptanalirice complicate Alice trebuie să presupună că Eve poate să intercepteze mesajele.

text în clar cunoscut – atacatorul dispune de un volum considerabil de text in clar și textul criptat corespunzător. La o primă vedere s-ar părea că un astfel de fapt e imposibil de realizat, însă spre exemplu ăn cazul unor mesaje cu format standard Eve poate cunoaște acest format.

text în clar definit – atacatorul poate trimite text în dar arbitrar si poate obține textul criptat corespunzător. Un text în clar bine ales poate dezvălui anumite detalii de înțeres pentru atacator. În acest caz se presupune că Eve are acces cel puțin o dată la mașina de criptare înainte de a putea criptanaliza sistemul.

text criptat definit – atacatorul poate trimite text criptat și apoi să obțină versiunea decriptată.

cheie aleasă – atacatorul poale specifica schimbări ale unui bit din cheie sau anumite relatii între cheile de criptare folosite.

cronometrare – atacatorul poate cronometra duratele operațiilor de criptare și poate folosi aceste informații pentru a afla detalii despre cheie sau datele criptate.

analiza greșelilor – atacatorul poate include greșeli arbitrare în mașinăria care execută criptarea și poate folosi aceste greșeli pentru a expune detalii despre cheia folosită la criptare.

I.5 Protocol Criptografic

Un protocol criptografic este o scrie bine definită ele puși care combina mu multe primitive criptografice, cum ,ar fi algoritmi de ariplare/decriptare, funcții hash, sau generatoare pseudo-aleatoare de numere, pentru îndeplinirea unei sarcini.

După cum se obișnuiește, într-un protocol esle necesar să existe cel putui două părți implicate. Pentru a întâii această afirmație considerăm o schemă pentru generarea unei semnături digitale. Mai întâi partea implicată trebuie să aplice o funcție de hash mesajului după care va folosi cheia privată pk pentru a semna valoarea hash obținută. Ambii pasi sunt efectuați de o singură persoană, astfel nu putem numi această operație un protocol criptografic.

Situații tipice de utilizare a protocoalelor criptografice sunt cele în care este nevoie să se facă o autentificare a utilizatorilor Abordarea tradițională este aceea dea avea cîte un nume de utilizator și o parolă pentru fiecare din părțile implicate. Dacă se procedează așa, atunci cînd Alice va dori o autentificare va trebui să trimită numele de utilizator și parola către Bob, nu este nevoie sa mai spunem că acest tip de autentificare este susceptibil atacului de tipul "man in the midlle' și anume Eve poate asculta comunicarea ăntre cei doi și poate afla numele de utilizator și parola lui Alice. Un simplu protocol de tip "challenge-and-response" poate rezolva cu succes problema expusă mai sus. Protocolul se bazează pe criptarea asimetrică și presupunem că Bob deține un set de "cereri" suficient de mare pentru a nu repeta aceeași cerere, în vreme ce Alice are o cheie k = (pk,sk) pentru a se identifica. Protocolul decurge dupa cum urmează:

Bob alege la întîmplare o cerere c pe care o trimite către Alice.

Alice semnează cererea c folosind cheia secreta sk si funcția S pentru semnătură.

S(sk,c) = s, apoi va trimite răspunsul s înapoi la Bob.

Bob va accepta răspunsul primit dacă funcția de verificare V va returna un mesaj afirmativ în urma verificării semnăturii V(pk,s,c) = ok.

Protocolul nu este totalmente sigur însă rezolvă problema unui atac da tipul man-in-the-middle, o asigură pe Alice că nimeni nu ii cunoaște cheia secretă sk, nici Bob, cel care verifică semnătura, iar Eve nu poate căpăta nici un fel de informație utilă in urma ascultării canalului de comunicație deoarece cererea c face parte dintr-o mulțime rezonabil de mare încît să nu se repete, și în plus cererea este aleasa aleator.

Criptosisteme Clasice

II.1 Cifrul Caesar

II.1.1 Descriere generală

Pentru a putea comunica informații private, oamenii au găsit adesea metode de la cele mai simple pînă la cele mai complexe .Pentru a face o astfel de metoda să funcționeze este nevoie ca partenerii de comunicații să se pună de acord asupra unei metode de secretizare a informației transmisă. Spre exemplu dacă un mesaj codificat ajunge la destinatar și acesta nu cunoaște o metodă prin care sa-l poată decodifica și citi informația care îi este transmisă, atunci mesajul ii este complet inutil. Una dintre formele cele mai simple de codificare a mesajelor despre care se spune că ar fi fost folosită de împăratul roman, Iulius Caesar. pentru a comunica cu generalii săi este deplasarea la dreapta sau stănga a alfabetului cu un număr de poziții, fiecare litera fiind transformată în litera anterior existentă pe pozția respectivă. în cazul de față se spune că Iulius Caesar folosea o deplasare cu 3 poziții la dreapta a alfabetului, producînd astfel o transformare care a fost foarte eficientă în vremea aceea deoarece foarte puțini dintre inamicii săi puteau citi sau scrie, fără să mai luam în calcul metodele criptanalitice. Presupunînd că Caesar ar fi avut un dușman care nu ar fi fost analfabet, acesta ar fi avut destul de puține șanse pentru a rezolva cifrul fiindcă din cîte se știe cele mai vechi metode criptare nalitice descoperite în care se relatează despre metoda analizei frecventei datează din jurul anului 1000 e.n. și au fost descoperite în lumea araba. În ciuda faptului că este un cifru relativ ușor de "spart" a supraviețuit o perioada destul de îndelungată, fiind folosit de armata rusă pînă în jurul anului 1915, aceasta refuzînd înlocuirea Iui cu alte metode mai complexe datorită faptului că soldații rusi nu puteau stăpîni foarte bine aceste metode. Desigur, criptanalistii germani si austrieci nu au întîmpinat dificultăți deosebite în descifrarea mesajelor secrete ale armatei ruse. O complicare a acestui cifru ar putea fi transformarea sa într-un cifru de tip substituție polialfabetică în care după criptarea unei litere alfabetul folosit să fie din nou deplasat cu un număr de poziții.

II.1.2 Descrierea matematică

Acest mod de criptare poate fi definit si reprezentat în aritmetica modulo n, transformînd mai întăi literele alfabetului în cifre după cum urmează:

A=0,B=1,….,Z=25

Fie a și b 2 numere intregi și n un numar intreg pozitiv.Atunci scriem

a≡b(mod n) dacă n|(b-a)

Fraza a≡ b(mod n) este numită conguență și va fi citită “a este congruent cu b in modulo n”,întregul n fiind numit modul.

Dacă vom divide pe a și b prin n, vom obține un cît și un rest ,unde restul va fi între de aici stabilim următoare relații

unde au valori cuprinse între , iar conform definițiilor

Pentru a defini codul lui Caesar vom considera cazul alfabetului englezesc care conține 26 de caractere și din acest motiv se va lucra în Z26.

Un sistem criptografic bazat pe deplasare îni Z26 este definită astfel:

P=C=K= Z26 Pentru 0≤ K≤25,definim:

=(x+K)mod 26

și

=(y-K)mod 26

Unde x,y ∈ ,și reprezintă în clar și y textul criptat.

II.2 Cifrul Afin

II.2.1 Descrierea generală

Cifrarea afină este un caz particular al cifrării prin substituție, fiind o cifrare monoalfabetică și simetrică. Acest tip de cifrare este vulnerabil la toate tipurile de atacuri care sunt posibile pentru cifrarea prin substituție precum și la alte tipuri de atacuri. Principala slăbiciune a cifrului constă în faptul că dacă atacatorul poate descoperi textul în clar a două caractere (prin analiza frecvenței, brute force, sau pur și simplu ghicind) poate apoi obține cheia rezolvînd un sistem de două ecuații cu două necunoscute.

În care fiecare literă într-un alfabet este mapat la echivalentul său numeric, criptate folosind o functie matematică simplă, și convertita înapoi intr-un text.

II.2.2 Descriere matematică

Funcția de criptare pentru o singură literă este:

E(x) = (ax+b)mod m

Unde modulus m este marimea alfabetului si a si b sunt cheile cifrului.

a trebuie sa fie ales ca sa fie relativ prima cu m si b este oricare numar mai mic decit m.

Functia de decriptare este:

D(x)= a-1(x-b)mod m

unde a-1 este inversa modular multiplicativa a lui a modulo m

Exemplu:

Pentru literele de la A la Z , ele vor avea urmatoarele valori:

II.3 Cifrare Vigenere

II.3.1 Descriere generală

Tehnica de criptare Vigenere este o tehnica polialfabetica,în sensul că, prin criptare, două sau mai multe caractere diferite ale textului inițial pot fi codificate folosind același caracter in textul criptat.

Pentru a cripta un text folosind aceasta metoda se alege mai întâi un alfabet, astfel încât toate caracterele conținute în textul inițial sa se afle printre caracterele alfabetului și apoi o parola formată din caractere ale alfabetului. Nu este necesar ca alfabetul ales sa conțina numai caracterele textului inițial.

În continuare este prezentat modul în care se realizează criptarea unui text folosind tehnica Vigenere.

Se observă că în cazul extinderii unei parole cu ea insași,tehnica de criptare Vigenere este similara cu criptarea lui Cezar pe grupuri de elemente.

Dacă parola inițiala are lungimea n și considerăm un număr strict pozitiv k < n, atunci, dacă extragem caracterele de pe pozițiile k, n + k, 2 · n + k, … etc. din textul inițial, se observă ca pentru criptarea lor s-a folosit același deplasament.

II.3.2 Descrierea matematica

Considerăm m un întreg pozitiv pentru care definim P = C = K =(Z26)m, iar pentru o cheie k = (, k2…..kn) funcțiile de criptare respectiv decriptareau următoarea formă :

(, .. ,) = Pi + Ki( mod26) = (x1 + k1,x2 + k2,…,xm + km)

și

(, .. ,) = Ci -Ki( mod26) = (y1 -k1,x2 – k2,…,xm – km)

II.4 Cifrarea Polybelius

II.4.1 Descriere generală

O altă metodă greaca a fost inventată de Polybius ( denumită astăzi “pătratul lui Polybius”). Literele alfabetului sunt așezate intr-un pătrat de dimensiune 5X5 , rândurile si coloanele sunt numerotate in așa fel încât fiecărei litere să ii corespundă o pereche (rând, coloană). Aceste perechi puteau fi transmise relativ simplu, chiar cu ajutorul torțelor, a semnalelor cu mîina sau a gesturilor.

Pătratul lui Polybius

Decriptarea consista in a mapa perechile de cifre înapoi la caracterele de la care s-a pornit. Acest sistem a fost primul care a redus mărimea mulțmii de simboluri putând fi considerat din acest punct de vedere strămoșul reprezentării binare a caracterelor specifica zilelor noastre.

Polybius nu a conceput inițial a dispozitivului său ca un cifru atât de mult ca un ajutor de telegrafie; el a sugerat simbolurile ar putea fi semnalate de către exploatație până perechi de seturi de torțe. Ea are, de asemenea, fost utilizate, în formă de "knock cod", pentru a semnala mesaje intre celulele din închisori prin apăsând numerele de pe conducte sau pereți. În acest formular se spune a fi fost folosite de către nihilist prizonierii de țarilor ruși, și, de asemenea, de prizonieri de război americane în războiul din Vietnam.

Într-adevăr, poate fi semnalat în mai multe moduri simple (lămpi intermitente, explozii de sunet, tobe, fum semnale) și este mult mai ușor de învățat decât codurile mai sofisticate, cum ar fi codul Morse. Cu toate acestea, de asemenea, este oarecum mai puțin eficient decât codurile mai complexe.

II.4.2 Descrierea matematică

Modelul matematic a acestui algoritm constă in faptul ca se crează o tabelă 5×5, și ea este umplută cu literele alfabetului. După introducerea mesajului fiecarei literă din mesaj este substituită cu așa numitele “coordonate” ,adica litera este sustituită cu poziția unde se află , poziția fiind reprezentată prin 2 cifire.Astfel ouput-ul reprezentînd o consicutivitate de cifre .

II.5 Cifrare PlayFair

II.5.1 Descriere Generală

Cifrul Playfair sau pătrat Playfair este o tehnica de manual de criptare simetrică și a fost primul literal cifrul substituție digraph. Sistemul a fost inventat în 1854 de către Charles Wheatstone, dar poartă numele Domnului Playfair care a promovat utilizarea cipher. Playfair este, astfel, în mod semnificativ mai greu pentru a rupe de la analiza de frecvență utilizate pentru simplu cifruri de substituție nu funcționează cu el. Analiza de frecvență pot fi întreprinse, dar pe cele 600 posibile digraphs, mai degrabă decât 26 de posibile monografiile. Analiza frecvenței digraphs este posibil, dar mult mai dificil – și, în general, necesită un mult mai mare cifrat pentru a fi utilă.

Cifrul Playfair sau patrat Playfair Este o tehnica de manual de criptare simetrică si un Fost primul cifrul literal substituție digraph. Sistemul o Fost inventat în 1854 de Charles Catre Wheatstone, Dar Poarta Ștampila Domnului Playfair îngrijire un cipher.The promovat utilizarea Playfair Este, astfel, în mod semnificativ mai Greu a scris o rupe de la analiza de Frecventa utilizate a scris simplu cifruri de substituție Nu Functioneaza cu el. Analiza de Frecventa pot fi întreprinse, Dar pe cele digraphs 600 posibile, mai degrabă Decât 26 de posibile monografiile. Analiza frecvenței digraphs Este Posibil, Dar Mult mai dificil – si, în general, Necesita ne Mult mai mare cifrat a scris o fi Utila.Pentru a cripta un mesaj, s-ar sparge mesajul în digraphs (grupuri de 2 litere), cum ar care, de exemplu, "HelloWorld" devine "EL LL OW SAU LD", si harta le pe tasta masă. Cele două litere ale digraph sunt considerate ca colțurile opuse ale unui dreptunghi în tabelul cheie. Notă poziția relativă colțurile dreptunghiului. Apoi se aplică următoarele 4 reguli, în ordine, fiecare pereche de scrisori în plaintext:

Dacă ambele litere sunt identice (sau doar o literă este stânga), se adaugă un "X", după prima literă. Cripta noua pereche și continua.

În cazul în care apar literele de pe același rând de tabel, să le înlocuiască cu scrisorileimediat dreptul respectiv lor (ambalaj în jurul la partea stângă a rândului în cazul în care un literă în perechea inițială era în partea dreaptă a rândului).

În cazul în care apar literele de pe aceeași coloană a tabelului, înlocuiți-le cu literele imediat sub respectiv (învelire pe la partea superioară a coloanei, dacă o literă în perechea inițială a fost de partea de jos a coloanei).

Dacă literele nu sunt pe același rând sau coloană, înlocuiți-le cu literele de pe respectiv dar la cealaltă pereche de colțuri ale dreptunghiului definit de către același rând pereche original. Ordinea este importantă – prima literă a perechii criptat este cea care se află pe același rând cu prima literă a perechii plaintext.

Pentru a decripta, utiliza Inverse (opus) din primele 3 reguli, iar al 4-lea ca este (în scădere orice în plus "X" s care nu au sens în mesajul finală atunci când ați terminat).

II.5.2 Descrierea matematică

Descriem în continuare modul de utilizare în cazul alfabetului latin compus din 26 litere.Literele alfabetului A- Z sunt trecute într-un careu de 5 x 5 (litera I fiind asimilat¸a literei J). Textul clar este preprocesat astfel încît acesta să fie compatibil cu matricea de cifrare: delimitatorul de cuvînt este ignorat sau este înlocuit cu cea mai puțin frecvența literă, litera I este asimilată cu litera J; și dacă este cazul, se adaugă o literă la text pentru a avea un număr par de digrame.Regula de cifrare este următoarea:

Dacă digrama care se dorește cifrată nu are literele pe aceeași linie sau coloană, atunci regula de cifrare este regula dreptunghiului, traseul fiind pe verticală de la cea de-a doua literă a digramei către prima literă. Sau, altfel spus, prima literă a perechii cifrate este aceea care se gaseste pe aceeasi linie cu prima litera a perechii în clar.

Dacă digrama ce se dorește cifrată are literele pe aceeași linie, atunci se aplică regula:cifrează la dreapta, descifrează la stînga.

Dacă digrama ce se dorește cifrată are literele pe aceeași coloană, atunci se aplică regula: cifrează în jos, descifrează în sus.

II.6 Securizarea datelor

Daca dorim sa accesam un cont de pe un server avem nevoie de o parola. Confidențialitatea mesajelor și a datelor transmise de la client la server și invers depinde de gradul de complexitate al metodei de criptare folosite de cele doua sisteme client, respectiv server și de complexitatea parolei alese.

Chiar daca se folosește o parola complexa, utilizarea unui cod unic de acces prezinta unele dezavantaje. In cazul in care parola este interceptata de anumite persoane, complexitatea sa nu mai are o importanța foarte mare. Cea mai sigură modalitate de acces la un server ar fi ca la fiecare accesare a contului sa se utilizeze o alta parolă. Acest tip de metode poarta numele de one time pass (parola folosita o singura data).

În cele ce urmeaza vom prezenta un exemplu de realizare a unui sistem ce se incadreaza in tipul one time pass.

În cazul parolelor care se folosesc o singură dată, trebuie utilizată o tehnică de criptare a datelor. De obicei, parolele sunt constituite din caractere imprimabile, deci alfabetul utilizat trebuie sa fie o submulțime a setului de caractere imprimabile din intregul set de caractere utilizat de calculator.

În general, daca dorim sa criptam un text T, ale cărui litere aparțin unui alfabet A, avem nevoie de:

funcție de criptare f definita pe mulțimea parților textului T;

parola sau cheie de criptare.

De obicei, caracterele din textul inițial și cel criptat aparțin aceluiași alfabet.

Dintr-un alfabet pot lipsi semnele obițnuite de punctuație și spațiile, cuvintele fiind scrise unul dupa altul, lucru care îngreunează foarte mult munca celui care incearca sa decripteze mesajul criptat in eventualitatea in care nu deține parola folosita in procesul de codificare a mesajului.

Textul inițial T și textul criptat C sunt împarțite in mai multe grupuri compuse din una, doua sau mai multe litere, in funcție de tehnica de criptare utilizata. În tehnicile prezentate anterior cele doua texte erau imparțite in grupuri de cate o singura litera, deoarece transformarile erau aplicate la un moment dat, asupra unui singur caracter din text. Funcția de criptare f este definita pe mulțimea tuturor grupurilor de litere care se formeaza din textul inițial, și, de obicei, este o funcție bijectiva. Inversa ei, f-1, se folosește pentru a decripta mesajul.

Fie fP funcția de criptare asociata parolei P. Pentru o parola indrodusa catre utilizator procesul de criptare este dat de formula fP(T) = C.

Pentru a decripta textul C, de obicei, se folosește funcția inversa fP1 asociata parolei P, și in procesul de decriptare se folosește formula fP -1(C) = T.Un sistem one time pass este un sistem in care conexiunea dintre client și server se face prin folosirea unui model one time pass. In cazul unui sistem one time pass se alege o parola inițiala P0 care este stocata pe server și un numar intreg strict pozitiv n suficient de mare. Numarul n poate sa aiba o valoare implicita, fara a mai necesita alegerea lui de catre utilizator. Funcția de criptare, pe care atat clientul cat și server-ul o aplica parolei P0, trebuie sa fie bijectiva, iar inversa ei trebuie sa fie foarte greu de calculat folosind procedee matematice.

Clientul deține, la randul sau, parola inițiala P0 și numărul n. Cand se realizează conexiunea dintre client și server, clientul aplică funcția de criptare f de n ori astfel:

Pi = f(Pi-1), i = 1, …, n.

Parola Pn care se obține este transmisa server-ului. La rândul său server-ul creează, utilizand același procedeu, propria sa parola Pn, și daca coincide cu cea pe care a trimis-o clientul se realizeaza conexiunea și numarul n este decrementat automat cu 1 atat pe stația server cat și pe stația client. In acest mod, la urmatoarea accesare a contului de pe server, se va folosi o alta parola.

Modelul one time pass presupune faptul ca toate cele n parole care se obțin prin aplicarea succesiva a funcției f, sunt distincte. In momentul in care s-au epuizat toate cele n parole distincte, trebuie inlocuita cheia (parola) P0.

Daca funcția f ar fi ușor inversabila, atunci, daca parola curenta este interceptata de o persoana neautorizata, prin aplicarea funcției f-1 se obține parola care va fi utilizata la urmatoarea accesare a contului de pe server. Funcția f trebuie aleasa astfel incat, chiar daca expresia sa intra in posesia unor persoane neautorizate, expresia funcției f-1 sa fie foarte greu de calculat.

III Borland Delphi

III.1 Scurt Istoric

DELPHI este un produs al companiei Borland International, fiind un compilator rapid care ruleaza sub Windows si oferind mijloace de programare vizuala similare celor de la Visual Basic sau Visual C++, plus o manipulare comoda a bazelor de date. Limbajul de baza este Object Pascal, o extensie a Pascal-ului orientat-obiect din implementarea Turbo Pascal incepind cu versiunea 5.5.

Borland ofera doua pachete:

DELPHI 

DELPHI Client/Server

ambele fiind lansate la inceputul anului 1995.

DELPHI este descendent al Turbo Pascal-ului care a fost prima data comercializat in 1983 pentru sistemul de operare CP/M. Turbo Pascal a fost portat apoi ( in 1984 ) pe MS-DOS si a reprezentat in timpul istoriei timpurii si mijlocii a calculatoarelor personale cel mai popular limbaj de dezvoltare de aplicatii serioase, aceasta deoarece Turbo Pascal ingloba alaturi de un real compilator eficace, si un editor de programe si depanator.

Dupa mai multe versiuni pentru DOS ( 4.0, 5.0, 5.5, 6.0 ), in 1990 apare Turbo Pascal pentru Windows. Ultima versiune cunoscuta sub denumirea de Borland Pascal ( multi-platforma: DOS, DOS in mod protejat, Windows ) este versiunea 7.0 ( la sfirsitul anului 1992 ).

Proiectarea mediului DELPHI a inceput in 1993 si pe data de 14 februarie 1995 a fost anuntata oficial aparitia si inceperea comercializarii primei versiunii DELPHI ( din 28 februarie acelasi an ). Curind va apare pe piata DELPHI 3.0.

Pentru implementarea aplicației Visual TLA am folosit prima versiune DELPHI, care genereaza cod executabil pe 16-biti pentru Windows 3.1 si pentru emulatoarele sale ( incluse in alte sisteme de operare ). DELPHI poate crea atit fisiere executabile de sine statatoare (.EXE), cit si biblioteci cu legare dinamica (.DLL).

Mediul de dezvoltare a unei aplicatii este un proiect DELPHI (.DPR). Acesta include toate meniurile, dialogurile, interfata de editare ( combinatiile de taste active si actiunile asociate lor ), interfata de depanare ( managementul punctelor de oprire, boxele de dialog de evaluare a expresiilor etc. ), proiectantul de forme ( form designer ), inspectorul proprietatilor si evenimentelor asociate unui obiect ( object inspector ). Cu alte cuvinte, partea vizuala a ceea ce reprezinta DELPHI este scrisa utilizind DELPHI. Baza este conceputa insa intr-un alt limbaj. De exemplu, compilatorul si editorul de legaturi sint scrise in limbaj de asamblare ( pastrindu-se aproape aceeasi tehnologie de compilare de la Turbo Pascal 4.0 ). Nucleul de depanare ( PASDBK16 ) si cel de editare ( DELPHIED si DELPHIKB ) sint scrise in C in comun cu echipa de programatori care lucreaza la BC++.

III.2 Clase in Delphi

VCL este un set de biblioteci din clase de componente (framework) bine proiectat. Ca majoritatea seturilor, design-ul frameworks VCL, folosește la maxim elementele “moștenite”. VCL este compusă din clase ce reprezintă componente Delphi. Există și clase VCL care nu sunt legate de componente. Aceste clase îndeplinesc funcții interne, se comportă asemănător claselor ajutătoare și furnizează câteva servicii de utilitate.

Ierarhia claselor VCL ce se ocupă de componente este complexă (Fig nr. Ierarhia claselor vcl). Din fericire nu trebuie să se cunoască toate detaliile VCL pentru a începe programarea în Delphi.

TObject este strămoșul tuturor claselor de componente VCL. Sub TObject se va găsi TPersistent. Această clasă se ocupă cu capacitatea unei componente de a se salva singură în fișiere și memorie, precum și cu alte detalii despre care utilizatorul nu trebuie să cunoască prea multe ca să poată programa în Delphi.

TComponent este o clasă de bază directă pentru componente. Ea furnizează functionalitatea pe care o necesită o componentă de bază. Componentele non-visuale derivă din această clasă. Componentele visuale derivă din TControl, care la rândul ei derivă din TComponent. TControl furnizează o functionalitate adițională pe care o necesită componentele visuale. Componentele individuale derivă fie din TGraphicControl, fie din TWinControl.

Când se plasează o componentă pe o formă, Delphi creează un pointer spre acea componentă în clasa de declarații ale formei, astfel încât se poate accesa componenta prin codul creat. Delphi folosește proprietatea Name a componentei pentru numele acelei variabile pointer. Când s-a creat aplicația, din exemplul anterior, s-a plasat o componenta Memo pe formă. În acel moment, Delphi a creat o variabilă TMemo și i-a dat numele Memo.

Analog, când s-a creat butonul pe formă, Delphi a creat o variabilă TButton ce reprezenta butonul. Inaintea variabilei, Delphi crease deja o clasa din TForm și bine-înțeles un exemplu al acestei clase care să reprezinte forma.

Înțelegerea claselor și componentelor VCL este necesară înainte de a lucra cu VCL. Cu toate că nu se vor trece în revistă toate clasele VCL, se vor prezenta cele mai importante.

III.2.1 Clase de forme și aplicații

Clasele de forme și aplicații reprezintă forme și obiectul Aplicație în VCL. Aceste clase derivă din TComponent și chiar sunt componente. Sunt explicate separat pentru a le diferenția de controalele ce se pun pe o formă.

Clasa TApplication această clasă încapsulează operațiile de bază ale unui program Windows. TApplication are responsabilități cum ar fi organizarea și controlul pictogramei aplicației, furnizând ajutor și manipulând mesaje. Orice aplicație în Delphi are un pointer spre obiectul TApplication, numit Application (Aplicație). TApplication se folosește în principiu pentru a executa controale de tip message box (căsuțe de mesaje), pentru a controla help-ul și pentru a da indicații text pentru butoane și bara de stare. TApplication este un fel de ciudățenie în VCL pentru că unele proprietăți pot fi setate prin pagina Application a căsuței de dialog Project Options.

Clasa Tform aceasta clasă încapsulează forme în VCL. Formele sunt folosite ca ferestre principale, căsuțe de dialog, ferestre secundare și orice alt fel de ferestre ce se pot imagina. Clasa TForm are aproximativ 60 de proprietăți, 45 de metode și 20 de evenimente.

III.2.2 Clase de componente

Componentele standard cuprind cele mai cunoscute controale Windows. Această clasă include: TButton, TEdit, TListBox, TMemo, TMainMenu, TScrollBar, TPopupMenu, TCheckBox, TRadioButton, TRadioGroup, TGroupBox, TPanel și TActionList.

Majoritatea acestor clase cuprind un control Windows. Clasa TMainMenu, de exemplu, cuprinde meniul principal al unei aplicații. In modul de lucru Design un dublu click pe pictograma MainMenu a componentei are ca efect apariția lui MenuDesigner (Editor de meniuri). TMainMenu are proprietăți ce controlează help-ul și altele fie că este selectat (bifat), fie că nu este activ (este trecut în gri). Fiecărui articol (element) din meniu îi corespunde un singur eveniment, OnClick, astfel încât se poate atașa un handler de evenimente elementului de meniu selectat.

În pagina Standard o componentă interesantă este componenta TPanel. Panel reprezintă o porțiune dreptunghiulară pe o formă. TPanel este o componentă container. Astfel, ea poate conține mai multe componente. Panel-urile au proprietăți ce controlează tipul de margini al acestora (ridicate, scufundate sau plate) și grosimea marginii. Prin combinația acestor proprietăți se poate crea o varietate de panel-uri 3D.

Componenta TActionList a fost introdusă începând cu versiunea Delphi 4.0. Ea poate fi folosită pentru a adăuga cu ușurintă comenzi unei componente sau unui grup de componente. De exemplu, o aplicație care folosește Clipboard-ul poate avea elemente de ștergere și copiere (cut, copy, paste) pe un meniu, pe bara de instrumente (toolbar) sau pe un meniu contextual. Dacă există date în Clipboard, butonul “Paste” și elementele din meniu ar trebui să fie active. Dacă nu există date în Clipboard, acestea vor fi inactive. Toate controalele pot fi activate/dezactivate în același timp folosind TActionList.

III.2.3 Componentele din lista Additional

Delphi are o altă grupă de componente care vor fi tratate tot la controalele standard. Aceste controale pot fi găsite sub lista Additional pe paleta Component. Clasele ce reprezintă aceste componente cuprind: TBitBtn, TSpeedButton, TMaskEdit, TStringGrid, TDrawGrid, TImage, TShape, TBevel, TScrollBox, TCheckListBox, TSplitter, TStaticText și TChart.

Butonul TSpeed este tot un buton cu imagine, dar de fapt această componentă nu este un buton adevărat. Este o reprezentare grafică a unui buton ceea ce permite să se folosească un număr mare de butoane de manevră și să nu se folosească resursele Windows pentru fiecare buton.

Componenta TImage oferă posibilitatea de a se plasa o imagine pe o formă care apoi poate fi selectată dintr-un fișier de pe disc.

Se poate folosi componenta TBevel pentru a se crea căsuțe și linii care sunt ridicate (bumps) sau coborâte (dips). Aceste suprafețe (bevel) pot fi folosite pentru a împărți o formă în regiuni și pentru a furniza o formă estetică.

Clasele TStringGrid și TDrawGrid oferă un mijloc de a prezenta informații într-un format tabelar.

III.2.4 Clase de controle obisnuite in Win 32

VCL are clase de componente ce cuprind multe din comenzile obișnuite Windows pe 32 bits. Aceste clase includ: TListView, TTreeView, TTrackBar, TProgressBar, TTabControl, TPageControl, TRichEdit, TImageList, TStatusBar, TAnimate, TDateTimePicker, TToolBar, TCoolBar și alte câteva. Unele din aceste controale sunt, prin natura lor, mai complicate iar clasele VCL care le reprezintă sunt și ele mai complicate. VCL-ul înlesnește lucru cu aceste controale.

iii.2.5 Clase de componente tip baza de date (Data Controls)

VCL are mai multe componente tip bază de date ce includ atât clase visuale, cât și non-visuale. Componenetele non-visuale cuprind: TDataSource, TDatabase, TTable și TQuery. Aceste clase încapsulează operații cu baze de date care nu se văd.

TDBGrid. Componenetele de tip bază de date visuale sunt acea parte a operațiilor VCL cu baze de date pe care utilizatorii le văd și cu care pot interacționa. De exemplu, componenta TDBGrid se comportă ca o interfață între utitlizator și baza de date. Prin TDBGrid utilizatorul poate vizualiza și modifica tabela bazei de date de pe disc.

Componenta TDBNavigator furnizează butoane ce permit utilizatorului să se miște în tabela bazei de date. Această clasă include butoane pentru înregistrarea precedentă, următoarea înregistrare, prima sau ultima înregistrare, butonul de acceptare a modificărilor, de respingere sau anulare a lor.

Alte componente ce lucrează cu bazele de date leagă controalele Windows de câmpurile bazelor de date. Aceste clase includ printre altele și TDBText, TDBEdit, TDBListBox și TDBImage.

QReport. Un grup de componente asociate, de obicei, programării bazelor de date este componenta QuickReport. Acest grup de componente înlesnește scrierea rapoartelor, în special dacă sursa este o bază de date.

III.2.6 Clase de dialog (Dialogs)

Windows are căsuțe de dialog obișnuite pentru deschiderea fișierelor, salvarea lor, alegerea font-ului și culorilor. VCL încapsulează aceste căsuțe de dialog în clase ce reprezintă fiecare tip. Clasele din această categorie sunt: TOpenDialog, TSaveDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TColorDialog, TPrintDialog și TPrinterSetupDialog. VCL adaugă la această grupă clasele: TFindDialog și TReplaceDialog. Toate componentele din această grupă sunt non-visuale. Căsuțele de dialog sunt vizibile atunci când sunt afișate în execuție.

III.2.7 Clase de componente System

Clasa TMediaPlayer este inclusă în grupa de componente system. Oferă posibilitatea să se execute fișiere media, cum ar fi cele: WAVE audio, AVI video și MIDI audio. Acestea pot fi executate, oprite permanent sau temporar, poziționate la un anumit punct al fișierului sau alte operații. Această clasă are multe proprietăți și evenimente ce simplifică lumea complexă a Windows Media Control Interface (MCI).

Componenta TPaintBox pune la dispoziția utilizatorului o “pânză” (foaie de lucru) goală pe care se poate desena ceea ce se dorește. Această componentă are multe funcțiuni potențiale.

Grupa System include și clasele OLE și DDE (schimb dinamic de date).

III.2.8 Clasele GDI

Clasele GDI sunt foarte utilizate în aplicațiile Windows GUI. Aceste clase includ folosirea bitmap-urilor, pensulelor, font-urilor, creioanelor. Prin intermediul acestor obiecte GDI sunt afișate imagini și texte în diferite ferestre. Clasele GDI nu sunt asociate unei componente specifice, dar multe componente au părți din aceste clase ca proprietăți. De exemplu, un control de editare are o proprietate numită Font care este o parte din clasa TFont.

Termenul de “device context” (“pânză”) este bine cunoscut de programatorii Windows tradițional. Cu toate acestea, termenul nu se prea folosește deoarece VCL-ul include aceste “pânze” în clasa TCanvas. VCL-ul folosește termenul de “pânză” pentru un device context. O “pânză” furnizează o suprafață pe care se poate desena cu ajutorul metodelor cum ar fi: MoveTo, LineTo și TextOut. Imaginile bitmap pot fi afișate pe o “pânză” folosind metodele Draw sau StretchDraw. Conceptul de “pânza” (canvas) pe care se desenează sună mai logic decât termenul arhaic de “device context”. Clasele GDI utilizator sunt:

Clasa TCanvas conține părți din alte clase GDI. De exemplu, când se execută o secvență de tipul Move To sau Line To, se desenează o linie având culoarea curentă selectată. Proprietatea Paint este folosită pentru a determina culoarea curentă și este o parte din clasa TPen. Această clasă are proprietăți ce determină tipul de linie: lățimea, stilul (continu, punctat, linie întreruptă etc).

Clasa Tbrush reprezintă o pensulă folosită pentru umplerea modelului de pe “pânză”, prin operații ca FillRect (umplere dreptunghiulară), Polygon (umplere poligonală), Ellipse (umplere în formă de elipsă). Proprietățile TBrush includ Color, Style și Bitmap. Proprietatea Style oferă posibilitatea alegerii unui model pentru pensulă (brush). Proprietatea Bitmap dă posibilitatea să se aleagă imaginea dorită pentru a umple modelul.

Clasa TBitmap încapsulează operații de tip bitmap în VCL. Proprietățile includ: Palette (paleta de culori), Height (înălțime), Width (lățime) și TransparentColor. Printre metode se numără: LoadFromFile, LoadFromResourceID și SaveToFile. TBitmap este folosită și de alte clase de componente. O parte din clasa TBitmap se mai poate folosi pe post de imagini “offscreen” ce îmbunătățesc performanțele grafice.

Clasa TFont se ocupă de operații cu fonturi. Proprietățile includ: Color, Height (înălțime), Style (bold, italic, normal și so on ). Clasa TFont este utilizată de toate clasele componente ce afișează text.

Concluzie

Bibliografie

T.ELGamal. A public key cryptosystem and a signature scheme based on discrete logarithms.IEEE Trans inf Theory ,vol 31(num 4) pag. 469-472,1985.

Claus-Peter Schnorr.Fast signature generation with a fiat Shamir like scheme.Advances in Cryptography,Springer-Verlag,pag.432-440,1991

http://profs.info.uaic.ro/~alaiba/mw/index.php?title=Borland_Delphi

http://193.230.235.141/carti/Informatica/programming/Curs%20delphi/

Anexă

Codul sursă:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, Grids;

type

TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;TabSheet2: TTabSheet;TabSheet3: TTabSheet; TabSheet4:TTabSheet;

Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel;

Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel;

Memo1: TMemo; Memo2: TMemo;Memo3: TMemo; Memo4: TMemo; Memo5: TMemo; Memo6: TMemo; Memo7: TMemo; Memo8: TMemo; Memo9: TMemo; memo10: TMemo;

Edit1: TEdit; Edit2: TEdit; Edit3: TEdit;Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit;

Button1: TButton; Button2: TButton; Button3: TButton;Button4: TButton;Button5: TButton;

Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel;

Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel;

StringGrid1: TStringGrid;StringGrid3: TStringGrid; StringGrid4: TstringGrid;

StringGrid2: TStringGrid; StringGrid5: TStringGrid;

TabSheet5: TTabSheet; TabSheet6: TTabSheet; TabSheet7: TTabSheet;

Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel;

Label25: TLabel; Label26: TLabel; Label27: TLabel; Label28: TLabel; Label29: TLabel;

Label30: TLabel; Label31: TLabel; Label32: TLabel; Label33: TLabel; Label34: TLabel;

Memo11: TMemo; Memo12: TMemo;

Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton;

Button10: TButton; Button11: TButton;

StringGrid6: TStringGrid; StringGrid7: TStringGrid;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var Form1: TForm1; const nr_lit=26; ALPHA:String = 'abcdefghijklmnopqrstuvwxyz ';

Type TTable = Array['A'..'Z',1..2] of Char;

Const NN=5;

Key:Array[1..5] of String[5] = ('TPALE','RCYSK','BQNID','UFMGX','JVHOZ');

implementation

{$R *.dfm}

function smalltobig(var1:string):string;

var i:integer;

begin

for i:=1 to length(var1) do

if (var1[i]>='a') and (var1[i]<='z') then

var1[i]:=chr(ord(var1[i])-32);

smalltobig:=var1;

end;

procedure TForm1.Button1Click(Sender: TObject);

var k,i,j:integer;

s:string;

begin

s := memo1.Text;

k := strtoint(edit1.Text);

for i:=1 to length(s) do

if s[i]<> ' ' then

if (s[i]<='Z') and (s[i]>='A') then

s[i] := chr((ord(s[i]) – ord('A') + k) mod nr_lit +ord('A'))

else if (s[i]<='z') and (s[i]>='a') then

s[i] := chr((ord(s[i]) – ord('a') + k) mod nr_lit +ord('a'));

memo2.Text:=s;

end;

procedure TForm1.Button3Click(Sender: TObject);

var k,i,j:integer; s:string;

begin

s := memo1.Text;

k := strtoint(edit1.Text);

for i:=1 to length(s) do

if s[i]<> ' ' then

if (s[i]<='Z') and (s[i]>='A') then

s[i] := chr((ord(s[i]) – ord('A') + nr_lit-k) mod nr_lit +ord('A'))

else if (s[i]<='z') and (s[i]>='a') then

s[i] := chr((ord(s[i]) – ord('a') + nr_lit-k) mod nr_lit +ord('a'));

memo2.Text:=s;

end;

procedure TForm1.Button2Click(Sender: TObject);

var i,j,k,rez:integer; s,s1,key,alf:string[nr_lit]; c:char; cond:boolean;

begin

for i:=0 to 25 do

alf[i+1]:=chr(ord('A')+i);

for i:=0 to 25 do

stringgrid1.Cells[i,0]:=inttostr(i);

for i:=0 to 25 do

stringgrid1.Cells[i,1]:=alf[i+1];

for i:=1 to nr_lit do

s1[i]:='*';

key:=smalltobig(edit3.Text);

k:=strtoint(edit2.Text);

i:=k+1; j:=1;

while j<=length(key) do

begin

s1[i]:=key[j];

i:=i+1; j:=j+1;

if i=nr_lit+1 then

i:=1;

end;

j:=i;

for c:='A' to 'Z' do

begin

cond:=true;

for i:=1 to nr_lit do

if s1[i]=c then cond:=false;

if cond then

begin

s1[j]:=c; j:=j+1;

end;

if j=nr_lit+1 then j:=1;

end;

for i:=0 to nr_lit-1 do

stringgrid1.Cells[i,2]:=s1[i+1];

s:=smalltobig(memo3.Lines.Text);

for i:=1 to length(s) do

begin

s[i]:=s1[ord(s[i])-ord('A')+1];

end;

memo4.Text:=s;

end;

///////–Vijener–///////////////////////////

Procedure MakeKey(s:String; k:Byte; var r:String);

Var i,n:Byte;

Begin

If Length(s) > k then

r := Copy(s, 1, k)

Else

Begin

n := (k div Length(s))+1;

For i:=1 to n do

r := r + s;

r := Copy(r, 1, k);

End;

End;

Procedure Encrypt_Vijiner(s,skey:String; var r:String);

Var i:Byte;

const nr_lit1=27;

Begin

r := '';

For i:=1 to Length(s) do

Begin

r := r + ALPHA[(Pos(s[i],ALPHA)+Pos(skey[i],ALPHA)-2) mod NR_LIT + 1];

End; End;

procedure TForm1.Button4Click(Sender: TObject);

var i,j,k:integer; s,key1,key,rez:string;

begin

for i:=0 to nr_lit-1 do

for j:=0 to nr_lit-1 do

begin

if i+j <=nr_lit-1 then k:=i+j

else k:=i+j-nr_lit;

stringgrid3.Cells[j,i]:=chr(ord('A')+k);

end;

s:=memo5.Lines.Text;

key1:=edit4.Text;

makekey(key1,length(s),key);

Encrypt_vijiner(s, key, rez);

memo6.Text:=rez;

edit5.Text:=key;

end;

///////–Rechelieu–///////////////////////////

procedure TForm1.Button5Click(Sender: TObject);

const Text:Array[1..7] of String =('i love you',

'i have you',

'deep under',

'my skin my',

'love lasts',

'forever in',

'hyperspace');

Key:Array[1..7,1..10] of Byte = ((0,0,0,0,0,0,0,1,0,0),

(0,0,0,0,0,0,0,0,1,0),

(0,0,0,0,0,1,0,0,0,0),

(0,0,0,0,1,1,0,0,0,0),

(1,0,0,0,0,1,1,0,1,0),

(0,1,0,0,0,0,0,0,0,1),

(0,0,0,0,0,0,0,0,1,1));

Var i,j:Byte;

begin

For i:=1 to 7 do

For j:=1 to 10 do

If Key[i,j] = 1 then

stringgrid4.Cells[j-1,i-1]:=Text[i][j];

For i:=1 to 7 do

For j:=1 to 10 do

stringgrid2.Cells[j-1,i-1]:=Text[i][j];

end;

///////////////// Afin \\\\\\\\\\\\\\\\\\\\\\

procedure TForm1.Button6Click(Sender: TObject);

var alfa1: string[26]; s,s1:string[250]; i,j,a,b:integer; nr1,nr2:array[1..26] of byte;

const alfa='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

begin

if (edit6.Text='') or (edit7.Text='') then

MessageDlg('Introduceti a si b!!!', mterror,[mbOk], 0)

else

begin

a:=strtoint(edit6.Text);

b:=strtoint(edit7.Text);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,0]:=alfa[i+1];

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,1]:=inttostr(ord(alfa[i+1])-ord('A'));

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,2]:=inttostr(((ord(alfa[i+1])-ord('A'))*a+b )mod 26);

for i:=1 to nr_lit do

alfa1[i]:=chr(ord('A')+((ord(alfa[i])-ord('A'))*a+b )mod 26);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,3]:=alfa1[i+1];

s:=smalltobig(memo7.Lines.Text);

s1:='';

for i:=1 to length(s) do

s1:=s1+alfa1[ord(s[i])-ord('A')+1];

memo8.Lines.Text:=s1;

end; end;

procedure TForm1.Button7Click(Sender: TObject);

var alfa1: string[26]; s,s1:string[250]; i,j,a,b:integer; nr1,nr2:array[1..26] of byte;

const alfa='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

begin

if (edit6.Text='') or (edit7.Text='') then

MessageDlg('Introduceti a si b!!!', mterror,[mbOk], 0)

else

begin

a:=strtoint(edit6.Text);

b:=strtoint(edit7.Text);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,0]:=alfa[i+1];

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,1]:=inttostr(ord(alfa[i+1])-ord('A'));

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,2]:=inttostr(((ord(alfa[i+1])-ord('A'))*a+b )mod 26);

for i:=1 to nr_lit do

alfa1[i]:=chr(ord('A')+((ord(alfa[i])-ord('A'))*a+b )mod 26);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,3]:=alfa1[i+1];

s:=smalltobig(memo7.Lines.Text);

s1:='';

for i:=1 to length(s) do

for j:=1 to nr_lit do

if s[i]=alfa1[j] then

s1:=s1+alfa[j];

memo8.Lines.Text:=s1;

end; end;

////////// Polibius \\\\\\\\\\\\\\\\\\

Procedure MakeTable(var t:TTable);

Var i,j:Byte;

Begin

For i:=1 to 5 do

For j:=1 to 5 do

Begin

t[Key[i][j],1] := Chr(Ord('A')+i-1);

t[Key[i][j],2] := Chr(Ord('A')+j-1);

End; End;

Procedure Encrypt(s:String; t:TTable; var r:String);

Var i:Byte;

Begin

r := '';

For i:=1 to Length(s) do

If s[i] <> 'W' then

r := r + t[s[i],1] + t[s[i],2];

End;

Procedure Decrypt(s:String; t:TTable; var r:String);

Var i:Byte;

Const

Key:Array[1..5] of String[5] = ('TPALE','RCYSK','BQNID','UFMGX','JVHOZ');

Begin

r := '';

For i:=1 to (Length(s) div 2) do

r := r + Key[Ord(s[i*2-1])-Ord('A')+1][Ord(s[i*2])-Ord('A')+1];

End;

procedure TForm1.Button8Click(Sender: TObject);

Var s_in, s_out:String; i,k :Byte; table :TTable; j :char;

begin

for j:='A' to 'E' do

stringgrid6.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid6.Cells[0,ord(j)-ord('A')+1]:=j;

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid6.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo10.Lines.Text);

MakeTable(table);

Encrypt(s_in, table, s_out);

memo9.Text:=s_out;

end;

procedure TForm1.Button9Click(Sender: TObject);

Var s_in, s_out:String; i,k :Byte; table :TTable; j :char;

begin

for j:='A' to 'E' do

stringgrid6.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid6.Cells[0,ord(j)-ord('A')+1]:=j;

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid6.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo10.Lines.Text);

MakeTable(table);

Decrypt(s_in, table, s_out);

memo9.Text:=s_out;

end;

// ––––––playfair–––––\\

Procedure MakeTable1(var t:TTable);

Var i,j:Byte;

Begin

For i:=1 to NN do

For j:=1 to NN do

Begin

t[Key[i][j],1] := Chr(Ord('A')+i-1);

t[Key[i][j],2] := Chr(Ord('A')+j-1);

End; End;

Procedure Encrypt_pf(s:String; t:TTable; var r:String);

Var i:Byte; lin_1,lin_2:Byte; col_1,col_2:Byte;

Begin

r := '';

For i:=1 to (Length(s) div 2) do

Begin

lin_1 := Ord(t[s[2*i-1],1])-Ord('A')+1;

col_1 := Ord(t[s[2*i-1],2])-Ord('A')+1;

lin_2 := Ord(t[s[2*i],1])-Ord('A')+1;

col_2 := Ord(t[s[2*i],2])-Ord('A')+1;

If lin_1 = lin_2 then

r := r + Key[lin_1][col_1 mod NN + 1] + Key[lin_1][col_2 mod NN + 1]

Else

If col_1 = col_2 then

r := r + Key[lin_1 mod NN + 1][col_1] + Key[lin_2 mod NN + 1][col_2]

Else

If col_1 < col_2 then

If lin_1 < lin_2 then

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

If lin_1 < lin_2 then

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

r := r + Key[lin_1][col_2] + Key[lin_2][col_1];

End; End;

Procedure Decrypt_pf(s:String; t:TTable; var r:String);

Var i:Byte; lin_1,lin_2:Byte; col_1,col_2:Byte;

Begin

r := '';

For i:=1 to (Length(s) div 2) do

Begin

lin_1 := Ord(t[s[2*i-1],1])-Ord('A')+1;

col_1 := Ord(t[s[2*i-1],2])-Ord('A')+1;

lin_2 := Ord(t[s[2*i],1])-Ord('A')+1;

col_2 := Ord(t[s[2*i],2])-Ord('A')+1;

If lin_1 = lin_2 then

r := r + Key[lin_1][(col_1+NN-2) mod NN + 1] + Key[lin_1][(col_2+NN-2) mod NN + 1]

Else

If col_1 = col_2 then

r := r + Key[(lin_1+NN-2) mod NN + 1][col_1] + Key[(lin_2+NN-2) mod NN + 1][col_2]

Else

If col_1 < col_2 then

If lin_1 < lin_2 then

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

If lin_1 < lin_2 then

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

r := r + Key[lin_2][col_1] + Key[lin_1][col_2];

End; End;

procedure TForm1.Button10Click(Sender: TObject);

var j:char; i,k:integer; s_in,s_out:string; table:ttable;

begin

{ for j:='A' to 'E' do

stringgrid7.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid7.Cells[0,ord(j)-ord('A')+1]:=j;}

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid7.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo12.Lines.Text);

MakeTable1(table);

Encrypt_pf(s_in, table, s_out);

memo11.Text:=s_out;

end;

procedure TForm1.Button11Click(Sender: TObject);

var j:char; i,k:integer; s_in,s_out:string; table:ttable;

begin

{ for j:='A' to 'E' do

stringgrid7.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid7.Cells[0,ord(j)-ord('A')+1]:=j;}

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid7.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo12.Lines.Text);

MakeTable1(table);

Decrypt_pf(s_in, table, s_out);

memo11.Text:=s_out;

end; end.

Bibliografie

T.ELGamal. A public key cryptosystem and a signature scheme based on discrete logarithms.IEEE Trans inf Theory ,vol 31(num 4) pag. 469-472,1985.

Claus-Peter Schnorr.Fast signature generation with a fiat Shamir like scheme.Advances in Cryptography,Springer-Verlag,pag.432-440,1991

http://profs.info.uaic.ro/~alaiba/mw/index.php?title=Borland_Delphi

http://193.230.235.141/carti/Informatica/programming/Curs%20delphi/

Anexă

Codul sursă:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, Grids;

type

TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;TabSheet2: TTabSheet;TabSheet3: TTabSheet; TabSheet4:TTabSheet;

Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel;

Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel;

Memo1: TMemo; Memo2: TMemo;Memo3: TMemo; Memo4: TMemo; Memo5: TMemo; Memo6: TMemo; Memo7: TMemo; Memo8: TMemo; Memo9: TMemo; memo10: TMemo;

Edit1: TEdit; Edit2: TEdit; Edit3: TEdit;Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit;

Button1: TButton; Button2: TButton; Button3: TButton;Button4: TButton;Button5: TButton;

Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel;

Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel;

StringGrid1: TStringGrid;StringGrid3: TStringGrid; StringGrid4: TstringGrid;

StringGrid2: TStringGrid; StringGrid5: TStringGrid;

TabSheet5: TTabSheet; TabSheet6: TTabSheet; TabSheet7: TTabSheet;

Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel;

Label25: TLabel; Label26: TLabel; Label27: TLabel; Label28: TLabel; Label29: TLabel;

Label30: TLabel; Label31: TLabel; Label32: TLabel; Label33: TLabel; Label34: TLabel;

Memo11: TMemo; Memo12: TMemo;

Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton;

Button10: TButton; Button11: TButton;

StringGrid6: TStringGrid; StringGrid7: TStringGrid;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var Form1: TForm1; const nr_lit=26; ALPHA:String = 'abcdefghijklmnopqrstuvwxyz ';

Type TTable = Array['A'..'Z',1..2] of Char;

Const NN=5;

Key:Array[1..5] of String[5] = ('TPALE','RCYSK','BQNID','UFMGX','JVHOZ');

implementation

{$R *.dfm}

function smalltobig(var1:string):string;

var i:integer;

begin

for i:=1 to length(var1) do

if (var1[i]>='a') and (var1[i]<='z') then

var1[i]:=chr(ord(var1[i])-32);

smalltobig:=var1;

end;

procedure TForm1.Button1Click(Sender: TObject);

var k,i,j:integer;

s:string;

begin

s := memo1.Text;

k := strtoint(edit1.Text);

for i:=1 to length(s) do

if s[i]<> ' ' then

if (s[i]<='Z') and (s[i]>='A') then

s[i] := chr((ord(s[i]) – ord('A') + k) mod nr_lit +ord('A'))

else if (s[i]<='z') and (s[i]>='a') then

s[i] := chr((ord(s[i]) – ord('a') + k) mod nr_lit +ord('a'));

memo2.Text:=s;

end;

procedure TForm1.Button3Click(Sender: TObject);

var k,i,j:integer; s:string;

begin

s := memo1.Text;

k := strtoint(edit1.Text);

for i:=1 to length(s) do

if s[i]<> ' ' then

if (s[i]<='Z') and (s[i]>='A') then

s[i] := chr((ord(s[i]) – ord('A') + nr_lit-k) mod nr_lit +ord('A'))

else if (s[i]<='z') and (s[i]>='a') then

s[i] := chr((ord(s[i]) – ord('a') + nr_lit-k) mod nr_lit +ord('a'));

memo2.Text:=s;

end;

procedure TForm1.Button2Click(Sender: TObject);

var i,j,k,rez:integer; s,s1,key,alf:string[nr_lit]; c:char; cond:boolean;

begin

for i:=0 to 25 do

alf[i+1]:=chr(ord('A')+i);

for i:=0 to 25 do

stringgrid1.Cells[i,0]:=inttostr(i);

for i:=0 to 25 do

stringgrid1.Cells[i,1]:=alf[i+1];

for i:=1 to nr_lit do

s1[i]:='*';

key:=smalltobig(edit3.Text);

k:=strtoint(edit2.Text);

i:=k+1; j:=1;

while j<=length(key) do

begin

s1[i]:=key[j];

i:=i+1; j:=j+1;

if i=nr_lit+1 then

i:=1;

end;

j:=i;

for c:='A' to 'Z' do

begin

cond:=true;

for i:=1 to nr_lit do

if s1[i]=c then cond:=false;

if cond then

begin

s1[j]:=c; j:=j+1;

end;

if j=nr_lit+1 then j:=1;

end;

for i:=0 to nr_lit-1 do

stringgrid1.Cells[i,2]:=s1[i+1];

s:=smalltobig(memo3.Lines.Text);

for i:=1 to length(s) do

begin

s[i]:=s1[ord(s[i])-ord('A')+1];

end;

memo4.Text:=s;

end;

///////–Vijener–///////////////////////////

Procedure MakeKey(s:String; k:Byte; var r:String);

Var i,n:Byte;

Begin

If Length(s) > k then

r := Copy(s, 1, k)

Else

Begin

n := (k div Length(s))+1;

For i:=1 to n do

r := r + s;

r := Copy(r, 1, k);

End;

End;

Procedure Encrypt_Vijiner(s,skey:String; var r:String);

Var i:Byte;

const nr_lit1=27;

Begin

r := '';

For i:=1 to Length(s) do

Begin

r := r + ALPHA[(Pos(s[i],ALPHA)+Pos(skey[i],ALPHA)-2) mod NR_LIT + 1];

End; End;

procedure TForm1.Button4Click(Sender: TObject);

var i,j,k:integer; s,key1,key,rez:string;

begin

for i:=0 to nr_lit-1 do

for j:=0 to nr_lit-1 do

begin

if i+j <=nr_lit-1 then k:=i+j

else k:=i+j-nr_lit;

stringgrid3.Cells[j,i]:=chr(ord('A')+k);

end;

s:=memo5.Lines.Text;

key1:=edit4.Text;

makekey(key1,length(s),key);

Encrypt_vijiner(s, key, rez);

memo6.Text:=rez;

edit5.Text:=key;

end;

///////–Rechelieu–///////////////////////////

procedure TForm1.Button5Click(Sender: TObject);

const Text:Array[1..7] of String =('i love you',

'i have you',

'deep under',

'my skin my',

'love lasts',

'forever in',

'hyperspace');

Key:Array[1..7,1..10] of Byte = ((0,0,0,0,0,0,0,1,0,0),

(0,0,0,0,0,0,0,0,1,0),

(0,0,0,0,0,1,0,0,0,0),

(0,0,0,0,1,1,0,0,0,0),

(1,0,0,0,0,1,1,0,1,0),

(0,1,0,0,0,0,0,0,0,1),

(0,0,0,0,0,0,0,0,1,1));

Var i,j:Byte;

begin

For i:=1 to 7 do

For j:=1 to 10 do

If Key[i,j] = 1 then

stringgrid4.Cells[j-1,i-1]:=Text[i][j];

For i:=1 to 7 do

For j:=1 to 10 do

stringgrid2.Cells[j-1,i-1]:=Text[i][j];

end;

///////////////// Afin \\\\\\\\\\\\\\\\\\\\\\

procedure TForm1.Button6Click(Sender: TObject);

var alfa1: string[26]; s,s1:string[250]; i,j,a,b:integer; nr1,nr2:array[1..26] of byte;

const alfa='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

begin

if (edit6.Text='') or (edit7.Text='') then

MessageDlg('Introduceti a si b!!!', mterror,[mbOk], 0)

else

begin

a:=strtoint(edit6.Text);

b:=strtoint(edit7.Text);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,0]:=alfa[i+1];

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,1]:=inttostr(ord(alfa[i+1])-ord('A'));

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,2]:=inttostr(((ord(alfa[i+1])-ord('A'))*a+b )mod 26);

for i:=1 to nr_lit do

alfa1[i]:=chr(ord('A')+((ord(alfa[i])-ord('A'))*a+b )mod 26);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,3]:=alfa1[i+1];

s:=smalltobig(memo7.Lines.Text);

s1:='';

for i:=1 to length(s) do

s1:=s1+alfa1[ord(s[i])-ord('A')+1];

memo8.Lines.Text:=s1;

end; end;

procedure TForm1.Button7Click(Sender: TObject);

var alfa1: string[26]; s,s1:string[250]; i,j,a,b:integer; nr1,nr2:array[1..26] of byte;

const alfa='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

begin

if (edit6.Text='') or (edit7.Text='') then

MessageDlg('Introduceti a si b!!!', mterror,[mbOk], 0)

else

begin

a:=strtoint(edit6.Text);

b:=strtoint(edit7.Text);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,0]:=alfa[i+1];

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,1]:=inttostr(ord(alfa[i+1])-ord('A'));

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,2]:=inttostr(((ord(alfa[i+1])-ord('A'))*a+b )mod 26);

for i:=1 to nr_lit do

alfa1[i]:=chr(ord('A')+((ord(alfa[i])-ord('A'))*a+b )mod 26);

for i:=0 to nr_lit-1 do

stringgrid5.Cells[i,3]:=alfa1[i+1];

s:=smalltobig(memo7.Lines.Text);

s1:='';

for i:=1 to length(s) do

for j:=1 to nr_lit do

if s[i]=alfa1[j] then

s1:=s1+alfa[j];

memo8.Lines.Text:=s1;

end; end;

////////// Polibius \\\\\\\\\\\\\\\\\\

Procedure MakeTable(var t:TTable);

Var i,j:Byte;

Begin

For i:=1 to 5 do

For j:=1 to 5 do

Begin

t[Key[i][j],1] := Chr(Ord('A')+i-1);

t[Key[i][j],2] := Chr(Ord('A')+j-1);

End; End;

Procedure Encrypt(s:String; t:TTable; var r:String);

Var i:Byte;

Begin

r := '';

For i:=1 to Length(s) do

If s[i] <> 'W' then

r := r + t[s[i],1] + t[s[i],2];

End;

Procedure Decrypt(s:String; t:TTable; var r:String);

Var i:Byte;

Const

Key:Array[1..5] of String[5] = ('TPALE','RCYSK','BQNID','UFMGX','JVHOZ');

Begin

r := '';

For i:=1 to (Length(s) div 2) do

r := r + Key[Ord(s[i*2-1])-Ord('A')+1][Ord(s[i*2])-Ord('A')+1];

End;

procedure TForm1.Button8Click(Sender: TObject);

Var s_in, s_out:String; i,k :Byte; table :TTable; j :char;

begin

for j:='A' to 'E' do

stringgrid6.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid6.Cells[0,ord(j)-ord('A')+1]:=j;

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid6.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo10.Lines.Text);

MakeTable(table);

Encrypt(s_in, table, s_out);

memo9.Text:=s_out;

end;

procedure TForm1.Button9Click(Sender: TObject);

Var s_in, s_out:String; i,k :Byte; table :TTable; j :char;

begin

for j:='A' to 'E' do

stringgrid6.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid6.Cells[0,ord(j)-ord('A')+1]:=j;

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid6.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo10.Lines.Text);

MakeTable(table);

Decrypt(s_in, table, s_out);

memo9.Text:=s_out;

end;

// ––––––playfair–––––\\

Procedure MakeTable1(var t:TTable);

Var i,j:Byte;

Begin

For i:=1 to NN do

For j:=1 to NN do

Begin

t[Key[i][j],1] := Chr(Ord('A')+i-1);

t[Key[i][j],2] := Chr(Ord('A')+j-1);

End; End;

Procedure Encrypt_pf(s:String; t:TTable; var r:String);

Var i:Byte; lin_1,lin_2:Byte; col_1,col_2:Byte;

Begin

r := '';

For i:=1 to (Length(s) div 2) do

Begin

lin_1 := Ord(t[s[2*i-1],1])-Ord('A')+1;

col_1 := Ord(t[s[2*i-1],2])-Ord('A')+1;

lin_2 := Ord(t[s[2*i],1])-Ord('A')+1;

col_2 := Ord(t[s[2*i],2])-Ord('A')+1;

If lin_1 = lin_2 then

r := r + Key[lin_1][col_1 mod NN + 1] + Key[lin_1][col_2 mod NN + 1]

Else

If col_1 = col_2 then

r := r + Key[lin_1 mod NN + 1][col_1] + Key[lin_2 mod NN + 1][col_2]

Else

If col_1 < col_2 then

If lin_1 < lin_2 then

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

If lin_1 < lin_2 then

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

r := r + Key[lin_1][col_2] + Key[lin_2][col_1];

End; End;

Procedure Decrypt_pf(s:String; t:TTable; var r:String);

Var i:Byte; lin_1,lin_2:Byte; col_1,col_2:Byte;

Begin

r := '';

For i:=1 to (Length(s) div 2) do

Begin

lin_1 := Ord(t[s[2*i-1],1])-Ord('A')+1;

col_1 := Ord(t[s[2*i-1],2])-Ord('A')+1;

lin_2 := Ord(t[s[2*i],1])-Ord('A')+1;

col_2 := Ord(t[s[2*i],2])-Ord('A')+1;

If lin_1 = lin_2 then

r := r + Key[lin_1][(col_1+NN-2) mod NN + 1] + Key[lin_1][(col_2+NN-2) mod NN + 1]

Else

If col_1 = col_2 then

r := r + Key[(lin_1+NN-2) mod NN + 1][col_1] + Key[(lin_2+NN-2) mod NN + 1][col_2]

Else

If col_1 < col_2 then

If lin_1 < lin_2 then

r := r + Key[lin_2][col_1] + Key[lin_1][col_2]

Else

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

If lin_1 < lin_2 then

r := r + Key[lin_1][col_2] + Key[lin_2][col_1]

Else

r := r + Key[lin_2][col_1] + Key[lin_1][col_2];

End; End;

procedure TForm1.Button10Click(Sender: TObject);

var j:char; i,k:integer; s_in,s_out:string; table:ttable;

begin

{ for j:='A' to 'E' do

stringgrid7.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid7.Cells[0,ord(j)-ord('A')+1]:=j;}

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid7.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo12.Lines.Text);

MakeTable1(table);

Encrypt_pf(s_in, table, s_out);

memo11.Text:=s_out;

end;

procedure TForm1.Button11Click(Sender: TObject);

var j:char; i,k:integer; s_in,s_out:string; table:ttable;

begin

{ for j:='A' to 'E' do

stringgrid7.Cells[ord(j)-ord('A')+1,0]:=j;

for j:='A' to 'E' do

stringgrid7.Cells[0,ord(j)-ord('A')+1]:=j;}

for i:=1 to 6 do

for k:=1 to 6 do

stringgrid7.Cells[i,k]:=key[i][k];

s_in:=smalltobig(memo12.Lines.Text);

MakeTable1(table);

Decrypt_pf(s_in, table, s_out);

memo11.Text:=s_out;

end; end.

Similar Posts