Sunteți pe pagina 1din 53

Ascunderea informaţiei in text folosind

gramatici de tip LR(k)

Traian Florin Serbănuţă

11 martie 2002
2
Cuprins

1 Introducere 5
1.1 Prezentarea lucrării . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Scurtă istorie a steganografiei . . . . . . . . . . . . . . . . . . 5

2 Preliminarii teoretice 9
2.1 Gramatici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.1 Gramatici independente de context . . . . . . . . . . . 9
2.1.2 Gramatici de tip LR(k) . . . . . . . . . . . . . . . . . 11
2.1.3 Algoritm de parsare pentru gramatici de tip LR(k) . . 14
2.2 Gramatici ponderate . . . . . . . . . . . . . . . . . . . . . . . 19
2.3 Coduri Huffman . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.1 Codificare . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.2 Construcţia codurilor Huffman . . . . . . . . . . . . . . 22

3 Sistemul de criptare 25
3.1 Prezentarea sistemului . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Extinderea sistemului . . . . . . . . . . . . . . . . . . . . . . . 27
3.3 Algoritmii de criptare şi decriptare . . . . . . . . . . . . . . . 28
3.3.1 Algoritmul de criptare . . . . . . . . . . . . . . . . . . 28
3.3.2 Procesul de decriptare . . . . . . . . . . . . . . . . . . 30
3.4 Siguranţa sistemului . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.1 Analiza teoretică a securităţii sistemului . . . . . . . . 31
3.4.2 Metode de ı̂mbunătăţire a securitătı̂i sistemului . . . . 32

4 Concluzii 35

A Coduri Huffman 39

B Construcţia unei tabele de parsare 41

C Exemplu de aplicare a criptării/decriptării 51

3
4 CUPRINS
Capitolul 1

Introducere

1.1 Prezentarea lucrării


Această lucrare tratează ascunderea informaţiei folosind gramatici de tip
LR(k). Deşi criptosistemul prezentat poate fi folosit şi pentru criptare efi-
cientă, am preferat să păstrez ı̂ncadrarea iniţială dată ı̂n [Way96], deoarece
mi se pare mai potrivită.
Deoarece ı̂n descrierea criptosistemului folosesc elemente din teoria lim-
bajelor formale - gramatici de tip LR(k) - şi din teoria codurilor - coduri
Huffman -, am ales să prezint aceste elemnte ı̂n cadrul ı̂n care sunt definite,
prezentând doar rezultatele şi algoritmii care i-am folosit ı̂n aplicaţia demon-
strativă. De aceea capitolul II, intitulat Preliminarii teoretice descrie
aceste elemente pe care se bazează criptosistemul.
Capitolul III este destinat criptosistemului. Prezint mai ı̂ntâi un cripto-
sistem simplu, cu câteva inconveniente, apoi arăt cum se poate extinde astfel
ı̂ncât să fie eliminate acele inconveniente. În finalul capitolului, dau nişte
rezultate teoretice privind securitatea sitemului.
În capitolul IV fac descrierea aplicaţiei, indicând algoritmii folosiţi, pre-
cum si modul de utilizare al aplicaţiei.
În sfârşit, ı̂n capitolul V prezint câteva concluzii asupra criptosistemului,
precum şi metode de ı̂mbunătăţire şi diversificare.
Dar, mai ı̂ntâi, să trecem ı̂n revistâ cateva metode de ascundere a informaţiei
utilizate de-a lungul timpului.

1.2 Scurtă istorie a steganografiei


Cuvântul steganografie provine de la grecescul steganos care ı̂nseammnă
ascuns (secret) şi graphein care ı̂nseamnă reprezentare grafică (scriere)şi,

5
6 CAPITOLUL 1. INTRODUCERE

tradus astfel, steganografia inseamnă scriere ascunsă, şi acesta este sensul
folosit ı̂n ziua de azi, adică scriere care nu este vizibilă unui observator oare-
care. De exemplu, scrierea de către copii a mesajelor cu ”cerneală simpatică”
este un exemplu de steganografie deoarece scrierea este ascunsă ı̂n sensul că
nu poate fi citită decât de cineva care ştie să o caute.
Dar sub această denumire, se găseşte o gamă largă de metode secrete de a
comunica. Inafară de cerneala invizibilă, mai sunt micropuncte (folosite in al
II-lea război mondial), rearanjarări ale caracterelor (altele decât permutările
şi substituţiile folosite ı̂n criptografie), semnături digitale, canale ascunse,
cominicaţii spread-spectrum (bazate pe ı̂mprăştierea semnalului).
,,Staganografia este arta şi ştiinţa comunicării ı̂ntr-un fel ı̂n care se as-
cunde existenţa comunicării. În contrast cu criptografia, ı̂n care inamicului
ı̂i este permis să detecteze, intercepteze şi să modifice mesaje, fără a putea
ı̂ncălca anumite premize de securitate garantate de un anumit criptosistem,
scopul steganografiei este de a ascunde mesaje ı̂n alte mesaje inofensive astfel
ı̂ncât să nu-i permită inamicului nici măcar să detecteze existenţa unui mesaj
ascuns.” (Markus Kuhn)[SH]
Unul dintre primele documente care atestă folosirea procedeelor steganografice
se găseşte ı̂n Istoriile lui Herodot. In Grecia antică, textul se scria pe plăcuţe
acoperite cu ceară. În una din povestiri, Demeratus voia să anunţe Sparta de
intenţiile lui Xerxes (ı̂mpăratul Persiei) de a invada Grecia. Pentru a evita
capturarea mesajului, el a răzuit ceara de pe plăcuţe şi a scris mesajul direct
pe lemn, apoi a acoperit din nou plăcuţele cu ceară. Astfel, tăbliţele păreau
goale şi nefolosite şi au trecut de inspecţia santinelelor fără ı̂ntrebări.
Altă metodă ingenioasă consta ı̂n următoarele: mesagerul era ras ı̂n cap şi
se scria mesajul pe pielea capului sau. Astfel, mesajul rămânea de nedetectat
până când mesagerul era din nou ras ı̂n cap.
Vechii chinezi, foloseau de asemenea o metodă ce implica ceara: mesajul
era scris pe mătase fină, care era apoi introdusă ı̂ntr-o bilă, acoperită cu ceară
şi ı̂nghiţită de mesager.
Cerneala invizibilă (simpatică) a fost folosită timp de secole de majori-
tatea civilizaţiilor fiind folosită cu succces şi ı̂n al II-lea război mondial.
Surse obişnuite de cerneală invizibilă sunt laptele, oţetul, sucurile de fructe şi
urina. Toate acestea se ı̂nnegresc la căldură. Metodele moderne care implică
cerneală invizibilă sunt mult mai complexe şi pentru obţinerea mesajului sunt
necesare procedee asemănătoare developării.
Odată cu tehnologia informaţiei şi informaţia digitală, steganografia şi-a
găsit locul ı̂n semnături digitale (care presupun ascunderea informaţiei ı̂n
date, fără a perturba prea mult ı̂ntelesul acestora).
Ascunderea informaţiei se poate ı̂n imagini (pe bitul cel mai puţin semni-
ficativ al culorilor, la imagini arhivate, etc.), ı̂n arhive, ı̂n fişiere executabile
1.2. SCURTĂ ISTORIE A STEGANOGRAFIEI 7

(asemănător viruşilor).
În al II-lea razboi mondial, germanii au descoperit tehnologia Mikrat
(micro-punct)[MD] care constă ı̂n proiectarea unei imagini ı̂ntr-o altă imag-
ine, mult micşorată de mărimea unui punct tipografic. Referindu-se la această
tehnică, directorul FBI J. Edgar Hoover o denumea ”capodopera spionajului
inamic”.
Comunicarea spread-spectrum (prin ı̂mprăştierea semnalului) [SS]presupune
existenţa unei game largi de canale de comunicaţie (de exemplu bandă ra-
dio) şi constă de exemplu ı̂n transmiterea de pachete mici aleator pe diferite
canale, sincronizarea făcându-se cu ajutorul unui generator de numere pseudo-
aleatoare.
O altă metodă, care e refolosită sub diverse forme şi astăzi este sistemul
de criptare folosit de cardinalul Richelieu care consta ı̂ntr-un şablon care se
aşeza peste foaia de hârtie, apoi se scrie ı̂n găurile şablonului mesajul, după
care se ı̂ndepărtează şablonul şi se completează foaia astfel ı̂ncât să rezulte
un mesaj inofensiv.
Putem include aici şi mesajele care ascund după o anumită regulă litere
ı̂n cuvintele unui text, spre exemplu ı̂n prima sau a doua literă din fiecare
cuvânt. Mesajul din exemplul următor a fost trimis de un spion german in
al II-lea război mondial:

Apparently neutral’s protest is thoroughly discounted and ig-


nored. Isman hard hit. Blockade issue affects pretext for embargo
on by products, ejecting suets and vegetable oils.

Dacă selectăm a două literă din fiecare cuvânt, mesajul obţinut este

Pershing sails from NY June 1.

De asemenea, se pot ascunde mesaje si prin aşezarea ı̂n pagină sau spaţierea
unui text. De exemplu, să zicem că avem un mesaj M 1 ı̂n care dorim să
evidenţiem nişte cuvinte. pentru aceasta creem mesajul M 2 care este M 1 ı̂n
care am marit puţin spaţiul din faţa cuvintelor ce trebuie evidenţiate şi l-am
micşorat pe cel de dupa la fel de puţin. In acest fel, prin suprapunerea celor
2 texte, textul rezultat va avea ı̂ngroşate acele cuvinte.
Exemplu: Fie mesajele:

Cerneala invizibilă (simpatică) a fost folosită timp de


secole de majoritatea civilizaţiilor fiind folosită cu succces şi ı̂n
al doilea război mondial.

şi
8 CAPITOLUL 1. INTRODUCERE

Cerneala invizibilă (simpatică) a fost folosită timp de


secole de majoritatea civilizaţiilor fiind folosită cu succces şi ı̂n
al doilea război mondial.

Prin suprapunerea celor două mesaje se obţine următorul mesaj:

Cerneala invizibilă (simpatică) a fost folosită timp de


secole de majoritatea civilizaţiilor fiind folosită cu succces şi ı̂n
al doilea război mondial.

ı̂n care dacă citim literele ı̂ngroşate ı̂n ordine obţinem numele Claudia.
Capitolul 2

Preliminarii teoretice

În acest capitol voi defini câteva din elementele matematice care stau la
baza sistemului de criptare propus. Ele fac parte fie din teoria limbajelor
formale (gramaticile de tip LR(k)), fie din teoria codurilor şi a compresiei
de date (arbori Huffman şi coduri Huffman). Le voi prezenta pe amândoua
acordându-le importanţă egală ı̂n cele două secţiuni ce urmează.

2.1 Gramatici

