Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare, Informatic i Microelectronic

Raport
Lucrarea de laborator nr. 2
La disciplina: Securitatea informaional
Tema: Algoritmul RSA

A efectuat: St. gr. TI-121 uiu Ion

A verificat: lect.univ. Cozma Nicolae

Chiinu 2015
Scopul lucrrii
n aceast lucrare de laborator se va studia i analiza metodologii i algoritmi de criptare, i
anume algoritmul de criptare RSA.

Sarcina propus
Drept sarcin a lucrrii de laborator s-a propus a fi implementat algoritmul de criptare RSA ntr-un
limbaj de programare la dorin.

Algoritmul RSA
RSA este un algoritm criptografic cu chei publice, primul algoritm utilizat atat pentru criptare, cat
si pentru semnatura electronica. Algoritmul a fost dezvoltat in 1977 si publicat in 1978 de Ron Rivest,
Adi Shamir si Leonard Adleman la MIT si isi trage numele de la initialele numelor celor trei autori.
Puterea sa criptografica se bazeaza pe dificultatea problemei factorizarii numerelor intregi, problema la
care se reduce criptanaliza RSA si pentru care toti algoritmii de rezolvare cunoscuti au complexitate
exponentiala. Exista insa cateva metode de criptanaliza care ocolesc factorizarea efectiva, exploatand
maniere eronate de implementare efectiva a schemei de criptare.

Functionare
RSA este un algoritm de criptare pe blocuri. Aceasta inseamna ca atat textul clar cat si cel cifrat
sunt numere intre 0 si n-1, cu un n ales. Un mesaj de dimensiune mai mare decat log n este impartit in
segmente de lungime corespunzatoare, numite blocuri, care sunt cifrate rand pe rand. De asemenea, ca
algoritm criptografic cu chei publice, functioneaza pe baza unei perechi de chei legate matematic intre
ele: o cheie publica, cunoscuta de toata lumea, si una secreta, necunoscuta decat de detinatorul acesteia.

Generarea cheilor
Se genereaza doua numere prime, de preferat mari, p si q, se calculeaza n = pq si = (p-1)(q-1).
Se alege un intreg aleator e, 1 < e < , astfel incat cmmdc(e, ) = 1. Perechea (n, e) este cheia publica.
Folosind algoritmul lui Euclid extins, se calculeaza intregul d, unicul cu proprietatea ca de 1mod .
(n, d) constituie cheia secreta.
Decizia cu privire la care dintre e si d este cheia publica si care este cea secreta este, din punct de
vedere matematic, arbitrara, oricare dintre cele doua numere poate juca oricare dintre roluri. In practica
insa, pentru a mari viteza de criptare, si intrucat dintre cele doua numere eeste cel ales arbitrar, e este
cheia publica iar valoarea sa este aleasa un numar mic, de regula 3, 17 sau 65537 (2 16+1). Aceasta
conduce la un numar minim de inmultiri, deci la o performanta sporita, deoarece toate aceste numere au
doar doua cifre 1 in reprezentarea lor binara.
Criptarea si decriptarea
Presupunand ca mesajul clar este sub forma unui numar m, mai mic decat n, atunci mesajul cifrat,
notat cu c este
c = me (mod n)
unde e este cheia publica a destinatarului mesajului. Pentru a decripta mesajul, destinatarul isi foloseste
cheia sa secreta d, care are proprietatea foarte importanta ca:
de 1 mod
Astfel, mesajul clar este recuperat calculand:
m = cd (mod n)
Oricine poate cripta mesaje cu cheia publica a destinatarului, dar numai acesta din urma poate decripta,
deoarece trebuie sa foloseasca cheia sa secreta.
Algoritmul poate fi folosit si pentru semnatura electronica, folosind cheile invers. Daca o entitate
cripteaza un mesaj (sau mai degraba un hash al acestuia) cu cheia sa secreta si ataseaza rezultatul
mesajului sau, atunci oricine poate verifica, decriptand cu cheia publica a semnatarului si comparand
rezultatul cu mesajul clar (sau cu hash-ul acestuia), ca intr-adevar acea entitate este autorul mesajului.

