Sunteți pe pagina 1din 19

Utilizarea materialelor este permisa numai cu referire la sursa si autor.

Nerespectarea dreptului de autor va duce la [Grusti, Peciali, Toska.] :(

CENTRUL DE EXCELENŢĂ ÎN INFORMATICĂ ŞI


TEHNOLOGII INFORMAŢIONALE

RSA TOOLKIT
HLD + LLD

versiunea 1.0 26/03/2018

Cine a sponsorizat:
Ioan Jeleascov

A efectuat:
Filip Florin
1. Introducere 2
2. HLD 3
2.1.1 Conceptul functional al setului de utilitare 3
2.1.2 Schema functionarii, interactiunea cu utilizatorul 3
2.1.3 Interactiunea componentelor 4
2.2.1 Mediul de programare 5
2.2.2 Pattern-urile arhitecturale 6
2.2.3 Mediile de programare 6
2.2.4 Maintenance 7
2.2.4.1 Atributele calitatii 7
2.2.4.2 Ciclul de viata 7
2.2.5 Subsisteme 8
2.2.6 Interactiunea Utilizator-Aplicatie 8
3. LLD 13
3.1 Structura codului sursa 13
3.2 Fisierele aplicatiei 13

1
1. Introducere

In prezentul raport voi prezenta un set de utilitare: 2


calculatoare de specializare ingusta, un generator de chei
private şi publice pentru sistemul de criptare RSA, un
codificator şi un decriptor RSA, scopul final al cărora este de a
permite studentilor verificarea corectitudinii calculelor
efectuate si, ca consecinta, criptarea/decriptarea unui mesaj,
comunicarea securizata prin canale de transmisie nesecurizate.
Avantajul acestui set este că el poate fi utilizat de
grupuri de persoane pentru a comunica prin intermediul unei
reţele nesigure, fără să fie nevoie de vreo pregătire din timp
pentru asigurarea securităţii mesajelor. Acest avantaj este
asigurat de faptul că este utilizată criptarea asimetrică RSA, şi
mesajele pot fi criptate cu ajutorul perechii de chei publice
partajate prin reţea şi această pereche e inutilă pentru
decriptarea mesajelor.
În calitate de dezavantaj participă faptul că dacă se va
utiliza pentru mesaje text, acestea vor fi nevoite sa fie scurte
deoarece în cazul mesajelor lungi acestea pot fi decriptate cu
ajutorul altor metode, care sunt destul de usoare, primitive dar
foarte eficiente.
Un alt dezavantaj al acestei aplicaţii poate fi considerat
faptul că şirul pentru criptare şi pentru decriptare îi este
transmis, în calitate de parametru, direct din consolă, iar în
acest caz, dacă şirul nu a fost luat în ghilimele, acesta poate fi
tratat de consolă ca un alt tip de date decât String, şi în acest
caz consola poate transmite aplicaţiei o valoare Boolean, Float
sau Integer.
Ultimul ar fi că setul va functiona numai atunci cand
toate caracterele din mesaj (original si criptat) vor fi afisabile
de consola, in caz contrar aplicatia nu va putea primi si afisa
aceste caractere si ele vor fi omise din mesajul sursa si criptat.

2
2. HLD

2.1.1 Conceptul functional al setului de utilitare

Setul de utilitare are urmatoarele functii:


1. Efectuarea calculelor de tipurile:
X ^ Y mod Z si X ^ (-1) mod Z ,
unde X, Y si Z apartin multimei numerelor reale.
2. Generarea perechilor de chei privare si perechilor de
chei in baza numerelor naturale (de dorit prime) primite
ca parametri.
3. Criptarea unui mesaj transmis ca parametru, pentru
aceasta utilizandu-se perechea de chei publice obtinuta
din generator, sau din alta parte.
4. Decriptarea unui mesaj transmis ca parametru, cu
utilizarea perechii de chei private obtinute din generator
sau din alta parte.

Atentionez faptul ca generarea perechilor de chei


private, perechile de chei publice, precum si criptarea si
decriptarea mesajelor de catre setul de utilitare se efectueaza pe
baza sistemului de criptare RSA (Rivest–Shamir–Adleman)
care este considerat eficient si in zilele noastre.

2.1.2 Schema functionarii, interactiunea cu utilizatorul

Setul de utilitare poate fi utilizat prin intermediul liniei


de comanda, ceea ce duce la faptul ca aplicatia lucreaza cu
fluxuri de date (siruri de caractere) primite de la utilizator si
returnate (afisate) utilizatorului.

3
In general, functionarea are loc dupa urmatorul
algoritm:
1. Apelul utilitarului necesar la moment, cu scrierea
parametrilor, ceea ce arata cam asa:
java Numele_Instrumentului_Dorit Parametrii
spre exemplu: java Cript Florin
2. Transmiterea altor parametri mai specifici necesari
functionarii cum ar fi perechea de chei publice. Aceasta
se face la cererea adresata utilizatorului de catre
aplicatie.

2.1.3 Interactiunea componentelor

Setul de utilitare este compus, dupa cum am mentionat


mai devreme, din componente numite utilite. Acestea sunt
reprezentate de: Criptor, decriptor, generator de chei, 2
calculatoare specifice. Pentru a demonstra intr-un mod mai clar
cum ele interactioneaza, voi prezenta algoritmul de lucru cu
ele:
Pentru a avea posibilitatea de a lucra, trebuie sa
utilizam sistemul RSA, care cere efectuarea calculelor de tipul:
X ^ Y mod Z si X ^ (-1) mod Z , aceste 2 tipuri de calcule si
sunt efectuate de calculatoarele specifice care sunt parti ale
setului. Ele au denumirile: Wolf si Wolf_1 respectiv, aceste
denumiri deriva de la denumirea aplicatiei cu functionalitate
similara care poarta denumirea de “Wolfram Alpha”.
Urmatorul lucru fara care nu putem continua este
reprezentat de perechile de chei publice si private. Acestea sunt
generate cu ajutorul instrumentului ce poarta denumirea de
KeyGen. Utilitarul in cauza genereaza o pereche de chei
privare si o pereche de chei publice pe care le obtine din
numerele parametri primite de la utilizator.
Dupa aceasta putem precede la criptarea unui mesaj.
Mesajul este transmis in calitate de parametru la utilizarea

4
instrumentului, iar perechea de chei publice este ceruta de
utilitar pe parcursul executiei sale, astfel se faciliteaza lucrul cu
aplicatia, evitandu-se neclaritati ce ar putea sa apara daca
perechea de chei ar trebui sa fie transmisa chiar in momentul
apelului utilitarului.
Finalmente, putem decripta un mesaj. Pentru aceasta
apelam decriptorul transmitandu-i, caparametru, sirul criptat,
iar mai apoi, el ne propune sa introducem perechea de chei
private care a fost generata simultan cu perechea de chei
publice de catre generatorul de chei si, in final, obtinem
mesajul original pe care l-am criptat utilizand perechea de chei
publice obtinuta din generatorul de chei.

Pana la urma, interactiunea componentelor este


reprezentata de faptul ca:

1. Toate utilitarele folosesc algoritmii din calculatoarele


specializate
2. Codificatorul si Decodificatorul utilizeaza, pentru
criptarea si decriptarea mesajelor, perechile de chei
publice si private generate de generatorul de chei.

2.2.1 Mediul de programare

Aplicatia a fost dezvoltata, in mare parte, prin


intermediul terminalului din sistemul de operare OS X El
Capitan, in calitate de editor de text utilizandu-se Vim-ul, iar in
calitate de compilator: utilitarul JavaC. Careva din ultimele
fisiere sursa erau, in continuare dezvoltate prin utilizarea
editorului de text oferit de aplicatia xCode, insa compilatorul
ramanea, datorita vitezei mari de lucru, instrumentul JavaC.

5
2.2.2 Pattern-urile arhitecturale

Arhtectura e realizata pe baza pattern-ului Event-


driven-model, functioneaza pe baza fluxului de date ce circula
dintre utilizator si aplicatie si pe baza evenimentelor de
confirmare a datelor introduse.

2.2.3 Mediile de programare

Pentru a programa am folosit urmatoarele medii:


1. xCode - in calitate de editor text
2. Terminal (OS X) pentru compilarea codului
3. Vim - pentru editarea textului si crearea fisierelor
Codul sursa a fost scris in intregine in limbajul Java,
fiind pus accent pe functionalitatea versiunii a 8-a, fiind cea
mai contemporana la momentul elaborarii setului de utilitare.
Compilarea codului sursa a fost asigurata de
compilatorul “JavaC” apelat din terminalul sistemului de
operare OS X El Capitan, pus la dispozitie de compania Apple.
Testarea setului de utilitare a avut loc in Terminalul
sistemului de operare OS X El Capitan, pentru care si este
destinat produsul.

6
2.2.4 Maintenance

2.2.4.1 Atributele calitatii

Aplicatia este “Developed for Last”, deci nu are bug-


uri, lucreaza cat de rapid poate lucra deoarece a fost folosit
compilatorul JavaC, iar algoritmul de calcul poarta denumirea
de “Algoritmul Euclid extins” ceea ce permite marirea
considerabila a vitezei de executie si micsorarea necesarului de
memorie.
Totusi, exista un “moment” ce trebuie tinut in cont in
timpul utilizarii aplicatiei: Aplicatia primeste datele de la
utilizator prin intermedul liniei de comanda. In acest caz, linia
de comanda poate interpreta sirul de caractere ca o expresie
aritmetica sau logica si, respectiv, sa transmita programului nu
sirul de caractere oferit de utilizator ci rezultatul expresiei
primite. Pentru a fi siguri ca aceste lucruri groaznice nu vor
avea loc, terbuie sa luam in ghilimele sirurile de caractere pe
care le transmitem aplicatiei, in cazul dat consola nu le va
putea considera expresii logice sau aritmetice si aplicatia va
primi sirul de caractere transmis de utilizator in original.

2.2.4.2 Ciclul de viata

Setul de utilitare a fost elaborat pentru utilizare in


cadrul procesului de invatamant si nu necesita versiuni
superioare.
Necatand la acestea, totusi, este posibila o dezvoltare
ulterioara a proiectului pentru facilitarea utilizarii acestuia in
cadrul conditiilor reale ce pot aparea un viata, adica in cadrul
comunicarii criptate, aici ma refer la evitarea afisarii tabelelor
de calcule si focusarea stricta pe viteza de lucru si pe rezultatul
criptarii/decriptarii + rezultatul generarii cheilor.

7
Aceasta ar putea fi numita upgrade si setul ar putea
primi versiunea 2.0, insa in cazul in care ar avea loc, va fi de
preferinta de a afirma despre produsul program obtinut ca
despre ceva nou, independent de setul de utilitare destinat sa
ajute elevii, acestea fiind 2 produse cu scopuri mult prea
diferite.
2.2.5 Subsisteme

Setul lucreaza pe baza sistemului de date “parsing”,


ceea ce inseamna ca functionalitatea sa este asigurata de
circulatia fluxului de date dintre utilitare, functii si, evident,
dintre utilizator, consola si setul de utilitare.

2.2.6 Interactiunea Utilizator-Aplicatie

In cazul in care setul de utilitare este utilizat cu scopul


demonstrarii utilitatii sale, sau cu scopul verificarii
corectitudinii calculelor in cadrul procesului de invatamant,
utilizarea sa va incepe cu utilitarul: “Wolf”.
Denumirea acestuia este prescurtarea de la “Wolfram
alpha” un alt instrument cu scop similar care, insa, lucreaza
foarte incet.
Apelarea acestuia este insotita, indata, de transmiterea,
in cadrul fluxului de date, a 3 numere, la discretia utilizatorului.
Este de dorit ca aceste 3 numere sa fie prime, deoarece in asa
caz vor fi cel mai bine pastrate beneficiile criptarii asimetrice
RSA. Rezultatul va arata cam asa:

In continuare, aceste numere sunt preluate de program

8
si sunt prelucrate in el prin utilizarea algoritmului ce poarta
denumirea de “Algoritmul Euclid extins”, care presupune
efectuarea calculului rezultatului printr-o metoda mult mai
rapida, care este detaliat prezentata chiar utilizatorului (care se
presupune a fi un student ce verifica corectitudinea calculelor
proprii).
Spre sfarsit, fluxul de date, trecand prin prelucrarea de
catre functii, este returnat, in forma scrisa (in consola),
utilizatorului sub forma unui “tabel” in care acesta poate vedea
rezultatele calculelor intermediare si rezultatul propriu-zis al
calculului.
Asemanatoare este si functionarea secundarului utilitar
ce poarta denumirea de “Wolf_1”, sensul careia este ca
efectueaza calcule de forma: A (-1) mod B, iata cum va arata
rezultatul lucrului acestuia:

Al 3-lea utilitar, ca si restul, nu este dependent de


primele doua, si nu interactioneaza cu acestea, in schimb
utilizeaza aceleasi functii ca si primele 2, mai exact utilizeaza
de mai multe ori functionalitatea fiecaruia din primele 2 pentru
a asigura utilizatorul cu rezultatul necesar. Acest utilitar, spre
deosebire de toate celelalte din set, nu primeste date in calitate
de parametri din motiv ca functionarea sa nu este atat de clara
intuitiv, si din motiv ca sunt necesare mai multe etape si mai
multe actiuni succesive din partea utilizatorului.
Modul de utilizare al acestuia e mai bine de vazut o
singura data decat de explicat de 10 ori. “KeyGen-ul” :
9
Denumirea acestuia vorbeste singura: Key Generator.
Utilizarea acestuia este extrem de simpla datorita
faptului ca utilizatorul este ghidat prin instructiuni oferite in
forma scrisa, in limba de stat.
Rezultatul, pe langa perechile de chei prorpiu zise,
include si tabelul in care sunt prezentate toate rezultatele
calculelor intermediare pe care trebuia sa le obtina studentul.
Prezenta acestora este foarte importanta deoarece astfel
utilizatorul poate vedea (daca e cazul) unde anume a gresit si
poate relua calculele din locul corespunzator evitand multe
calcule redundante.

In continuare vreau sa prezint cele mai importante


utilitare: “Cript” si “Decript” pentru care, de fapt, a si fost
lansat procesul elaborarii setului de utilitare, celelalte utilitare
fiind destinate numai pentru a facilita utilizarea acestora doua.

Utilitarul “Cript” este destinat criptarii mesajului primit


ca parametru din consola. Dupa primirea mesajului, utilitarul
indruma utilizatorul cu instructiuni referitor la actiunile pe care
acesta trebuie sa le intreprinda pentru obtinerea rezultatului
dorit. De fapt, aceste instructiuni sunt reprezentate de
rugamintea de a introduce perechea de chei publice, iata:

10
Atentionez faptul ca, in unele cazuri, este obligatorie
transmiterea mesajului in ghilimele, pentru a evita
transforamrea sirului de caractere, de catre consola, in
rezultatul vreunei expresii logice sau matematice.

In continuare, desigur, prezint functionarea ultimului


utilitar “Decript” care permite obinerea mesajului initial.
Atentionez aici necesitatea (inca mai mare) a utilizarii
ghilimelelor la transmiterea secventei de caractere ce reprezinta
mesajul criptat. Iata cum arata rezultatul functionarii:

11
</HLD> <!-- Multumesc Pentru Atentie! -->

12
3. LLD

3.1 Structura codului sursa

Codul sursa al setului actual nu este complex si,


respectiv, nu a necesitat careva structurare deosebita.
Majoritatea utilitarelor nici macar nu au functii definite
in interiorul codurilor sale sursa, acestea fiind inutile.
Exista, totusi si functii, ele vor fi observate in fisierele
ce vor urma.

3.2 Fisierele aplicatiei

Primul utilitar ce poate fi prezentat este: “Wolf”:


public class Wolf {
public static void main(String[] args){
System.out.println("Acum va fi calculat "+ args[0] + "^" +
args[1] + " mod " + args[2]);
int x = Integer.parseInt( args[0]);
int C = Integer.parseInt( args[1]);
int n = Integer.parseInt( args[2]);
long Z = 1;
String Ci = Integer.toString(C,2);
System.out.println("N.ord\tCi\tCalcule");
for(int i = Ci.length() - 1; i >= 0; i--) {
System.out.print(i + "\t" +
Ci.charAt(Ci.length() - i - 1) + "\t");
System.out.print("Z = Z ^ 2 mod n =
= = " + Z + " ^ 2 mod " + n + " = ");
Z = (Z * Z) % n;
if (Ci.charAt(Ci.length() - i - 1)
== '1') {
System.out.print(Z);
Z = (Z * x) % n;
System.out.println(" Ci == 1 => Z = Z *
x mod n = = = " +
Z + " * " + x + " mod " + n + " = " + Z);
}else{ System.out.println(Z); }
}
System.out.println (args[0] + "^" + args[1] + " mod " +
args[2] + " = " + Z);
}
}

13
Aici se efectueaza un calcul de forma A ^ B mod C.

14
Al 2-lea va fi “Wolf_1”, care face aproape acelasi lucru,
exceptie fiind faptul ca la culeaza expresii de forma:
A ^ (-1) mod C
Iata cum arata codul sursa al acestuia:
public class Wolf_1 {
public static void main(String[] args){
System.out.println("Acum va fi calculat "+ args[0] +
"^(-1) mod " + args[1]);

int b = Integer.parseInt( args[0]);


int n = Integer.parseInt( args[1]);

int n0 = n;
int b0 = b;
int t0 = 0;
int t = 1;
int q = n0 / b0;
int r = n0 - (q * b0);

System.out.println("n0" + "\t" + "b0" + "\t" + "q" + "\t" +


"r" + "\t" + "t0" + "\t" + "t" + "\t" + "temp");

while (r > 0) {
int temp = t0 - (q * t);
if (temp >= 0) {
temp = temp % n;
} else {
temp = n - ((-temp) % n);
}
System.out.println(n0 + "\t" + b0 + "\t" + q +
"\t" + r + "\t" + t0 + "\t" + t + "\t" + temp);
n0 = b0;
b0 = r;
t0 = t;
t = temp;
q = n0 / b0;
r = n0 - q * b0;
}
if (b0 != 1) {
System.out.println("b nu are inversa");
}else{
System.out.println(b + "^(-1) mod " + n + " = " + t);
}
}}

15
Urmeaza, evident, generatorul de chei, unde, deja, va fi
utilizata POO si programarea functionala, fiind initiat obiectul
clasei Scanner ce va permite citirea datelor de la tastatura (din
consola) si fiind declarate si utilizate functii. Iata fisierul:

Utilitarele “Cript” si “Decript” deasemenea nu au ezitat


sa utilizeze minunile oferite de POO si de Programarea
functionala.

16
17
18

S-ar putea să vă placă și