Definiţia 1.1 (V ∗ ):
Dată fiind o mulţime V numită alfabet, se defineşte V ∗ ca fiind monoidul
liber generat de V cu operaţia de concatenare. Elementele lui V ∗ se numesc
cuvinte peste alfabetul V şi sunt alaturări oarecare de simboluri din V .
Pentru w ∈ V ∗ , prin |w| ı̂ntelegem lungimea cuvăntului w (numărul de sim-
boluri care ı̂l formează.

Elementul neutru faţă de operaţia de concatenare se notează cu λ şi este


cuvăntul vid.
Notaţia αβ, unde α, β ∈ V ∗ ı̂nseamnă şirul obţinut prin concatenarea celor
două şiruri.

2.1.1 Gramatici independente de context

Definiţia 1.2 (Gramatică independentă de context):


O gramatică independentă de context este un cvadruplu (N, Σ, S, P ), unde:
N este o mulţime finită de simboluri, numite simboluri neterminale (vari-
abile)

9
10 CAPITOLUL 2. PRELIMINARII TEORETICE

Σ este o mulţime finită de simboluri numite simboluri terminale (alfabet)

S este un simbol din N , numit simbolul de start

P este o mulţime de perechi (A, α), unde A ∈ N şi α ∈ (N ∪ Σ)∗ . O astfel


de pereche se numeşte producţie şi se notează cu A −→ α.

Pe parcursul acestei lucrări, voi folosi litere mici de la ı̂nceputul alfa-


betului (a, b, c, ...) pentru a nota elementele din Σ (terminalele) şi litere mari
(A, B, C, S, ...) pentru elementele din N (variabilele). Pentru elemente din
(N ∪ Σ)∗ voi folosi litere greceşti mici (α, β, γ) iar pentru elemente din Σ∗
(cuvintele) voi folosi litere mici de la sfarşitul alfabetului (w, x, y, ...).

Definiţia 1.3 (derivare):


Fie G = (N, Σ, S, P ) o gramatică independentă de context şi α, β ∈ (N ∪Σ)∗ .
Spunem că α derivează ı̂n β (şi notăm cu α =⇒ β) dacă ∃A ∈ N , α1 , α2 , β1 ∈
(N ∪ Σ)∗ a.ı̂. α = α1 Aα2 , β = α1 β1 α2 şi A −→ β1 ∈ P


Notăm cu =⇒ ı̂nchiderea reflexivă şi tranzitivă a relaţiei =⇒ (corespunzând
+
derivării ı̂n mai multi paşi) şi cu =⇒ ı̂nchiderea tranzitivă a relaţiei =⇒ (core-
spunzând derivării ı̂n cel puţin un pas).

Pentru a fi mai expliciţi, α =⇒ β dacă există derivările

α =⇒ α1 =⇒ α2 ... =⇒ αn =⇒ β
+
cu n ≥ 0 iar la α =⇒ β, diferenţa este că n ≥ 1.

Definiţia 1.4 (Şir generat de o gramatică):


Fie G = (N, Σ, S, P ) o gramatică independentă de context şi w ∈ Σ∗ . Spunem

că gramatica G generează şirul w dacă există derivarea S =⇒ w

Definiţia 1.5 (Arbore asociat unei derivări):


Fiecarei producţii A −→ w0 X1 w1 X2 ...Xn wn , A ∈ N , wi ∈ Σ∗ , i = 0, n şi
Xj ∈ N , j = 1, n i se poate asocia un arbore avănd rădăcina etichetată cu A
şi frunzele cu wi , i = 0, n respectiv Xj , j = 1, n.

În acelaşi fel asociem prin extensie ficărei derivări S =⇒ w un arbore de
derivare cu rădăcina etichetată cu S, nodurile etichetate cu neterminale
şi frunzele etichetate cu şiruri de terminale astfel ı̂ncât subarborele format
dintr-un nod şi descendenţii săi direcţi să fie arborele producţiei care s-a
folosit la derivare.
2.1. GRAMATICI 11

Definiţia 1.6 (Limbaj generat de o gramatică):


Numim limbaj generat de o gramatica G = (N, Σ, S, P ) (şi notăm L(G)
mulţimea tuturor şirurilor care pot fi generate de gramatică, adică

L(G) = {w ∈ Σ∗ |S =⇒ w}

Definiţia 1.7 (Gramatică ambiguă):


Fie G = (N, Σ, S, P ) o gramatică independentă de context. Spunem că G este
ambiguă dacă ∃w ∈ L(G) pentru care există doi arbori de derivare distincţi.
În caz contrar, spunem că gramatica este neambiguă.

Deoarece pentru sistemul de criptare propus ne interesează ca fiecare şir


generat de gramatică să aibă un unic arbore de derivare, căt si ca descoperirea
acelui unic arbore să se facă ı̂ntr-un timp rezionabil de mic.
Gramaticile LR(k) ofera acest lucru, adică condiţia de neambiguitate şi
gasirea arborelui de derivare in ordin de timp liniar faţă de mărimea şirului
de intrare.

2.1.2 Gramatici de tip LR(k)


Mai ı̂ntâi voi da ı̂ncă câteva definiţii pregătitoare:

Definiţia 1.8 (derivare dreaptă):


Fie G = (N, Σ, S, P ) o gramatică independentă de context şi α = α1 Aw ∈
(N ∪ Σ), unde A ∈ N şi w ∈ Σ∗ . Spunem că α =⇒ β dacă şi numai dacă
d.d.
∃A −→ β1 ∈ P a.ı̂. β = α1 β1 w (i.e. β a fost obţinut din α prin derivarea
celui mai din dreapta neterminal).
∗ +
Notăm cu =⇒ şi cu =⇒ ı̂nchiderile corespunzătoare ale relatiei =⇒.
d.d. d.d. d.d

Se poate observa că şirul de derivări drepte prin care este obţinut un
cuvânt este dat de parcurgerea in postordine a arborelui de derivare asociat
cuvântului.

Definiţia 1.9 (F irstk ):


Fie G = (N, Σ, S, P ) o gramatică independentă de context şi α ∈ (N ∪ Σ)∗ .
Atunci:
∗ ∗
F irstk (α) = {w ∈ Σ∗ ||w| < k şi α =⇒ w sau |w| = k şi α =⇒ wx}

Din definiţie se poate observa că F irst0 (α) = λ, ∀α ∈ (N ∪ Σ)∗ .


12 CAPITOLUL 2. PRELIMINARII TEORETICE

Vom mai avea nevoie de următoarea definiţie:

Definiţia 1.10 (Σ∗k ):


Fie Σ un alfabet. Atunci Σ∗k = {w ∈ Σ∗ ||w| ≤ k}

Dăm acum definiţia gramaticilor de tip LR(k):

Definiţia 1.11 (Gramatici de tip LR(k)):


Fie G = (N, Σ, S, P ) o gramatică independentă de context ı̂n care sim-
bolul de start nu apare ı̂n membrul drept al niciunei producţii. Spunem
că G este gramatică de tip LR(k), k ≥ 0, dacă oricare ar fi derivările
∗ ∗
drepte S =⇒ αAw =⇒ αβw şi S =⇒ γBx =⇒ αβy astfel ı̂ncât F irstk (w) =
d.d. d.d. d.d. d.d.
F irstk (y), atunci α = γ, A = B şi x = y.

Se observă că din γBx =⇒ αβy rezultă că există B −→ δ şi γδx = αβy,
d.d.
adică δ = β.
Intuitiv, dacă αβw şi αβy sunt obţinute prin derivări drepte şi avem
F IRSTk (w) = F IRSTk (y) şi dacă A −→ d.d.
β este ultima producţie folosită
ı̂n obţinerea lui αβw prin derivări drepte, atunci producţia A −→ d.d.
β tre-
buie folosită şi pentru a reduce αβw (la αAy) la parsare. Deoarece A de-
rivă ı̂n β independent de w, condiţia din definiţie spune că există suficientă
informaţie ı̂n F IRSTk (w) pentru a determina că αβ a fost derivat din αA.
Când parsăm, nu poate exista confuzie despre cum ar trebui să reducem o
producţie obţinută prin derivări drepte.
Condiţia ca S să nu apară ı̂n membrul drept al unei producţii a fost pusă
pentru a putea determina ı̂n timpul parsării dacă acceptăm şirul de intrare
când obţinem un S (ı̂n urma unei reduceri).
În general, gramaticile independente de context nu conţin suficientă informaţie
ı̂n F IRST (k) pentru a determina din ce a fost derivat şirul pe care ı̂l ex-
aminăm. Mai mult, aceste gramatici pot fi ambigue, pe când gramaticile
LR(k) nu.
Pentru a arăta că restricţia ca simbolul de start nu apare ı̂n dreapta nici
unei producţii nu restrânge din generalitate, dăm următoarea definiţie:

Definiţia 1.12 (Extensia unei gramatici independente de context):


Fie G = (N, Σ, P, S) o gramatică independentă de context. Extensia gra-
maticii G se defineşte ca fiind

G0 = (N ∪ {S 0 , Σ ∪ {$}, S 0 , P ∪ {S 0 S$}}

unde S 0 , $ nu aparţin mulţimii N ∪ Σ.


2.1. GRAMATICI 13

Gramatica extinsă G0 este aproape G, având ı̂n plus o nouă producţie


de start S 0 S$. Presupunem că S 0 S$ este producţia cu indexul 0 ı̂n G0 şi
că celelalte producţii ale lui G sunt numerotate 1, 2, ..., p. Am adăugat o
nouă producţie de start pentru ca, atunci când se cere o acţiune de reducere
folosind o producţia cu indexul 0, să putem interpreta această ”reducere” ca
un semnal de acceptare.
Este evident că w ∈ L(G) ⇐⇒ w$ ∈ L(G0 ) Putem, deci, presupune că
ı̂ntr-o gramatică simbolul de start nu apare ı̂n membrul drept al nici unei
producţii, fără ca aceasta să ne restrângă generalitatea.
Exemple:
Fie gramatica G:
S −→ AB
A −→ a
B −→ CD|aE
C −→ ab
D −→ bb
E −→ bba.
G nu este LR(1), deoarece avem derivările (ı̂n gramatica extinsă):
S 0d.d. S =⇒ AB =⇒ ACD =⇒ ACbb =⇒ Aabbb şi
d.d. d.d. d.d. d.d.
S 0d.d. S =⇒ AB =⇒ AaE =⇒ Aabba
d.d. d.d. d.d.
Dacă luăm şirul Aabw nu putem determina dacă el a fost obţinut din ACw
sau nu uitându-ne la primul simbol din w. Totuşi, G este LR(2).
Fie gramatica G:
S −→ Ab|Bc
A −→ Aa|λ
B −→ Ba|λ
G nu este LR(k) oricare ar fi k, deoarece avem următoarele derivări drepte:

S 0d.d. S =⇒ Aak b =⇒ ak b
d.d. d.d.

S 0d.d. S =⇒ Bak c =⇒ ak c
d.d. d.d.
Aceste derivări respectă ipotezele definiţiei unei gramatici LR(k), cu α = λ,
β = λ, w = ak b, γ = λ şi y = ak c. Totuşi, avem A 6= B, deci G nu este
LR(k)∀k ∈ IN
Totuşi, gramatica de mai sus nu este ambiguă, ba chiar generează acelaşi
limbaj cu următoarea gramatică LR(0):
S −→ C|D
C −→ aC|b
D −→ aD|c
Definiţia 1.13 (Analiză sintactică):
Fie G = (N, Σ, S, P ) o gramatică independentă de context şi w ∈ Σ∗ . A
14 CAPITOLUL 2. PRELIMINARII TEORETICE

analiza sintactic w ı̂nseamnă a arăta algoritmic dacă w ∈ L(G). E de ı̂nteles


că, ı̂n acest caz se obţin şi derivările prin care este obţinut w.
Un astfel de algoritm care face analizaza sintactică se mai numeşte şi parser.

2.1.3 Algoritm de parsare pentru gramatici de tip LR(k)


Pentru fiecare gramatică LR(k) G = (N, Σ, S, P ) poate fi construit un
parser determinist. Acest parser va avea o mulţime de stări şi două tabele
de parsare, numite actiune şi goto. Tabela actiune ne va spune la fiecare
pas dacă trebuie să facem o acţiune deplasare (adică să avansăm ı̂n şirul de
intrare) sau una de reducere, iar ı̂n cazul unei acţiuni de reducere, ne spune
ce producţie s-a folosit pentru derivare.
Tabela actiune este definită pe mulţimea stărilor şi Σ∗k şi pentru o stare
s şi un cuvânt u poate avea valorile deplasare care spune că se avansează ı̂n
şirul de parsat, eroare, acceptare sau un numar j care desemnează producţia
care se reduce.
Tabela goto este definită pe mulţimea stărilor şi Σ şi pentru o stare s şi
o literă a poate avea valoarea eroare sau un număr i desemnând starea ı̂n
care se va trece din starea s la ı̂ntâlnirea literei a.
Aceste două tabele definite, algoritmul de parsare este relativ simplu. El
este asociat unei gramatici extinse. Algoritmul lucrează cu triplete de forma
(S, W, π), unde S este stiva de lucru ce conţine stările şi literele/neterminalele
care au produs aceste stări, W este cuvântul care a rămas de parsat şi π stiva
producţiilor care au fost reduse (stiva de ieşire). La sfârşitul algoritmului,
dacă se termină cu acceptarea cuvântului, şirul din buffer-ul de ieşire este
derivarea dreaptă a cuvântului de intrare relativ la gramatica iniţială (ig-
norând simbolul $).

Algoritmul 1.1: parsare(z, G, actiune, goto, π) Algoritmul testează apartenenţa


cuvântului z la limbajul generat de gramatica G şi determină o derivare
dreaptă a acestuia ı̂n caz afirmativ.

Intrare: z = a1 . . . an cuvânt, G gramatică LR(k), actiune şi goto tabelele


de parsare associate lui G.

Iesire: dacă avem acceptare procedura returneaza adevarat şi π este derivarea
dreaptă a lui z.

Algoritmul actionează ca un automat, folosind două stive, ı̂n felul următor

Configuraţia iniţială (0, z$, λ)


2.1. GRAMATICI 15

pentru o configuraţie (sS, aW, π). fie u, format din primele (cel mult)k
simboluri ale lui aW .

(sS, aW, π) ` (s0 asS, W, π)


dacă actiune(s, u) = deplasare şi s0 = goto(s, a).

(sS, aW, π) ` (tAs0 S 0 , aW, iπ)


dacă actiune(s, u) = i şi producţia i este A −→ α iar s0 S 0 e
obtinut din sS prin scoaterea a 2 | α | simboluri şi t = goto(s0 , a)

(sS, aW, π) ` acceptare


dacă actiune(s, u) = acceptare

(sS, aW, π) ` eroare


dacă actiune(s, u) = eroare

Cel mai simplu mod de a arăta cum funcţionează un parser LR(k) este
printr-un exemplu, ı̂n care avem deja construite tabelele actiune şi goto.
Procedeul de construire al acestor tabele ı̂l vom explica mai jos.
Gramatica care generează limbajul expresiilor aritmetice simple cu nu-
mere naturale separate de ’;’este LR(1). Definiţia gramaticii, şi tabelele,
actiune şi goto, sunt destul de elaborate şi le-am inclus ı̂n anexa 2.1.3.
Algoritmul procedează astfel: Extrage câte k litere din şirul de intrare
(fie u acest şir) şi aplică funcţia actiune perechii (s, u), unde s este starea
din capătul stivei stărilor. Dacă rezutatul este eroare, atunci algoritmul se
opreşte. Dacă rezultatul este i, iar regula i este A −→ α atunci se scot 2 | α |
simboluri din stivă stărilor. Această regulă se aplică până când nu mai avem
reduceri de făcut.
Şi pentru reducere şi pentru deplasare, se aplică funcţia goto primului
simbol din u (fie el u1 ) şi primei stări din stivă, apoi u1 şi starea obţinută se
adaugă stivei.
Pentru gramatica dată ca exemplu şi şirul de intrare 1 + 0$, algoritmul
de parsare va funcţiona astfel:
16 CAPITOLUL 2. PRELIMINARII TEORETICE

Starea curentă a automatului Se reduce


(s0 , 1 + 0$, λ)
` (s10 1s0 , +0$, λ)
` (s11 C1 s0 , +0$, P15 ) C1 −→ 1
` (s51 N0 s11 C1 s0 , +0$, P12 P15 ) N0 −→ λ
` (s12 N s0 , +0$, P9 P12 P15 ) N −→ C1 N0
` (s14 F s0 , +0$, P8 P9 P12 P15 ) F −→ N
` (s15 T s0 , +0$, P6 P8 P9 P12 P15 ) T −→ F
` (s16 Es0 , +0$, P4 P6 P8 P9 P12 P15 ) E −→ T
` (s20 + s16 Es0 , 0$, P4 P6 P8 P9 P12 P15 )
` (s1 0s20 + s16 Es0 , $, P4 P6 P8 P9 P12 P15 )
` (s12 N s20 + s16 Es0 , $, P10 P4 P6 P8 P9 P12 P15 ) N −→ 0
` (s14 F s20 + s16 Es0 , $, P8 P10 P4 P6 P8 P9 P12 P15 ) F −→ N
` (s21 T s20 + s16 Es0 , $, P6 P8 P10 P4 P6 P8 P9 P12 P15 ) T −→ F
` (s16 Es0 , $, P3 P6 P8 P10 P4 P6 P8 P9 P12 P15 ) E −→ E + T
` (s17 S1 s0 , $, P2 P3 P6 P8 P10 P4 P6 P8 P9 P12 P15 ) S1 −→ E
` (acceptare, P2 P3 P6 P8 P10 P4 P6 P8 P9 P12 P15 )
Ultima componentă a unei stări a parserului reprezintă şirul de derivări
drepte necesar pentru a obţine din şirul de simboluri de pe stivă şirul de
intrare parsat. Astfel, la sfârsit avem pe stivă simbolul E, din care obţinem
şirul iniţial de intrare (a+a∗a) prin aplicarea, pe rând, a regulilor 1,3,6,4,6,2,4
şi 6 ı̂n derivare dreaptă.

Construcţia tabelelor actiune şi goto


În această secţiune voi arăta cum se pot construi cele două tabele care
stau la baza parserului LR(k). Pentru aceasta, sunt necesare câteva definiţii:
Fie G = (N, Σ, P, S) o gramatică independentă de context.

Definiţia 1.14 (Prefix viabil):



Fie S =⇒ αAw =⇒ αβw (rezultă w ∈ Σ∗ o derivare dreaptă ı̂n G. Spunem
d.d. d.d
că şirul γ este un prefix viabil al lui αβw dacă γ este un prefix al lui αβ.

Definiţia 1.15 (Configuraţie LR(k)):


Fie G0 ” extensia lui G. Numim configuraţie LR(k) o regulă de forma
(A −→ α.β; u), unde A −→ αβ ∈ P şi u ∈ Σ∗k .
u se numeşte simbol lookahead

Definiţia 1.16 (Configuraţie LR(k) validă):


Spunem că configuraţia LR(k) (A −→ α.β; u) este validă pentru prefixul via-
2.1. GRAMATICI 17


bil αβ, dacă există o derivare S =⇒ αAw =⇒ αβγw astfel ı̂ncât u = F IRSTk (w$).
d.d. d.d.

Definiţia 1.17 (Închiderea unei mulţimi de configuraţii LR(k)):


Definim ı̂nchiderea unei mulţimi I de configurţii LR(k) ca fiind multimea J
rezultată ı̂n urma aplicării următorului algoritm.

Algoritmul 1.2: Inchidere Închiderea unei mulţimi de configuraţii LR(k)

Intrare: I - mulţime de configuraţii LR(k)

Iesire: J - inchiderea mulţimii I

J ←− I

repetă

pentru ∀A −→ α.Bβ; u ∈ J, B ∈ N
pentru ∀B −→ γ ∈ P
pentru ∀v ∈ F irstk (βu)
J ←− J ∪ {B −→ .γ; v}

până când nu se mai adugă configuraţii noi

Următorul algoritm produce la ieşire mulţimea de configuraţii ı̂n care


se poate ajunge dintr-o mulţime I iniţială prin avansarea peste un termi-
nal/neterminal. Algoritmul foseşte procedura Inchidere.

Algoritmul 1.3: GOT O(I, X)

Intrare: I - mulţime de configuraţii LR(k), X ∈ N ∪ Σ

Iesire: J

J ←− {A −→ αX.β; u|A −→ α.Xβ; u ∈ I}

J ←− Inchidere(I)

Iar acum, definim mulţimile canonice LR(k) asociate gramaticii extinse


0
G ” ca fiind ieşirea următorului algoritm.

Algoritmul 1.4: conf ig(G0 )


18 CAPITOLUL 2. PRELIMINARII TEORETICE

Intrare: I - mulţime de configuraţii LR(k), X ∈ N ∪ Σ


Iesire: C - mulţimea mulţimilor canonice
C ←− {inchidere({S 0 −→ .S; $})}
repetă
pentru ∀I ∈ C
pentru ∀X ∈ N ∪ Σ
dacă GOT O(I, X) 6= Ø şi GOT O(I, X) 6∈ C
C ←− C ∪ {GOT O(I, X)}
până când nu se mai adaugă noi mulţimi de configuraţii
Acest algoritm produce o mulţime de configuraţii pe care o vom numerota:
C = {I0 , I1 , . . . , In }
unde I0 corespundere ı̂nchiderii mulţimii {S 0 −→ .S; $}. La această mulţime
de configuraţii asociem o mulţime de stări S{0, ∞, . . . , \} ı̂n care fiecare stare
s ∈ S i se asociază muţimii de configuraţii Is .
Înainte de a arăta algoritmul de construire a tabelelor actiune şi goto,
mai aven nevoi de o definitie:

Definiţia 1.18 (Funcţie F IRST fără λ):


Funcţia F IRST fără λ (F F LG
k (α)) se defineşte astfel:
(1) Dacă α nu ı̂ncepe cu un neterminal, atunci F F Lk (α) = F IRSTk (α)
(2) Dacă α ı̂ncepe cu un neterminal, atunci

F F Lk (α) = {w | w ∈ F IRSTk (α) şi există o derivare α =⇒ β =⇒ wx, unde
d.d. d.d
β 6= Awx oricare ar fi A un neterminal}

Definiţia 1.19 (tabelele actiune şi goto):


Fie G o gramatică independentă de context, fie S mulţimea de stări ale lui
G determinată ı̂n urma algoritmului conf ig(G0 ) şi l : P −→ IN funcţia care
asociază numere producţiilor. Se definesc funcţiile a şi g astfel:
a : S × Σ∗k −→ l(P ) ∪ {deplasare, acceptare, eroare}


 l(A −→ α) dacă A −→ α.; u ∈ Ik şi A 6= S 0

deplasare dacă A −→ α.β; v ∈ Ik , β 6= λ şi u ∈ F F Lk (βv)
a(k, u) =

 acceptare dacă S 0 −→ S.; $ ∈ Ik

eroare altfel
g : S × Σ ∪ N −→ S ∪ {eroare}
2.2. GRAMATICI PONDERATE 19
½
j dacă GOT O(Ik , X) = Ij
g(k, X) =
eroare altfel
Dacă funcţiile a şi g sunt bine definite (nu au ieşiri multiple pentru aceeaşi
intrare, definim tabelele actiune şi goto ca fiind graficele respectiv ale lui a şi
g.

Consideraţii teoretice
Pentru demonstraţiile acestor rezultate, vezi [AU72]

Teorema 1.1: O gramatică G = (N, Σ, S, P ) este LR(k) dacă şi numai


dacă următoarea condiţie este valabilă ∀u ∈ Σ∗k . Fie αβ un prefix viabil al lui
αβw, unde αβw a fost obţinut prin derivări drepte (ı̂n gramatica augmentată
G0 ). Dacă producţia cu punct [A −→ β., u] este validă pentru αβ, atunci nu
există o altă producţie cu punct [A1 −→ β1 .β2 , v] care să fie validă pentru
αβ, cu u ∈ F F Lk (β2 v).

Această teoremă ne asigură că o gramatică este LR(k) dacă şi numai dacă
tabelele actiune şi goto pot fi create.

Teorema 1.2: Algoritmul 1.4 determină ı̂n mod corect mulţimea mulţimilor
canonice.

Teorema 1.3: Algoritmul 1.1 determină ı̂n mod corect o derivare dreaptă
a şirului de intrare, dacă există una, sau se termină cu eroare altfel.

2.2 Gramatici ponderate


În vorbirea curentă anumite sintagme apar mai des, ı̂n funcţie de specificul
textului, patricularităţile persoanei care ı̂l scrie precum şi alţi factori. Pot fi
incluse aici ticurile verbale, precum şi exclamaţii şi interjectii care apar mai
des (de exemplu ı̂n cadrul unui meci de fotbal). De asemenea, ı̂n descrierea
unei scene de luptă să zicem dintr-un film, este natural să apară mai des
numele personajul principal.
De aceea, atunci când incercăm modelarea limbajului natural folosind
gramatici, este natural să ı̂ncercăm să modelăm şi acest aspect, folosind
probabilităti (ponderi) asociate producţiilor care să ajute la generarea de
text statistic asemănător cu realitatea.
20 CAPITOLUL 2. PRELIMINARII TEORETICE

Definiţia 2.20 (gramatică ponderată):


Se numeşte gramatică ponderată asociată unei gramatici independente de
context G = (N, Σ, S, P ) perechea GP = (G, p), unde p : P −→ <, unde
p((A, α)) este ponderea asociata producţiei A −→ α şi influenţează (prin
mărime) alegerea lui α in derivarea variabilei A.

Prin normalizare, se poate da o semnificaţie de probabilitate ponderii


asociate unei producţii.

Definiţia 2.21 (gramatică ponderată normalizată):


Se numeşte gramatică ponderată normalizată asociată lui G gramatica pon-
derată GP = (G, p) având următoarea restricţie:
X
∀A ∈ N, pA,α = 1
(A,α,pA,α )∈P 0

. În acest caz, pA, α reprezintă probabilitatea ca la derivarea variabilei A să


se foloseasca producţia A −→ α.

2.3 Coduri Huffman


Codurile Huffman reprezintă o tehnică foarte utilizată şi eficientă ı̂n com-
presia de date. Ideea de bază este utilizarea unei modalităţi optime pen-
tru reprezentarea fiecărui caracter sub forma unui şir binar, ı̂n funcţie de
frecvenţa acestuia.
Voi expune mai ı̂ntâi cateva noţiuni pregătitoare din teoria codurilor (din
[Ata01]), apoi voi da algoritmii pentru crearea şi folosirea codurilor Huffman
(din [CLR90]).

2.3.1 Codificare

Definiţia 3.22 (Codificare):


Fiind date mulţimile A (alfabetul sursă) şi B (alfabetul cod), o codificare
este o aplicaţie injectivă K : A −→ B ∗ .

Elementele mulţimii K(A) ⊆ B ∗ se numesc cuvinte-cod, iar K(A) se


numeşte cod.
Dacă B are numai două simboluri, codificarea K se numeş te binară.
2.3. CODURI HUFFMAN 21

Definiţia 3.23 (Codificare a mesajelor):


Pentru o codificare K : A −→ B ∗ , se numeş te codificare a mesajelor
(textului) sursa aplicaţia K ∗ : A∗ −→ B ∗ definita recursiv prin:

• K ∗ (λ) = λ (λ este cuvântul vid);

• K ∗ (aα) = K ∗ (a)K ∗ (α), ∀a ∈ A, α ∈ A∗ .

Definiţia 3.24 (Codificare unic decodabilă):


Codificarea K este unic decodabilă dacă K ∗ este injectivă.

Definiţia 3.25 (Codificare prefix (instantanee)):

1. O codificare K : A −→ B ∗ se numeşte instantanee dacă K(A) are


proprietatea prefixului (dacă α, αβ ∈ K(B) atunci β = λ).

Observăm că o codificare prefix este evident unic decodabilă (din definiţie).
Avantajul codurilor instantanee este acela că dacă se cunoaşte dinainte
frecvenţa simbolurilor sursă, atunci simbolurile sursă care apar mai frecvent
pot fi codificate cu cuvinte cod mai scurte, realizăndu-se astfel o codificare
mai eficientă (cerinţă ı̂n compresia de date). O astfel de codificare eficientă
este realizată de codurile Huffman.

Coduri Huffman

Definiţia 3.26 (Sursă de informaţie):


O sursă de informaţie este o pereche S = (A, P ) unde

A = {a1 , a2 , . . . , an } este alfabetul sursă (mulţime ordonată);

P = {P (a1 ), P (a2 ), . . . , P (an )} este mulţimea ordonată a probabilităţilor


elementelor lui A, deci

0 ≤ P (ai ) ≤ 1, (1 ≤ i ≤ n);
Pn
P (ai ) = 1.
i=1
22 CAPITOLUL 2. PRELIMINARII TEORETICE

Fie K o codificare a unei surse de informaţie. Dacă se notează cu di =


|K(ai )| (|α| reprezintă lungimea secvenţei α), se poate defini lungimea medie
L a cuvintelor cod prin
Xn
L= di P (ai ).
i=1

O codificare este eficientă dacă lungimea medie a secvenţelor cod este cât
mai mică.

Definiţia 3.27 (Cod Huffman):


Fiind dată o sursă de informaţie S şi un alfabet cod, un cod Huffman este
un cod instantaneu având lungimea medie minimă.

Lungimea medie minimă a unui cod Huffmann se notează cu Lmin (S).

2.3.2 Construcţia codurilor Huffman


Construcţia codurilor Huffman binare se face pornind de la următoarea
observaţie: O sursă cu două simboluri are evident un cod Huffman de cuvinte
cod {0, 1} (şi deci Lmin (S) = 1).
O sursă cu trei simboluri {a1 , a2 , a3 } n care a1 are probabilitate maximă,
poate fi redusă la cazul a două simboluri {a1 , a2,3 } unde P (a2,3 ) = P (a2 ) +
P (a3 ). Pentru aceste două simboluri o codificare Huffman este K(a1 ) =
0, K(a2,3 ) = 1. De asemenea pentru sursa cu simbolurile {a2 , a3 } o codificare
Huffman este K(a2 ) = 0, K(a3 ) = 1. Combinând cele două rezultate obţinem
un cod Huffman pentru sursa originală:
a1 a2 a3
0 10 11
Bazat pe acest procedeu de compunere a unor codurilor Huffman mai
simple pentru a genera unul mai complex, se poate construi un algoritm
Greedy care construieşte o codificare Huffman.
Procedeul de construire.Se dau:
A - alfabetul
∀a ∈ A, P (c) probabilitatea/frecvenţa de apariţie a lui c
(A, P ) reprezintă sursa de informaţie.

Algoritmul 3.5: Huffman(A)

1 n ←− |A|

2 min-heap Q ←− A
2.3. CODURI HUFFMAN 23

3 pentru i ←− 1, n − 1

3.1 alocă nod z


3.2 extrage min Q ı̂n x
3.3 extrage min Q ı̂n y
3.4 z.f ius ←− x
3.5 z.f iud ←− y
3.6 P (z) ←− P (x) + P (y)
3.7 Q ←− z

4 return min(Q).

Algoritmul construieşte arborele binar corespunzător unei codificări Huff-


man. Construcţia este ”bottom-up”, având ca frunze simbolurile sursă. Co-
dul unui simbol a este dat de drumul de la rădăcina arborelui A păna la
frunza ce ı̂l reprezintă astfel:

Algoritmul 3.6: cod(a,A)

1 dacă a = root(A) return ””

2 p ←− parinte(a)

3 dacă a = f ius(p) return cod(p, A) + 0 00 altfel return cod(p, A) + 0 10

Deoarece toate caracterele sunt frunze in arborele codificării, codurile lor


nu pot fi prefixul codurilor altor caractere, deci avem de a face cu o codificare
prefix.
Prezentăm acum algoritmul care dintr-un şir de ’biţi’ extrage un caracter
incepând de la poziţia index şi avansează index-ul ı̂n mod corespunzător:

Algoritmul 3.7: getNextChar(index,A)

1 a ←− root(A)

2 cât timp a nu e frunză

2.1 dacă sir[index] = 0 00 atunci a ←− f ius(a) altfel a ←− f iud(a)


2.2 index ←− index + 1

3 return c
24 CAPITOLUL 2. PRELIMINARII TEORETICE

Cu aceşti trei algoritmi se poate realiza compresia/decompresia unui text.


Scopul nostru este ı̂nsă de a inversa procesul, folosind arborii Huffman pentru
a codifica producţiile corespunzătoare unei variabile, conform ponderilor lor,
şi de a genera text pornind de la o secvenţă de biţi căreia i se asociază o
producţie din gramatică.
Pentru demonstraţiile privind corectitudinea algoritmilor, vezi [CLR90].
Capitolul 3

Sistemul de criptare

Vom defini un sistem de ascundere a informaţiei bazat pe gramatici de tip


LR(k), prin elementele sale componente: mulţimea textelor clare, mulţimea
textelor criptate, mulţimea cheilor, precum şi funcţiile de criptare/decriptare.
De asemenea, vom prezenta un rezultat teoretic privind siguranţa sistemului.

3.1 Prezentarea sistemului


Voi prezenta mai ı̂ntâi un sistem simplu, care are limitări ı̂n privinţa
capacitătii de criptare. Apoi vom arăta cum se poate extinde pentru a elimina
aceste limitări.
Mai ı̂ntâi, asociem fiecărei variabile X dintr-o gramatică ponderată un
arbore Huffman având ca sursă de informaţie producţiile care au ca membru
stâng pe X şi probabilităţile asociate lor. Pentru variabilele care nu au decât
o producţie, arborele Huffman asociat lor nu va avea decât un nod (adică
rădăcina) (şi deci codificarea Huffman asociată lor va fi vidă).

Cheile de criptare
Începem cu cheile de criptare pentru că, aşa cum vom vedea, ele determină
mulţimea textelor clare. Mulţimea cheilor de criptare K este:

K = {(GP, H)}

unde GP = (G, p)) gramatică LR(k) ponderată şi H mulţimea codificărilor


Huffman ataşate variabilelor lui GP .
Putem impune condiţia ca gramatica GP să nu conţină producţii inuti-
lizabile (care nu apar ı̂n nici un arbore de derivare asociat lui G.

25
26 CAPITOLUL 3. SISTEMUL DE CRIPTARE

Textele criptate asociate unei chei


Mulţimea textelor criptate pentru o cheie k = (G, H) ∈ K este mulţimea
tuturor şirurilor care se pot genera folosind gramatica G, adică L(G)

Textele clare asociate unei chei


Dată fiind o funcţie cod : P −→ {0, 1}∗ care dă codul asociat fiecărei
producţii A −→ α corespunzător codificării lui A din H, şi Cod extensia ei
unică la P ∗ mulţimea textelor clare se defineşte ca fiind:
C = {x ∈ {0, 1}∗ |∃w ∈ L(G) obţinut prin şirul D = d1 , d2 . . . dn de
derivări drepte şi x = Cod(D)}

Funcţia de decriptare
Funcţia de decriptare ı̂ntoarce şirul de biţi ascuns ı̂ntr-un cuvânt w ∈
L(G) şi o putem defini astfel:

Dk = Cod ◦ parse : L(G) −→ C

unde parse este funcţia care pentru un cuvănt al limbajului dă unicul şir de
derivări drepte asociat lui

Funcţia de criptare
Întrucât gramatica este neambiguă, fiecare text clar este unic determinat
de un cuvănt al limbajului. Adică, funcţia Dk este bijectivă. Definim funcţia
de criptare astfel:
Ek = Dk−1 : C −→ L(G)

Observatii
Precum se poate vedea, am definit textele criptate ı̂naintea celor clare re-
spectiv funcţia de decriptare ı̂naintea celei de criptare. Aceasta se datorează
faptului că atunci când criptăm folosind acest sistem efectuăm practic un
procedeu asemănător decompresiei datelor comprimate prin metoda de com-
presie Huf f man.
Marele dezavantaj al acestui sistem este acela că nu poate să cripteze
dacât acele şiruri care corspund unor cuvinte ı̂n limbajul generat de gramatică
şi doar după ce construim gramatica şi codificăril Huffman putem spune dacă
mesajul poate fi criptat cu ajutorul acestei chei.
Se impune deci găsirea unei metode de extindere a acestui sistem, care să
elimine aceste dezavantaje (sau să le minimizeze).
3.2. EXTINDEREA SISTEMULUI 27

3.2 Extinderea sistemului


O condiţie esenţială care trebuie pusă este ca măcar o variabilă X dintr-o
gramatică să aibă două producţii asociate. Dacă acest lucru se ı̂ntâmplă,
putem fi siguri că folosind această gramatică ı̂n procesul de criptare, vom
putea cripta un mesaj având cel puţin un bit (acel ascuns cănd se derivează
variabila X. De asemenea, se impune condiţia:

∀X ∈ N ∃w ∈ Σ∗ , X =⇒ w (3.1)

Plecăm de la presupunerea că orice cuvănt din L(G) reprezintă o entitate


de un anumit fel (de exemplu o expresie aritmetică). Atunci, pentru a putea
genera cuvinte oricăt de lungi, trebuie să legăm cumva aceste cuvinte ı̂ntre
ele (de exemplu prin cuvinte de legătură). De aceea o dată fiind o gramatică
G = (N, Σ, S, P ), o extindem la următoarea gramatică:

G1 = (N ∪ {S1 , Xleg }, Σ ∪ Σleg , S1 , P ∪ {S1 −→ S1 Xleg S, S1 −→ S} ∪ Pleg )

ı̂n care:
• S1 este noul simbol de start
• Xleg este variabila care reprezintă legăturile ı̂ntre entităţi
• Σleg este alfabetul utilizat ı̂n producţiile lui Xleg
• Pleg este mulţimea de producţii asociate lui Xleg . Acestei mulţimi de
producţii i se asociază o codificare Huffman ca pentru orice altă vari-
abilă.
Obesrvăm că dacă Xleg are doar o producţie asociată (X −→ α), putem
să-l eliminăm şi să-l ı̂nlocuim cu α ı̂n singura producţie ı̂n care apare, caz ı̂n
care gramatica ar fi:

G1 0 = (N ∪ {S1 }, Σ ∪ Σleg , S1 , P ∪ {S1 −→ S1 αS, S1 −→ S})

Pentru a putea cripta acum orice şir vom proceda ı̂n felul următor:
1 La folosirea variabilei S1 ı̂n derivare nu se ascunde nici un bit, codificarea
atasată ei fiind Ø.
2 completăm mesajul criptat cu un şir de biţi care indică sfărşitul mesajului.
3 În mod implicit, la derivarea variabilei S1 se foloseşte producţia S1 −→
S1 Xleg S.
28 CAPITOLUL 3. SISTEMUL DE CRIPTARE

4 după ascunderea ı̂ntregului mesaj, pentru a ı̂ncheia derivarea, derivăm


fiecare variabilă rămasă ı̂n criptat ı̂ntr-un şir w ∈ Σ∗

5 la decriptare, se va reţine din şirul de biţi rezultat doar ceea ce se găseşte


ı̂naintea indicatorului de sfărşit de fişier.

Folosirea observaţiei 3 ne asigură că putem cripta şiruri oricăt de lungi


(gramatica este recursivă şi folosim această recursivitate).
Observaţia 4 ne asigură că procedura care relizează criptarea este un
algoritm (se termină).
Observaţia 2 ne asigură că putem recupera şirul intact la decriptare.
În concluzie, prin această exetnsie, noul sistem de criptare rezultat poate
realiza criptarea oricărui mesaj. Voi da mai jos algoritmii de criptare/decriptare
şi apoi voi arăta cum se aplică aceştia pe un exemplu particular.

3.3 Algoritmii de criptare şi decriptare


3.3.1 Algoritmul de criptare
Mai ı̂ntâi să arătăm acum cum putem construi cuvinte (rezonabil de mici)
ı̂n care poate deriva orice neterminal. Avem nevoie de ele la sfârşitul proce-
sului de criptare (obs. 4). Pentru aceasta dăm următorul algoritm:

Algoritmul 3.1: cuvinte(G)

Intrare: G = (N, Σ, S, P ) Gramatică care respectă condiţia 3.1

Iesire: P 0 mulţime care conţine producţii de forma X −→ w, w ∈ Σ∗ , cel


puţin una pentru fiecare variabilă a lui G.

P 0 ←− P \{A −→ αAβ}
(eliminăm producţiile cu recursie imediată)

cât timp apar neterminale ı̂n derapta producţiilor

pentru toate producţiile A −→ αXβ ∈ P 0 , X ∈ N


dacă există o producţie X −→ w, w ∈ Σ∗
pentru toate producţiile X −→ w, w ∈ Σ∗
P 0 ←− P 0 ∪{A −→ αwβ}
P 0 ←− P 0 \{A −→ αwβ}
3.3. ALGORITMII DE CRIPTARE ŞI DECRIPTARE 29

Teorema 3.1: Dacă condiţia 3.1 este ı̂ndeplinită, procedura cuvinte este
un algoritm şi se termină cu ieşirea dorită.
Demonstraţie:

• Condiţia 3.1 asigură existenţa a cel puţin unui cuvănt pentru fiecare
variabilă.

• Finititudinea algoritmului rezultă din faptul că neterminalele se ı̂nlocuiesc


doar cu şiruri de terminale.

• Faptul că algoritmul nu ciclează ı̂ntr-o stare intermediară este dat de


condiţia că gramatica nu are simboluri inutilizabile.

Se porneşte de la simbolul de start S1 şi se efectuează doar derivări drepte.


Dacă codificarea lui S1 nu este vidă, la derivare alegem acea producţie al cărei
cod este prefix ı̂n textul clar şi avansăm ı̂n textul clar sărind peste acest cod.
Apoi procedeul se repetă, ţinând cont de observaţiile din secţinuea anterioară.
Acum dăm algoritmul care realizează acest lucru folosind procedura getN extChar
(algoritmul 2.3.2) şi procedura cuvinte definită mai sus:

Algoritmul 3.2: cripteaza(sir, G, H)

P 0 ←− cuvinte(G)

sir ←− sir < EOF >

criptat ←− S1

index ←− 0

cât timp index ≤ |sir|

A ←− cea mai din dreapta variabilă


dacă A = S1 ı̂nlocuieşte S1 cu S1 SXleg S
altfel
α ←− getN extChar(index, HA ), unde HA e arborele asociat lui
A
ı̂nlocuieşte A cu α ı̂n criptat

pentru toate variabilele rămase ı̂n criptat

A ←− cea mai din dreapta variabilă


30 CAPITOLUL 3. SISTEMUL DE CRIPTARE

ı̂nlocuieşte A folosind o producţie oarecare din P 0

return criptat

Datorită observaţiior din secţiunea anterioară, algoritmul se termină generând


un element al lui L(G) şi ascunzând biţii din sir.
Observaţii:

• Variabila index se modifică (creşte) ı̂n procedura getN extChar.

• Dacă arborele are un singur nod, acela este şi rădăcină şi frunză şi este
singurul şir ı̂n care se poate deriva, deci se ı̂nlocuieşte făra a ascunde
nici un bit.

• Cu cât arborii Huffman au ı̂naltime mai mare (i.e. sunt mai multe
alegeri de făcut la un moment dat) cu atât putem ascunde mai mulţi
biţi.

• Datorită derivărilor drepte, se produce şi o amestecare a ordinii biţilor


ı̂n textul criptat.

3.3.2 Procesul de decriptare


Dat fiind un text criptat w ∈ L(G) vrem să obţinem textul clar care ı̂i
corespunde. Deoarece G este LR(k), pentru orice cuvânt ı̂n L(G) parserul
determină şirul (unic) de derivări drepte prin care se obţine acel cuvănt.
Înlocuim apoi fiecare producţie din şirul de derivări cu codul corespunzător
ei din H şi obţinem un şir de biţi care conţine mesajul iniţial. Nu ne rămâne
decât să considerăm mesajul doar pănâ la ı̂ntâlnirea marcajului < EOF >.
Prezentăm sub formă de algoritm implementarea observaţiilor precedente.
Algoritmul de decriptare foloseşte procedură parsare (1.1), precum şi proce-
dura cod (algoritmul 2.3.2).

Algoritmul 3.3: Decripteaza(w, G, H)

Intrare: w textul criptat, (G, (H)) cheia de criptare.

Iesire: clar textul clar corespunzător lui w, sau eroare dacă w nu e recunos-
cut ca text criptat.

dacă !parseaza(w, G, actiune, goto, π)


return eroare

clar1 ←− ””
3.4. SIGURANŢA SISTEMULUI 31

cât timp π = iπ 0

Fie A −→ α producţia cu numărul i


c ←− cod(α, HA ), unde HA e arborele de codificare asociat lui A
clar1 ←− clar1 + c
π ←− π 0

determină clar de lungime minimă cu proprietatea clar < EOF > prefix al
lui clar1

dacă ∃clar return clar


altfel return eroare

Deoarece procedura parseaza este un algoritm, execuţia ei se termină şi


produce un şit finit de etichete ale producţiilor folosite la derivare. Acest şir
de etichete este transformat printr-o singură parcurgere ı̂ntr-un şir finit de
biti. Din acest nou şir este extras un prefix reprezentând textul clar.
Datorită acestor observaţii, putem afirma că procedura decripteaza este
algoritm, si realizează decriptarea unui şir dat la intrare.
Pentru a face ı̂ntelese mai bine procedeele de criptare/decriptare, am
inclus un exemplu detaliat ı̂n anexa C.

3.4 Siguranţa sistemului


3.4.1 Analiza teoretică a securităţii sistemului
Securitatea acestui tip de criptare se bazează pe dificultatea găsirii acelei
gramaticii care a generat un text, adică a arborelui de parsare asociat textu-
lui. Într-adevăr, se poate găsi o gramatică care să genereze un text, dar sunt
foarte multe gramatici care pot genera acelaşi text. Iar la producţii diferite
se asociază arbori Huffman diferiţi, deci si criptări diferite.
Problema revine la a determina exact acea gramatică cu care este produs
textul. Dacă ar exista un algoritm ı̂n timp determinist polinomial care să
ı̂nveţe să genereze arborele de parsare pentru un text dat, atunci acest algo-
ritm ar putea să fie antrenat să prezică şi apartenenţa unui şir la limbajul
generat de o gramatică.

Teorema 4.2: Fie A un algoritm care poate ı̂nvăţa să genereze arborele
de parsare şi fie G1 o gramatică. Atunci cu acest algoritm se poate prezice
apartenenţa unui şir la L(G1 )
32 CAPITOLUL 3. SISTEMUL DE CRIPTARE

Demonstraţie: Considerăm G1 = (N1 , Σ, S1 , P1 ) şi fie G2 = (N2 , Σ, S2 , P2 ) o


altă garmatică peste acelasi alfabet. Fie G = (N, Σ, S, P ), unde: N = N1 ∪
N2 ∪ {S} şi P = P1 ∪ P2 ∪ {S −→ S1 ,S −→ S2 }. Antrenăm algoritmul
A cu exemple din L(G), şi arborii lor de parsare. Algoritmul A ı̂nvăţă să
genereze arborele de parsare pentru orice şir w ∈ L(G). Atunci ∀w ∈ L(G)
A determină dacă S derivă ı̂n S1 sau ı̂n S2 , adică dacă w ∈ L(G1 ) sau nu.

Dar, precum afirmă umătoarea teoremă, corolar ı̂n [AK91], dacă inver-
sarea RSA-ului e o problemă intratabilă, atunci nu se poate ı̂nvăţa un pro-
gram să prezică apartenenţa unui şir la limbajul generat de o gramatică
neregulată. Dar mai ı̂ntâi, nişte definiţii pregătitoare.

Definiţia 4.1 (definiţii pregătitoare):


Fie X = {0, 1}∗
Prin reprezentare de concepte C ı̂ntelegem orice submulţime a lui X ×X.
Pentru un element hu, xi ∈ C, u e un nume de concept şi x un exemplu. Se
spune că x e membru al conceptului u.
Definim CDF A ca o mulţime de perechi hu, xi astfel ı̂ncât u este codarea bi-
nară a unui automat finit determinist M peste X şi x este un cuvânt acceptat
de M .
În mod asemănător se definesc şi C2DF A , CN F A şi CCF G corespunzătoare au-
tomatelor infinite şi gramaticilor independente de context.
Reuniunile finite de AFD sunt reprezentate de C∪DF A iar intersecţiile finite
de AFD de C∩DF A .

Teorema 4.3: Dacă presupunem intratabilitatea oricărei din următoarele


trei probleme: testarea reziduurilor pătratice modulo un număr compus, in-
versarea criptării RSA sau factorizarea intregilor Blum, atunci următoarele
reprezentări de concepte nu sunt predictibile ı̂n timp polinomial folosind cereri
de apartenenţă: C∪DF A , C∩DF A , C2DF A , CN F A şi CCF G

3.4.2 Metode de ı̂mbunătăţire a securitătı̂i sistemului


Există diverse procedee care permit modificarea producţiilor unei gra-
matici astfel ı̂ncât criptarea obţinută folosind noua gramatică să difere de
criptarea obţinută folosind gramatica iniţială.
Astfel de procedee sunt expansiunile, contracţiile şi permutările.
3.4. SIGURANŢA SISTEMULUI 33

Expansiunea
Expansiunea: Fie A o variabilă şi αi , i = 1, n expresiile ı̂n care derivă A.
Fie αik , k = 1, m un subsir al lui αi . Pentru orice producţie B −→ β1 Aβ2 ,
adăugăm producţiile B −→ β1 αik β2 . La sfârşit, ştergem producţiile A −→
αik .

Contracţia
Contracţia este un procedeu invers expansiunii (care adaugă noi variabile
gramaticii).

Permutarea
Permutarea constă ı̂n permutarea producţiilor unei variabile, din care
rezultă modificarea arborilor Huffman, deci şi a criptării.
Aceste modificări pot fi efectuate simultan de către cei doi parteneri care
comunică folosind un generator de numere pseudo-aleatoare sincronizat (cu
aceeaşi sămânţa). Aceasta sămânţă are valoarea unei chei suplimentare de
criptare.
Detalii privind aceste procedee se gasesc in [Way96].
34 CAPITOLUL 3. SISTEMUL DE CRIPTARE
Capitolul 4

Concluzii

Sistemul prezentat este destul de bun, ı̂n sensul că pentru anumite chei
poate fi comparat cu RSA-ul sau cu alte sisteme puternice de criptare.
Pentru o implementare pe internet a acestui sistem vezi [SPAM].
Dezavantaje:
• faptul ca o gramatică trebuie sa fie destul de elaborată pentru a-i păcăli
pe cei ce pot intercepta mesajele
• e necesar un schimb prealabil de chei pe un canal sigur
• datorită mărimii lor, cheile nu se pot schimba
• nu se ştie ce gramatici au puterea de criptare echivalentă cu RSA (deşi
se ştie că există)
Avantaje:
• cu ajutorul acestui sistem se poate ascunde informaţie ı̂n text aparent
inofensiv.
• asa cum am arătat mai sus deşi cheile nu se pot schimba prea des, ele
se pot transforma
• este uşor de proiectat o gramatică (realizarea unei gramatici necesită
puţine noţiuni teoretice) şi depinde doar de imaginaţia celui ce o crează.
Indicaţii pentru construirea unei gramatici ”bune”
• Gramatica trebuie să fie construită astfel ı̂ncât să simuleze o situaţie
din viaţa reală bazată pe repetiţie cum ar fi comentariul uni meci sau
povestirea unei telenovele sau un basm, sau ca ı̂n exemplul nostru un
discurs de candidatură. Oricum, sunt multe domenii care implică o
oarecare rutină (mai ales privite din afară)

35
36 CAPITOLUL 4. CONCLUZII

• Cu cât mai multe variabile sunt, cu atât mai bine. Adică se poate merge
cu construcţia textului până ls structura frazei, sau chiar a cuvântului.

• este bună folosirea a cât mai multe producţii pentru o variabilă pentru
a putea ascunde cât mai multă informaţie. Dacă avem 2n producţii
pentru o variabilă, atunci derivând-o putem ascunde n biţi. Putem
folosi fraze asemănătoare, sinonime, etc.

• mulţimea neterminalelor dintr-o producţie să fie cât mai mică pentru
ca să ascundem căt mai mult cu căt mai puţine cuvinte. (de aceea
exemplu dat e doar ı̂n scop didactic)

Informaţia (şirul de biţi) trebuie să fie aleatoare, de aceea se recomandă o


preprocesare care să randomizeze intrarea (ori o altă criptare, ori o arhivare).
Prezentăm ca exemplu de cheie pentru acest sistem, care realizează o
criptare eficientă (fără modificarea dimensiunii iniţiale).
G = (N, Σ, S, P ), unde:

• N = {Ai : i = 0, 255} mulţimea variabilelor;

• Σ = {tj : j = 0, 255} mulţimea caracterelor ASCII;

• S este una din variabile (să zicem A0 ;

• Producţiile sunt de forma Ai −→ tj Ak1 . . . Ak(ij) : i, j = 0, 255.

Această gramatică pemiterea ascunderea a 8 biţi de informaţie la fiecare


alegere, producând un singur caracter (deci tot 8 biţi) ceea ce ı̂nseamnă o
conservare a mărimii textului, una din cerinţele unui bun sistem de criptare.
Bibliografie

[Way96] Wayner, Peter, Disappearing Cryptography, Being and Nothingness


on the Net

[Ata01] Atanasiu, Adrian, curs de teroria codurilor

[AK91] Angluin, D., Kharitonov, M., When won’t memebership queries


help?, ACM Press 1991

[KV89] Kearns, M., Valiant, L. G., Cryptographic Limitations on Learning


Boolean Formulae and Finite Automata

[AU72] Aho, A. V., Ullman, J. D., The Theory of Parsing, Translation And
Compiling

[CLR90] Cormen, Th. H., Leiserson, Ch. E., Rivest R. R., Introduction to
Algorithms, MIT Press 1990

[SPAM] http://www.spammimic.com.

[SH] http://www.jjtc.com/Steganography/

[SS] http://www.tapr.org/

[MD] http://www89.pair.com/techinfo/Microdot/microdot.htm

37
38 BIBLIOGRAFIE
Anexa A

Coduri Huffman

Prezint aici un cod Huffman asociat frecvenţei literelor ı̂n limba engleză
care l-am completat cu < EOF > divizând nodul lui Z:

Frecv. Codul Frecv. Codul


Litera % Huffman Litera % Huffman
A 6.22 1011 O 6.06 1000
B 1.32 010100 P 1.87 00000
C 3.11 10101 Q 0.10 0101011100
D 2.97 01011 R 5.87 0111
E 10.53 001 S 5.81 0110
F 1.68 110001 T 7.68 1101
G 1.65 110000 U 2.27 00010
H 3.63 11001 V 0.70 0101010
I 6.14 1001 W 1.13 000011
J 0.06 01010111011 X 0.25 010101111
K 0.31 01010110 Y 1.07 000010
L 3.07 10100 Z 0.06 01010111010110
M 2.48 00011 < EOF > 0.00 01010111010111
N 5.73 0100 .

39
40 ANEXA A. CODURI HUFFMAN
Anexa B

Construcţia unei tabele de


parsare

Gramatica
Vom folosi ca exemplu de gramatică aceeaşi gramatică folosită şi ı̂n exem-
plul de criptare/decriptare, deoarece ı̂n procesul de decriptare avem nevoie
şa parsăm şirul criptat. Gramatica este:
0 S 0 −→ S1 $ 13 C −→ C1
1 S1 −→ S1 ; E 14 C −→ 0
2 S1 −→ E 15 C1 −→ 1
3 E −→ E + T 16 C1 −→ 2
4 E −→ T 17 C1 −→ 3
5 T −→ T ∗ F 18 C1 −→ 4
6 T −→ F 19 C1 −→ 5
7 F −→ (E) 20 C1 −→ 6
8 F −→ N 21 C1 −→ 7
9 N −→ C1 N0 22 C1 −→ 8
10 N −→ 0 23 C1 −→ 9
11 N0 −→ N0 C
12 N0 −→ λ
Această gramatică este extensia gramaticii expresiilor aritmetice simple
cu numere naturale separate de ’;’. Mai jos, prezint paşii de construie a
mulţimii configuraţiilor, apoi tabelele actiune şi goto.

41
42 ANEXA B. CONSTRUCŢIA UNEI TABELE DE PARSARE

I0 I7
C1 −→ .1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ 4 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$
C1 −→ .2 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
goto(I0 , 3) = I8
C1 −→ .3 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .4 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 I8
C1 −→ .5 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ 3 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$
C1 −→ .6 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .7 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 goto(I0 , 2) = I9
C1 −→ .8 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .9 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 I9
E −→ .E + T ;$|; |+ C1 −→ 2 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$
E −→ .T ;$|; |+ goto(I0 , 1) = I10
F −→ .( E ) ;$| ∗ |; |+
F −→ .N ;$| ∗ |; |+ I10
N −→ .0 ;$| ∗ |; |+ C1 −→ 1 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$
N −→ .C1 N0 ;$| ∗ |; |+
S1 −→ .E ;$|; goto(I0 , C1) = I11
S1 −→ .S1 ; E;$|; I11
S −→ .S1 ;$ N −→ C1 .N0;$| ∗ |; |+
T −→ .F ;$| ∗ |; |+ N0 −→ . ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
T −→ .T * F ;$| ∗ |; |+ N0 −→ .N0 C;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
goto(I0 , 0) = I1 goto(I0 , N ) = I12
I1 I12
N −→ 0 .;∗| + |; |$ F −→ N .;∗| + |; |$
goto(I0 , 9) = I2 goto(I0 , () = I13
I2 I13
C1 −→ 9 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$ C1 −→ .1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
goto(I0 , 8) = I3 C1 −→ .2 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .3 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
I3 C1 −→ .4 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ 8 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$ C1 −→ .5 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .6 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
goto(I0 , 7) = I4
C1 −→ .7 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
I4 C1 −→ .8 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ 7 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$ C1 −→ .9 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
E −→ .E + T;)|+
goto(I0 , 6) = I5 E −→ .T ;)|+
F −→ ( .E ) ;$| ∗ |; |+
I5 F −→ .( E ) ;)| ∗ |+
C1 −→ 6 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$ F −→ .N ;)| ∗ |+
goto(I0 , 5) = I6 N −→ .0 ;)| ∗ |+
N −→ .C1 N0;)| ∗ |+
I6 T −→ .F ;)| ∗ |+
C1 −→ 5 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |; |$ T −→ .T * F ;)| ∗ |+
goto(I0 , 4) = I7 goto(I0 , F ) = I14
43

I14 goto(I18 , C1) = I11


T −→ F .;∗| + |; |$ goto(I18 , N ) = I12
goto(I0 , T ) = I15 goto(I18 , () = I13
goto(I18 , F ) = I14
I15 goto(I18 , T ) = I15
E −→ T . ;$|; |+ goto(I18 , E) = I19
T −→ T .* F;$| ∗ |; |+
I19
goto(I0 , E) = I16
E −→ E .+ T ;$|; |+
I16 S1 −→ S1 ; E .;$|;
E −→ E .+ T;$|; |+
goto(I19 , +) = I20
S1 −→ E . ;$|;
goto(I0 , S1) = I17 I20
C1 −→ .1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
I17 C1 −→ .2 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
S −→ S1 . ;$ C1 −→ .3 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
S1 −→ S1 .; E;$|; C1 −→ .4 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
goto(I17 , ; ) = I18 C1 −→ .5 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .6 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
I18 C1 −→ .7 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .8 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .2 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .9 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .3 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 E −→ E + .T;$|; |+
C1 −→ .4 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 F −→ .( E ) ;$| ∗ |; |+
C1 −→ .5 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 F −→ .N ;$| ∗ |; |+
C1 −→ .6 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 N −→ .0 ;$| ∗ |; |+
C1 −→ .7 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 N −→ .C1 N0;$| ∗ |; |+
C1 −→ .8 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 T −→ .F ;$| ∗ |; |+
C1 −→ .9 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 T −→ .T * F ;$| ∗ |; |+
E −→ .E + T ;$|; |+
E −→ .T ;$|; |+ goto(I20 , 0) = I1
F −→ .( E ) ;$| ∗ |; |+ goto(I20 , 9) = I2
F −→ .N ;$| ∗ |; |+ goto(I20 , 8) = I3
N −→ .0 ;$| ∗ |; |+ goto(I20 , 7) = I4
N −→ .C1 N0 ;$| ∗ |; |+ goto(I20 , 6) = I5
S1 −→ S1 ; .E;$|; goto(I20 , 5) = I6
T −→ .F ;$| ∗ |; |+ goto(I20 , 4) = I7
T −→ .T * F ;$| ∗ |; |+ goto(I20 , 3) = I8
goto(I20 , 2) = I9
goto(I18 , 0) = I1 goto(I20 , 1) = I10
goto(I18 , 9) = I2 goto(I20 , C1) = I11
goto(I18 , 8) = I3 goto(I20 , N ) = I12
goto(I18 , 7) = I4 goto(I20 , () = I13
goto(I18 , 6) = I5 goto(I20 , F ) = I14
goto(I18 , 5) = I6 goto(I20 , T ) = I21
goto(I18 , 4) = I7
goto(I18 , 3) = I8 I21
goto(I18 , 2) = I9 E −→ E + T .;$|; |+
goto(I18 , 1) = I10 T −→ T .* F ;$| ∗ |; |+
44 ANEXA B. CONSTRUCŢIA UNEI TABELE DE PARSARE

goto(I21 , ∗) = I22 goto(I13 , 8) = I27

I22 I27
C1 −→ .1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ 8 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
C1 −→ .2 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .3 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 goto(I13 , 7) = I28
C1 −→ .4 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .5 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 I28
C1 −→ .6 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 C1 −→ 7 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
C1 −→ .7 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 goto(I13 , 6) = I29
C1 −→ .8 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .9 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9 I29
F −→ .( E ) ;$| ∗ |; |+ C1 −→ 6 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
F −→ .N ;$| ∗ |; |+
N −→ .0 ;$| ∗ |; |+ goto(I13 , 5) = I30
N −→ .C1 N0;$| ∗ |; |+
T −→ T * .F ;$| ∗ |; |+ I30
C1 −→ 5 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
goto(I22 , 0) = I1
goto(I22 , 9) = I2 goto(I13 , 4) = I31
goto(I22 , 8) = I3
goto(I22 , 7) = I4 I31
goto(I22 , 6) = I5 C1 −→ 4 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
goto(I22 , 5) = I6
goto(I13 , 3) = I32
goto(I22 , 4) = I7
goto(I22 , 3) = I8 I32
goto(I22 , 2) = I9 C1 −→ 3 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
goto(I22 , 1) = I10
goto(I22 , C1) = I11 goto(I13 , 2) = I33
goto(I22 , N ) = I12
goto(I22 , () = I13 I33
goto(I22 , F ) = I23 C1 −→ 2 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)

I23 goto(I13 , 1) = I34


T −→ T * F .;$| ∗ | + |;
I34
goto(I16 , +) = I20 C1 −→ 1 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
goto(I15 , ∗) = I22
goto(I13 , E) = I24 goto(I13 , C1) = I35

I24 I35
E −→ E .+ T;)|+ N −→ C1 .N0;)| ∗ |+
F −→ ( E .) ;$| ∗ |; |+ N0 −→ . ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
N0 −→ .N0 C;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
goto(I13 , 0) = I25
goto(I13 , N ) = I36
I25
N −→ 0 .;∗| + |) I36
goto(I13 , 9) = I26 F −→ N .;∗| + |)

I26 goto(I13 , () = I37


C1 −→ 9 .;1|2|3|4|5|6|7|8|9|0| ∗ | + |)
45

I37 goto(I40 , 7) = I28


C1 −→ .1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 6) = I29
C1 −→ .2 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 5) = I30
C1 −→ .3 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 4) = I31
C1 −→ .4 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 3) = I32
C1 −→ .5 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 2) = I33
C1 −→ .6 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , 1) = I34
C1 −→ .7 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , C1) = I35
C1 −→ .8 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , N ) = I36
C1 −→ .9 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I40 , () = I37
E −→ .E + T;)|+ goto(I40 , F ) = I41
E −→ .T ;)|+
F −→ ( .E ) ;)| ∗ |+
F −→ .( E ) ;)| ∗ |+ I41
F −→ .N ;)| ∗ |+ T −→ T * F .;+| ∗ |)
N −→ .0 ;)| ∗ |+
N −→ .C1 N0;)| ∗ |+
T −→ .F ;)| ∗ |+
T −→ .T * F ;)| ∗ |+ goto(I37 , E) = I42
goto(I13 , F ) = I38

I38 I42
T −→ F .;∗| + |) E −→ E .+ T;)|+
F −→ ( E .) ;)| ∗ |+
goto(I13 , T ) = I39

I39
E −→ T . ;)|+
T −→ T .* F;)| ∗ |+ goto(I37 , 0) = I25
goto(I37 , 9) = I26
goto(I39 , ∗) = I40 goto(I37 , 8) = I27
goto(I37 , 7) = I28
I40 goto(I37 , 6) = I29
C1 −→ .1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , 5) = I30
C1 −→ .2 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , 4) = I31
C1 −→ .3 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , 3) = I32
C1 −→ .4 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , 2) = I33
C1 −→ .5 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , 1) = I34
C1 −→ .6 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , C1) = I35
C1 −→ .7 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , N ) = I36
C1 −→ .8 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , () = I37
C1 −→ .9 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 goto(I37 , F ) = I38
F −→ .( E ) ;)| ∗ |+ goto(I37 , T ) = I39
F −→ .N ;)| ∗ |+ I43
N −→ .0 ;)| ∗ |+ g(42,))=43
F −→ ( E ) .;∗| + |)
N −→ .C1 N0;)| ∗ |+
T −→ T * .F ;)| ∗ |+
goto(I40 , 0) = I25
goto(I40 , 9) = I26 goto(I42 , +) = I44
goto(I40 , 8) = I27
46 ANEXA B. CONSTRUCŢIA UNEI TABELE DE PARSARE

I44 I46
C1 −→ .1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C −→ .0 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .2 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C −→ .C1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .3 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .1 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .4 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .2 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .5 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .3 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .6 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .4 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .7 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .5 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .8 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .6 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .9 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9 C1 −→ .7 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
E −→ E + .T;)|+ C1 −→ .8 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
F −→ .( E ) ;)| ∗ |+ C1 −→ .9 ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
F −→ .N ;)| ∗ |+ N −→ C1 N0 .;)| ∗ |+
N −→ .0 ;)| ∗ |+ N0 −→ N0 .C ;)| ∗ | + |0|1|2|3|4|5|6|7|8|9
N −→ .C1 N0;)| ∗ |+
T −→ .F ;)| ∗ |+
T −→ .T * F ;)| ∗ |+ goto(I46 , 0) = I47

I47
C −→ 0 .;∗| + |0|9|8|7|6|5|4|3|2|1|)

goto(I44 , 0) = I25
goto(I44 , 9) = I26 goto(I46 , 9) = I26
goto(I44 , 8) = I27 goto(I46 , 8) = I27
goto(I44 , 7) = I28 goto(I46 , 7) = I28
goto(I44 , 6) = I29 goto(I46 , 6) = I29
goto(I44 , 5) = I30 goto(I46 , 5) = I30
goto(I44 , 4) = I31 goto(I46 , 4) = I31
goto(I44 , 3) = I32 goto(I46 , 3) = I32
goto(I44 , 2) = I33 goto(I46 , 2) = I33
goto(I44 , 1) = I34 goto(I46 , 1) = I34
goto(I44 , C1) = I35 goto(I46 , C1) = I48
goto(I44 , N ) = I36
goto(I44 , () = I37 I48
goto(I44 , F ) = I38 C −→ C1 .;∗| + |0|9|8|7|6|5|4|3|2|1|)
goto(I44 , T ) = I45

goto(I46 , C) = I49
I45
E −→ E + T .;)|+ I49
T −→ T .* F ;)| ∗ |+ N0 −→ N0 C .;∗| + |0|9|8|7|6|5|4|3|2|1|)
I50
g(24,))=50
F −→ ( E ) .;∗| + |; |$

goto(I45 , ∗) = I40 goto(I24 , +) = I44


goto(I35 , N 0) = I46 goto(I11 , N 0) = I51
47

I51
C −→ .0 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C −→ .C1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .1 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .2 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .3 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .4 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .5 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .6 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .7 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .8 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
C1 −→ .9 ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
N −→ C1 N0 .;$| ∗ |; |+
N0 −→ N0 .C ;$| ∗ |; | + |0|1|2|3|4|5|6|7|8|9
goto(I51 , 0) = I52

I52
C −→ 0 .;∗| + |; |0|9|8|7|6|5|4|3|2|1|$
goto(I51 , 9) = I2
goto(I51 , 8) = I3
goto(I51 , 7) = I4
goto(I51 , 6) = I5
goto(I51 , 5) = I6
goto(I51 , 4) = I7
goto(I51 , 3) = I8
goto(I51 , 2) = I9
goto(I51 , 1) = I10
goto(I51 , C1) = I53

I53
C −→ C1 .;∗| + |; |0|9|8|7|6|5|4|3|2|1|$
goto(I51 , C) = I54

I54
N0 −→ N0 C .;∗| + |; |0|9|8|7|6|5|4|3|2|1|$
48 ANEXA B. CONSTRUCŢIA UNEI TABELE DE PARSARE

Tabela goto

( ) * ; + 0 1 2 3 4 5 6 7 8 9 C C1 E F N N0 S1 T
0 13 · · · · 1 10 9 8 7 6 5 4 3 2 · 11 16 14 12 · 17 15
1 · · · · · · · · · · · · · · · · · · · · · · ·
2 · · · · · · · · · · · · · · · · · · · · · · ·
3 · · · · · · · · · · · · · · · · · · · · · · ·
4 · · · · · · · · · · · · · · · · · · · · · · ·
5 · · · · · · · · · · · · · · · · · · · · · · ·
6 · · · · · · · · · · · · · · · · · · · · · · ·
7 · · · · · · · · · · · · · · · · · · · · · · ·
8 · · · · · · · · · · · · · · · · · · · · · · ·
9 · · · · · · · · · · · · · · · · · · · · · · ·
10 · · · · · · · · · · · · · · · · · · · · · · ·
11 · · · · · · · · · · · · · · · · · · · · 51 · ·
12 · · · · · · · · · · · · · · · · · · · · · · ·
13 37 · · · · 25 34 33 32 31 30 29 28 27 26 · 35 24 38 36 · · 39
14 · · · · · · · · · · · · · · · · · · · · · · ·
15 · · 22 · · · · · · · · · · · · · · · · · · · ·
16 · · · · 20 · · · · · · · · · · · · · · · · · ·
17 · · · 18 · · · · · · · · · · · · · · · · · · ·
18 13 · · · · 1 10 9 8 7 6 5 4 3 2 · 11 19 14 12 · · 15
19 · · · · 20 · · · · · · · · · · · · · · · · · ·
20 13 · · · · 1 10 9 8 7 6 5 4 3 2 · 11 · 14 12 · · 21
21 · · 22 · · · · · · · · · · · · · · · · · · · ·
22 13 · · · · 1 10 9 8 7 6 5 4 3 2 · 11 · 23 12 · · ·
23 · · · · · · · · · · · · · · · · · · · · · · ·
24 · 50 · · 44 · · · · · · · · · · · · · · · · · ·
25 · · · · · · · · · · · · · · · · · · · · · · ·
26 · · · · · · · · · · · · · · · · · · · · · · ·
27 · · · · · · · · · · · · · · · · · · · · · · ·
28 · · · · · · · · · · · · · · · · · · · · · · ·
29 · · · · · · · · · · · · · · · · · · · · · · ·
30 · · · · · · · · · · · · · · · · · · · · · · ·
31 · · · · · · · · · · · · · · · · · · · · · · ·
32 · · · · · · · · · · · · · · · · · · · · · · ·
33 · · · · · · · · · · · · · · · · · · · · · · ·
34 · · · · · · · · · · · · · · · · · · · · · · ·
35 · · · · · · · · · · · · · · · · · · · · 46 · ·
36 · · · · · · · · · · · · · · · · · · · · · · ·
37 37 · · · · 25 34 33 32 31 30 29 28 27 26 · 35 42 38 36 · · 39
38 · · · · · · · · · · · · · · · · · · · · · · ·
39 · · 40 · · · · · · · · · · · · · · · · · · · ·
40 37 · · · · 25 34 33 32 31 30 29 28 27 26 · 35 · 41 36 · · ·
41 · · · · · · · · · · · · · · · · · · · · · · ·
42 · 43 · · 44 · · · · · · · · · · · · · · · · · ·
43 · · · · · · · · · · · · · · · · · · · · · · ·
44 37 · · · · 25 34 33 32 31 30 29 28 27 26 · 35 · 38 36 · · 45
45 · · 40 · · · · · · · · · · · · · · · · · · · ·
46 · · · · · 47 34 33 32 31 30 29 28 27 26 49 48 · · · · · ·
47 · · · · · · · · · · · · · · · · · · · · · · ·
48 · · · · · · · · · · · · · · · · · · · · · · ·
49 · · · · · · · · · · · · · · · · · · · · · · ·
50 · · · · · · · · · · · · · · · · · · · · · · ·
50 · · · · · 52 10 9 8 7 6 2 4 3 2 54 53 · · · · · ·
51 · · · · · · · · · · · · · · · · · · · · · · ·
52 · · · · · · · · · · · · · · · · · · · · · · ·
53 · · · · · · · · · · · · · · · · · · · · · · ·
54 · · · · · · · · · · · · · · · · · · · · · · ·

Legenda
număr i deplasare la starea i
· eroare
49

Tabela actiune
$ ( ) * ; + 0 1 2 3 4 5 6 7 8 9
0 · d · · · · d d d d d d d d d d
1 10 · · 10 10 10 · · · · · · · · · ·
2 23 · · 23 23 23 23 23 23 23 23 23 23 23 23 23
3 22 · · 22 22 22 22 22 22 22 22 22 22 22 22 22
4 21 · · 21 21 21 21 21 21 21 21 21 21 21 21 21
5 20 · · 20 20 20 20 20 20 20 20 20 20 20 20 20
6 19 · · 19 19 19 19 19 19 19 19 19 19 19 19 19
7 18 · · 18 18 18 18 18 18 18 18 18 18 18 18 18
8 17 · · 17 17 17 17 17 17 17 17 17 17 17 17 17
9 16 · · 16 16 16 16 16 16 16 16 16 16 16 16 16
10 15 · · 15 15 15 15 15 15 15 15 15 15 15 15 15
11 12 · · 12 12 12 12 12 12 12 12 12 12 12 12 12
12 8 · · 8 8 8 · · · · · · · · · ·
13 · d · · · · d d d d d d d d d d
14 6 · · 6 6 6 · · · · · · · · · ·
15 4 · · d 4 4 · · · · · · · · · ·
16 2 · · · 2 d · · · · · · · · · ·
17 A · · · d · · · · · · · · · · ·
18 · d · · · · d d d d d d d d d d
19 1 · · · 1 d · · · · · · · · · ·
20 · d · · · · d d d d d d d d d d
21 3 · · d 3 3 · · · · · · · · · ·
22 · d · · · · d d d d d d d d d d
23 5 · · 5 5 5 · · · · · · · · · ·
24 · · d · · d · · · · · · · · · ·
25 · · 10 10 · 10 · · · · · · · · · ·
26 · · 23 23 · 23 23 23 23 23 23 23 23 23 23 23
27 · · 22 22 · 22 22 22 22 22 22 22 22 22 22 22
28 · · 21 21 · 21 21 21 21 21 21 21 21 21 21 21
29 · · 20 20 · 20 20 20 20 20 20 20 20 20 20 20
30 · · 19 19 · 19 19 19 19 19 19 19 19 19 19 19
31 · · 18 18 · 18 18 18 18 18 18 18 18 18 18 18
32 · · 17 17 · 17 17 17 17 17 17 17 17 17 17 17
33 · · 16 16 · 16 16 16 16 16 16 16 16 16 16 16
34 · · 15 15 · 15 15 15 15 15 15 15 15 15 15 15
35 · · 12 12 · 12 12 12 12 12 12 12 12 12 12 12
36 · · 8 8 · 8 · · · · · · · · · ·
37 · d · · · · d d d d d d d d d d
38 · · 6 6 · 6 · · · · · · · · · ·
39 · · 4 d · 4 · · · · · · · · · ·
40 · d · · · · d d d d d d d d d d
41 · · 5 5 · 5 · · · · · · · · · ·
42 · · d · · d · · · · · · · · · ·
43 · · 7 7 · 7 · · · · · · · · · ·
44 · d · · · · d d d d d d d d d d
45 · · 3 d · 3 · · · · · · · · · ·
46 · · 9 9 · 9 d d d d d d d d d d
47 · · 14 14 · 14 14 14 14 14 14 14 14 14 14 14
48 · · 13 13 · 13 13 13 13 13 13 13 13 13 13 13
49 · · 11 11 · 11 11 11 11 11 11 11 11 11 11 11
50 7 · · 7 7 7 · · · · · · · · · ·
51 9 · · 9 9 9 d d d d d d d d d d
52 14 · · 14 14 14 14 14 14 14 14 14 14 14 14 14
53 13 · · 13 13 13 13 13 13 13 13 13 13 13 13 13
54 11 · · 11 11 11 11 11 11 11 11 11 11 11 11 11

Legenda
număr i reduce producţia cu eticheta i
d deplasare
A acceptare
· eroare
50 ANEXA B. CONSTRUCŢIA UNEI TABELE DE PARSARE
Anexa C

Exemplu de aplicare a
criptării/decriptării

Cheia de criptare
Gramatica din componenţa chei de criptare este B. Observăm că această
gramatică respecţă condiţiiie extensiei unei gramatici din 3.2.
Iată acum o posibilă alegere a lui H:
HS1 S1 −→ S1 ; E λ HC C −→ C1 0
S1 −→ E λ C −→ 0 1
HE E −→ E + T 1 HC1 C1 −→ 1 011
E −→ T 0 C1 −→ 2 000
HT T −→ T ∗ F 0 C1 −→ 3 101
T −→ F 1 C1 −→ 4 0100
HF F −→ (E) 0 C1 −→ 5 111
F −→ N 1 C1 −→ 6 001
HN N −→ C1 N0 1 C1 −→ 7 100
N −→ 0 0 C1 −→ 8 110
HN0 N0 −→ N0 C 0 C1 −→ 9 0101
N0 −→ λ 1
Se observă că producţiilor S1 −→ S1 ; E şi S1 −→ E li se asociază codul
vid, precum am arătat la procedeeul de extindere al sistemului. În rest,
la derivarea celorlalte variabile se poate ascunde un singur bit, cu excepţia
variabilei C1 cu care se pot ascunde 3 sau 4 biţi.

Textul clar
Vom considera un mesaj ca fiind un text ı̂n limba engleză din care s-au
eliminat spaţiile şi semnele de punctuaţie şi s-au transformat toate literele

51
52ANEXA C. EXEMPLU DE APLICARE A CRIPTĂRII/DECRIPTĂRII

litere mari. Acestui mesaj i se aplică funcţia de codificare Huffman bazată


pe tabela din anexa A. Rezultatul obţinut este textul clar.
Pentru acest exemplu vom considera textul Make love not War. Acesta
suferă următoarele transformări:

• eliminarea spaţiilor şi transformarea literelor ı̂n litere mari

M AKELOV EN OT W AR

• aplicarea funcţiei de codificare Huffman (rezultă textul clar)

00011 1011 01010110 001 10100 1000 0101010 001

0100 1000 1101 000011 1011 0111

procesul de criptare

După aplicarea procedurii cuvinte, mulţimea de producţii P 0 va arăta


cam aşa (se poate proba uşor urmărind paşii algoritmului):
C1 −→ 1|2|3|4|5|6|7|8|9
C −→ 0|1|2|3|4|5|6|7|8|9
N0 −→ λ N −→ 0|1|2|3|4|5|6|7|8|9
F −→ 0|1|2|3|4|5|6|7|8|9
T −→ 0|1|2|3|4|5|6|7|8|9
E −→ 0|1|2|3|4|5|6|7|8|9
S1 −→ 0|1|2|3|4|5|6|7|8|9
F −→ (0)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)
Le-am aşezat ı̂n ordinea ı̂n care apar ı̂n P 0 pe durata execuţiei algoritmu-
lui.
Se adaugă la sfărşitul textului clar marcatorul de sfârşit de fişier adică
codul Huffman al lui < EOF > (01010111010111) Rezultă şirul:

00011 1011 01010110 001 10100 1000 0101010 001

0100 1000 1101 000011 1011 0111 01010111010111

Voi ilustra printr-un tabel paşii pe care ı̂i execută algoritmul păna se
ascunde tot textul clar, arătând la fiecare pas ce derivare se foloseşte şi ce
bit se ascunde.
53

criptat Producţia Biţii


folosită ascunsi
S1 S1 −→ S1 ; E λ
S1 ; E E −→ T 0
S1 ; T T −→ T ∗ F 0
S1 ; T ∗ F F −→ (E) 0
S1 ; T ∗ (E) E −→ (E + T ) 1
S1 ; T ∗ (E + T ) T −→ F 1
S1 ; T ∗ (E + F ) F −→ N 1
S1 ; T ∗ (E + N ) N −→ 0 0
··· ··· ···