Demonstratia formulei de decriptare


Formula de decriptare este valabila, deoarece:
cd mod n = med mod ned 1 (mod ) si, fiindca = (p 1)(q -1), atuncied 1 (mod p 1) sied 1 (mod
q 1)
si deci se poate scrie:
ed = k (p 1) + 1ed = h (q 1) + 1
Dar, cum p este prim, si deci prim cu m, conform micii teoreme a lui Fermat, rezulta ca
mp-1 1 (mod p)
Astfel,
med = mk(p-1)+1 = (mp-1)km = 1km = m.
Daca p nu este totusi prim cu m, atunci inseamna ca m este multiplu al lui p, caz trivial in care m este
congruent cu 0 modulo p, si deci ridicat la orice putere este congruent cu 0 si deci cu el insusi.
Analog si pentru q, med m (mod q)
De aici, conform teoremei chinezesti a resturilor, deoarece p si q sunt numere prime, rezulta ca
med m (mod pq)

Performante in implementari
In general, deoarece se bazeaza pe o operatie destul de costisitoare din punct de vedere al timpului
de calcul si al resurselor folosite, si anume exponentierea modulo n, viteza RSA este mult mai mica decat
a algoritmilor de criptare cu cheie secreta. Bruce Schneier estima, pe baza unor calcule efectuate in anii
1990, ca o implementare hardware de RSA este de 1000 de ori mai lenta decat o implementare DES, iar
in software, RSA este de 100 de ori mai lent.
Exista anumite modificari care pot aduce performante sporite, precum alegerea unui exponent de
criptare mic, care astfel reduce calculele necesare criptarii, rezolvand in acelasi timp si unele probleme de
securitate. De asemenea, operatiile cu cheia secreta pot fi accelerate pe baza teoremei chinezesti a
resturilor, daca se stocheaza p, q si unele rezultate intermediare, folosite des. Cu toate acestea,
imbunatatirile nu sunt mari, iar ordinul de marime al diferentelor de performanta fata de implementarile
algoritmilor cu cheie secreta ramane acelasi. De aceea, in sistemele de comunicatie in timp real, in care
viteza de criptare si decriptare este esentiala, RSA se foloseste doar la inceputul comunicatiei, pentru a
transmite cheia secreta de comunicatie, care ulterior este folosita intr-un algoritm cu cheie secreta, cum ar
fi 3DES sau AES.

Securitatea
Problema decriptarii unui mesaj criptat cu RSA este denumita problema RSA. Aceasta consta in
obtinerea radicalului de ordin e modulo n, undee si n au proprietatea ca n este produsul a doua numere
prime mari p siq, iar e este prim cu produsul dintre p-1 si q-1. In acest moment, cea mai eficienta metoda
de a realiza aceasta este descompunerea in factori primi a lui n, si obtinerea astfel a cheii secrete d pe baza
lui e. Astfel, este demonstrat ca dificultatea spargerii unui mesaj criptat cu RSA nu este mai dificila decat
problema factorizarii. Nu a fost descoperita inca o alta solutie generala a problemei RSA, dar nici nu s-a
demonstrat matematic ca nu exista o alta solutie.
Factorizarea intregilor prin metodele comune ajuta la gasirea solutiilor in timp util doar pentru
numere mici. Pentru numere mari, algoritmii de factorizare, cu complexitate exponentiala, dau solutia
dupa foarte mult timp. Cea mai rapida metoda de factorizare a intregilor, algoritmul general al ciurului
campurilor de numere, are o complexitate de o(ec((log n)1/3(log log n )2/3). Aici, c este un numar ce ia valori
in jur de 1,9 pentru numere de tipul lui n, adica numere cu doi factori primi. Cel mai mare numar
factorizat vreodata prin acest algoritm, rulat in anul 2005, de catre specialisti de la Agentia Federala
Germana pentru Securitatea Tehnologiei Informatiei, are 200 de cifre zecimale, iar reprezentarea binara a
factorilor primi obtinuti ocupa 663 de biti.Cheile de criptare RSA cele mai sigure au lungimi de peste
1024 de biti.
Atacul RSA prin metoda fortei brute, adica incercarea fiecarei chei secrete posibile, consuma chiar mai
mult timp decat factorizarea.
Atacuri impotriva RSA
Desi securitatea algoritmului RSA consta in legatura dintre acesta si factorizarea intregilor, el
trebuie folosit cu grija in implementari, deoarece, in caz de folosire eronata, sistemele bazate pe RSA pot
fi atacate in anumite maniere care ocolesc factorizarea efectiva a modulului, atacatorul ajungand sa obtina
mesajul clar sau cheia secreta.

Mersul lucrarii:
In figura de mai jos este reprezentat fereastra din program unde intraducem P si Q care o ii vom folosi la
algoritm si dam click pe GeneratePQ (vezi figura1).

Figura 1 Generarea P si Q

Dupa ce am generat P si Q , numerele q si p se aleg aleator de program, apoi se calculeaza exponentul e


care reprezinta c.m.m.d.c.(e, )=1 . n reprezinta imultirea exponentilor p si q , pentru a decripta mesajul,
destinatarul isi foloseste cheia sa secreta d, care are proprietatea foarte importanta ca de 1 mod (vezi
figura 2).
Figura 2- Generarea n,fi,e,d

Figura 3 - Criptarea numarului

Rezultatul criptarii unui numar este demonstrat si poate fi realizat pe baza la cheia publica generata,
respectiv pentru decriptare folosim cheia privata.
Concluzie
n timpul efecturii lucrrii de laborator, sa fcut cunotin cu aspectele teoretice i practice de
utilizare a algoritmilor de criptare asimetrici a datelor, anume algoritmul RSA, cu scopul
aplicrii/implementrii acestuia ntr-un limbaj de programare.
Lucrarea n final a dezvoltat deprinderi att teoretice domeniul de utilizare i modurile de
aplicare a algoritmilor de cifrare, ct i deprinderi practice de utilizare a algoritmilor de criptare a datelor.
n timpul lucrului s-a struit s se ptrund n toate detaliile descrise n scopul lucrrii.
Bibliografie

1. Crypto Tool Project, accesat 29.11.2015, [Resursa electronica]. Regim de acces:


http://www.cryptoolonline.org/index.php?option=com_content&view=article&id=70&Itemid=80&lang
=en
2. RSA Algorithm accesat 29.11.2015, [Resursa electronica]. Regim de acces:
https://simple.wikipedia.org/wiki/RSA_(algorithm)

3. Cryptography: RSA Algorithm accesat 29.11.2015, [Resursa electronica]. Regim de acces:


http://courses.cs.vt.edu/~cs5204/fall00/protection/rsa.html
4. Alternative to BigInteger.ModPow(); in C# 29.11.2015, [Resursa electronica]. Regim de acces:
http://stackoverflow.com/questions/12097459/alternative-to-biginteger-modpow-in-c-sharp
5. Check if number is prime number 29.11.2015, [Resursa electronica]. Regim de acces:
http://stackoverflow.com/questions/15743192/check-if-number-is-prime-number
6. Simple RSA key generation 29.11.2015, [Resursa electronica]. Regim de acces:
https://asecuritysite.com/encryption/rsa
Anexa A
Cod sursa Algoritmul RSA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RSA_LAB
{

public class RSA


{

public Int32 p { get; set; } //numerele prime p si q


public Int32 q { get; set; }
public Int64 n { get; set; } // produsul pui p si q sau altfel numit modulul
public Int64 fi { get; set; } //functia euler
public Int64 e { get; set; } // exponenta publica sau cheia publica pentru criptare
public Int64 d { get; set; } // exponenta secreta sau cheia privata pentru decriptare

// Generarea cheilor
public void GenerateKeys()
{

//Calculam n = p*q;
n = p * q;

//Calculam fi = (p-1) * (q-1) sau functia Euler


fi = (p - 1) * (q - 1);

//Gasim e, 1 < e < fi, unde c.m.m.d.c. a lui e si f sa fie egal cu 1


e = random(2, fi - 1); //cheia privata e pentru criptare

while (Euclid(e, fi) != 1) //daca c.m.m.d.c. nu este egal cu 1, atunci alegem alt
numar e
{
e = random(2, fi - 1);
}

d = Euclid_extended(); //cheia privata d pentru decriptare

// Controlam daca parametrul este un numar prim


//daca este prim returneaza adevarat, daca nu atunci returneaza fals

public bool isPrime(Int32 a)


{
if ((a & 1) == 0) //daca (a si 1) este egal cu 0
{
if (a == 2)
{
return true;
}

else
{
return false;
}

for (int i = 3; (i * i) <= a; i += 2)


{
if ((a % i) == 0)
{
return false;
}
}

return a != 1;

// Generarea p si q
public void GeneratePQ()
{
p = random(100, 1000);
q = random(1001, 2000);

while (!isPrime(p)) //daca p nu este un numar prim atunci alegem alt numar
{
p = random(100, 300);
}

while (!isPrime(q)) //daca q nu este un numar prim atunci alegem alt numar
{

q = random(301, 500);

}
}

// Generarea numarului aleator


private Int32 random(Int32 min, Int64 max)
{
Random random = new Random();
return random.Next(min, (Int32)max);
}

// Algoritmul lui Euclid


// c.m.m.d.c. - Cel mai mare divizor comun unde sa introduce e si fi
private Int64 Euclid(Int64 a, Int64 b)
{
while (a != b) //creem un ciclu care va fi efectuat pina cind a este diferit de b
{
if (a >= b) a -= b; //daca a este mai mare sau egal cu b, atunci din a scadem b
else b -= a; //daca nu atunci din b scadem a
}

if (a > b) return b; //daca a este mai mare ca b, atunci returnam b care este
c.m.m.d.c.
else return a; //daca nu atunci returnam a, care este c.m.m.d.c.
}

// Algoritmul lui Euclid extins


// pentru cheia privata d pentru decriptare (cheia publica)
private Int64 Euclid_extended()
{
int k = 0; //cream o variabila de tip int

while ((1 + k * fi) % e != 0) //creem un ciclu care va fi efectuat pina cind


((k*fi+1) mod e) va fi diferit de 0
{
k++; //incrementam k

return (1 + k * fi) / e; //returnam rezultatul in Int64(long)

// Criptare: text necriptat la puterea e(cheia privata de criptare) mod n(cheia publica);
// Decriptare: text criptat la puterea d(cheia privata de decriptare) mod n(cheia
publica);
// La intrare avem numarul, cheia E sau D si modulul N;
private Int64 modpow(Int64 number, Int64 key, Int64 n)
{

long result = 1;

while (key > 0) //parcurgem un ciclu atit timp cit e este pozitiv
{

if ((key & 1) == 1) //daca cheia privata este egala cu 1


{

result = (result * number) % n; //atunci rezultatu va fi 1 la puterea


numarului de intrare mod n(cheia publica)

key >>= 1; //deplasam cheia privata cu o pozitie in dreapta

number = (number * number) % n; //ridicam la puterea 2 numarul de la intrare si


gasim mod din n

}
return result; //returnam numarul criptat sau deja decriptat
}

// Criptarea unui numar


public Int64 EncryptChar(Int64 m)
{
return modpow(m, e, n);
}

// Decriptarea unui numar


public Int64 DecryptChar(Int64 m)
{
return modpow(m, d, n);
}