Documente Academic
Documente Profesional
Documente Cultură
Pentru a descifra un mesaj se calculeaz:
Algoritmul poate fi folosit i pentru semnatur electronic, folosind cheile invers. Dac o entitate
cripteaz un mesaj (sau mai degraba un hash al acestuia) cu cheia sa secret i ataeaz rezultatul
Figur 4. Crifrarea/Descifrarea
10
mesajului su, atunci oricine poate verifica, decriptnd cu cheia public a semnatarului i
comparnd rezultatul cu mesajul clar (sau cu hash-ul acestuia), c intr-adevar acea entitate este
autorul mesajului.
Exemplu criptare
Se genereaz mai nti cheile:
1. Se selecteaz dou numere prime p = 7 i q = 17.
2. Se calculeaz n = p*q = 7*17 = 119.
3. Se calculeaz (n) = (p-1)*(q-1) = 96.
4. Se alege e a. . e este relativ prim cu (n) = 96. n acest caz e = 5.
5. Se determin d astfel nct d*e = 1 mod 96 i d<96. Avem d = 77, deoarece 77*5 = 385 =
4*96+1.
6. Cheia public este (5,119), iar cheia private este (77,119).
Se consider textul clar M =19. Textul criptat va fi: C = 19
5
mod 119 = 2476099 mod 119 = 66.
11
Implementare
Algoritmul RSA este implementat n limbajul C# utiliznd ca i mediu de dezvoltare Visual Studio
2012. Proiectul este o aplicaie WPF care ofer utilizatorului o interfa pentru introducerea
textului ce trebuie criptat i decriptat.
Figur 5. Interfa aplicaie WPF
12
Aplicaia conine dou implementri ale algoritmului RSA, tocmai pentru a compara performana
celor dou metode. Utilizatorul i alege metoda de criptare prin selectarea unui element din
controlul Combobox.
Prima metod de criptare este cea oferit de librria limbajului de programare C#. Am utilizat
clasa RSACryptoServiceProvider ce are prezint metodele Encrypt() i Decrypt() pentru criptare,
respectiv decriptare.
static private void Encryption(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool
DoOAEPPadding)
{
try
{
using (var RSA = new RSACryptoServiceProvider())
{
RSA.ImportParameters(RSAKeyInfo);
_encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
}
catch (CryptographicException e)
{
Debug.WriteLine(e.Message);
}
}
Figur 6. Selectare metod de criptare
13
private static byte[] Decryption(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool
DoOAEPPadding)
{
try
{
byte[] decryptedData;
using (var RSA = new RSACryptoServiceProvider())
{
RSA.ImportParameters(RSAKeyInfo);
decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
}
return decryptedData;
}
catch (CryptographicException e)
{
Debug.WriteLine(e.ToString());
return null;
}
}
La apsarea butonului Criptare se realizeaz criptarea textului iniial i se afieaz timpul de
execuie:
var encryptedData = RsaProvider.Encryption(TbTextInitial.Text);
TbTextCriptat.Text = encryptedData;
LabelTimpExecutie.Content =
RsaProvider.ExecutionTimeEncryption.ToString();
La apsarea butonului Decriptare se realizeaz decriptarea textului, astfel c trebuie s obinem
textul iniial:
var decryptedData = RsaProvider.Decryption();
TbTextDecriptat.Text = decryptedData;
Un dezavantaj al acestei metode este faptul c mesajele ce se cripteaz au dimensiune foarte
mici (112 bytes). Timpul de executie a unui mesaj cu lungimea de 112 bytes este: 378
milisecunde.
14
Metoda a doua este o implementare proprie i comparativ cu prima metod are un timp de
execuie mult mai bun ( 11 secunde fa de 378 secunde pe acelai text).
Figur 7. Criptarea i decriptarea mesajului prin Metoda 1
15
Optimizarea algoritmului prin metoda 2 vine cu urmtoarele mbuntiri:
1. Generarea a dou numere aleatoare a cror primalitate este verificat cu metoda
MillerRabin. Aceasta este o metod probabilistic ce prezint urmtorul pseudocod:
Figur 8. Criptarea i decriptarea mesajului prin Metoda 2
16
Mai exact, aceast metod presupune gsirea unui anumit numr de martori care s ateste
primalitatea numerelor alese. Cu ct numrul de martori este mai mare cu att probabilitatea ca
numrul nostru s fie prim este mai mare. Pentru uurin s lum urmtorul exemplu.
S presupunem c vrem s determinm dac numrul n=221 este numr prim sau nu. Paii care
trebuie urmai sunt urmtorii:
Se calculeaz n-1=220=2
2
* 55 => s=2 i d=5 ( s-a descompus n puteri ale lui 2)
Se selecteaz un numr aleator a (martorul nostru). Fie a=174.
Se calculeaz:
2
0
= 174
55
221 = 47 1, 1
2
1
= 174
110
221 = 220 =
Conform algoritmului, martorul acesta nu este bun i trebuie cutat un altul.
Se alege un alt numr aleator a=137
Input: n > 3, an odd integer to be tested for primality;
Input: k, a parameter that determines the accuracy of the test
Output: composite if n is composite, otherwise probably prime
write n 1 as 2
s
d with d odd by factoring powers of 2 from n 1
WitnessLoop: repeat k times:
pick a random integer a in the range [2, n 2]
x a
d
mod n
if x = 1 or x = n 1 then do next WitnessLoop
repeat s 1 times:
x x
2
mod n
if x = 1 then return composite
if x = n 1 then do next WitnessLoop
return composite
return probably prime
17
Se calculeaz :
2
0
= 137
55
221 = 188 1, 1
2
1
= 137
110
221 = 205 1
Conform algoritmului, acestor martor returneaz faptul c numrul ales nu este prim.
Verificarea primalitii unui numr se realizeaz n clas PrimesProvider.
Cmpul _witnessLoops reprezint numrul de martori alei pentru testarea primalitii.
n metoda GenerateProbablyPrime se generez numere aleatoare i se returneaz primul
numr prim gsit.
public BigInteger GenerateProbablyPrime(int bitSize)
{
for (;;)
{
var number = RandomnessProvider.GenerateBigNumber(bitSize);
if (IsProbablePrime(number)) return number;
}
}
18
Primalitatea numrului generat aleator se verific cu ajutorul metodelor IsProbablePrime i
IsCompositeWitness. n prima metod se descompune numrul aleator, conform algoritmului
MillerRabin, n puteri ale lui 2 i prin apelul celei de-a doua metode se verific dac printre
martorii generai aleator este unul ce confirm dac numrul este prim sau nu.
public bool IsProbablePrime(BigInteger number)
{
if (number <= 3)
return number >= 2;
var exponent = number - 1;
var tailLength = 0;
while (exponent.IsEven)
{
exponent >>= 1;
++tailLength;
}
return !Enumerable
.Range(0, _witnessLoops)
.Any(
t =>
IsCompositeWitness(number,
RandomnessProvider.GenerateBigNumber(2, number - 2), exponent,
tailLength));
}
private bool IsCompositeWitness(BigInteger target, BigInteger witness, BigInteger
exponent, int tailLength)
{
var targetMinusOne = target - 1;
var x = BigInteger.ModPow(witness, exponent, target);
if (x == 1 || x == targetMinusOne) return false;
for(var i=0; i<tailLength-1; ++i)
{
x = BigInteger.ModPow(x, 2, target);
if (x == 1) return true;
if (x == targetMinusOne) return false;
}
return true;
}
19
2. Pentru a-l afla pe d(cheia privata) se foloseste algoritmul extins a lui Euclid.
Pseudo-cod
INPUT: dou numere naturale a, b cu a b.
OUTPUT: d = (a, b) si dou numere ntregi u, v cu d = au + vb.
1. Dac b = 0, atunci d a, u 1, v 0,
returneaz (d, u, v) si se oprete.
2. u1 1, u2 0, v1 0, v2 1
3. Ct timp b > 0 execut:
3.1. q [a/b], r a qb, u u1 qu2, v v1 bv2.
3.2. a b, b r, u1 u2, u2 u, v1 v2, v2 v.
3. d a, u u1, v v1 si returneaz (d, u, v)
Vom apela algoritmul lui Euclid cu parametrii:b,a%b,d,x0,y0.
Algoritm poate fi extins, in sensul gsirii x si y astfel incat a * x + b * y = d
Vom extinde procedura recursiva de calculare a cmmdc pentru a include si x si y. Calculam x si y
incepand de la "capatul recurentei". Daca b = 0, atunci a * 1 + b * 0 = a(cmmdc) evident, asa ca
initial x = 1 si y = 0.
Noi stim urmatoarele:
b * x0 + (a % b) * y0 = d
a * x + b * y = d
Trebuie sa aflam o solutie pentru x si y. Vom nota ca mai sus parte intreaga din a / b cu c.
a%b=a-b*c
b * x0 + (a - b * c) * y0 = a * x + b * y
b * (x0 - c * y0 - y) = a * (x - y0)
O solutie este acum evidenta
x0 - c * y0 - y = 0, De unde rezulta y = x0 - c * y0
x - y0 = 0, De unde rezulta x = y0
20
public static BigInteger ModularMultiplicativeInverse(this BigInteger number, BigInteger
mod)
{
var lastX = BigInteger.One;
var currX = BigInteger.Zero;
var dividend = number%mod;
var divisor = mod;
while (divisor.Sign > 0)
{
var quotient = dividend/divisor;
var remainder = dividend%divisor;
if (remainder.Sign <= 0)
break;
var nextX = lastX - currX*quotient;
lastX = currX;
currX = nextX;
dividend = divisor;
divisor = remainder;
}
return currX.Sign < 0 ? currX + mod : currX;}
Diagrama de clase
21
Securitate
Problema decriptrii unui mesaj criptat cu RSA este denumit problema RSA. Aceast const n
obinerea radicalului de ordin e modulo n, unde e i n au proprietatea c n este produsul a dou
numere prime mari p i q, iar e este prim cu produsul dintre p-1 i q-1. n acest moment, cea mai
eficient metod de a realiza descriptarea este descompunerea n factori primi a lui n, i
obinerea astfel a cheii secrete d pe baza lui e. Astfel, este demonstrat c dificultatea spargerii
unui mesaj criptat cu RSA nu este mai dificil dect problema factorizrii. Nu a fost descoperit
nc o alt soluie general a problemei RSA, dar nici nu s-a demonstrat matematic c nu exist
o alt soluie.
Factorizarea ntregilor prin metodele comune ajut la gsirea soluiilor n timp util doar pentru
numere mici. Pentru numere mari, algoritmii de factorizare, cu complexitate exponenial, dau
soluia dup foarte mult timp. Cea mai rapida metod de factorizare a ntregilor este algoritmul
general al ciurului cmpurilor de numere. Cel mai mare numr factorizat vreodat prin acest
algoritm, rulat n anul 2005, de ctre specialiti de la Agenia Federal German pentru
Securitatea Tehnologiei Informaiei, are 200 de cifre zecimale, iar reprezentarea binar a
factorilor primi obtinui ocup 663 de bii. Cheile de criptare RSA cele mai sigure au lungimi de
peste 1024 de bii.
Atacul RSA prin metoda forei brute, adic ncercarea fiecrei chei secrete posibile, consum
chiar mai mult timp dect factorizarea.
22
Tipuri de atacuri
Atac cu text cifrat ales
O serie de atacuri se pot aplica asupra implementrilor algoritmului RSA. Aceste atacuri nu sunt
asupra algoritmului propriu-zis ci asupra protocoalelor. Trebuie contientizat faptul c folosirea
algoritmului RSA nu este sucient iar detaliile sunt de maxim importan. Vom prezenta dou
cazuri de atac cu text cifrat ales.
Cazul 1
Interceptorul pasiv E, va monitoriza comunicaiile lui A i va stoca toate mesajele c cifrate cu
ajutorul cheii publice a lui A. Interceptorul dorete ca s citesc mesajele clare. Matematic acest
lucru revine la a aa pe m astfel ca:
m = c
d
Pentru recuperarea lui m se va alege pentru nceput un numr aleatoriu r < n. Interceptorul va
intra n posesia cheii publice e alui A i va calcula:
x r
e
mod n,
y x
c
mod n,
t r
1
mod n.
Acum interceptorul E va fora pe A s semneze y folosind cheia sa privat. Utilizatorul A trebuie
s semneze mesajul. Reinem faptul c A nu a fost anterior n posesia lui y. Utilizatorul A va trimite
lui E :
23
u y
d
mod n
Interceptorul E va calcula:
1
Cazul 2
Fie T un notar public digital. Dac A dorete un document notarial atunci acesta va apela la T.
Notarul T va semna documentul cu ajutorul semnturii digitale RSA i-l va trimite lui A (nu se
utilizeaz funcii hash : notarul T va cifra mesajul cu ajutorul cheii sale private). Interceptorul M
dorete ca notarul T s semneze un document m pe care acesta refuz iniial s-l semneze (de
exemplu un document care nu are o tampil de timp corect). Pentru nceput M va alege un
numr aleatoriu x i va calcula:
y x
e
mod n
Acesta va putea s acceseze pe e deoarece este cheia public a notarului T. Interceptorul M va
calcula:
m y m mod n
pe care l trimite lui T s-l semneze. Notarul T va returna lui M mesajul semnat:
m
d
mod n
Falsicatorul M va calcula:
24
(
)
1
(
Slbiciunea ce a fost exploatat a fost aceea c exponenierea produsului este produsul
exponenierilor.
( )
Atac cu ajutorul modulelor comune
O posibil implementare a RSA d aceeai valoare n, dar valori diferite pentru exponenii e i d.
Cea mai evident problem este aceea c dac acelai mesaj este cifrat cu doi exponeni diferii
(dar avnd aceleai module), iar acei exponeni sunt numere relativ prime, atunci textul clar
poate fii descoperit fr a cunoate exponeni de descifrare.
Fie m mesajul n clar. Cele dou chei publice de cifrare sunt e1 i e2. Modulul comun este n. Cele
dou mesaje cifrate sunt:
1
1
2
2
Criptanalistul cunoate n, e1, e2, c1 i c2. n continuare se prezint cum se calculeaz mesajul
clar m.
Intruct e1 i e2 sunt relativ prime, algoritmul extins al lui Euclid poate gsi r i s astfel nct:
r e1 + s e2 = 1
Presupunnd r negativ, algoritmul extins al lui Euclid poate folosit din noupentru a calcula c1
-1
.
Astfel:
25
(
1
1
)
Exist alte dou atacuri mpotriva acestui tip de sistem. Unul dintre ele folosete o metod
probabilist pentru a factoriza pe n. Cellalt folosete un algoritm determinist pentru a calcula
ceva din cheia secret fr a factoriza modulul.
Concluzie: Nu distribuii niciodat un modul de cifrare n comun unui grup de utilizatori.
Aplicaii ale algoritmului RSA
Un prim domeniu unde ntlnim algoritmi de criptare, i n special RSA, este cel al
telecomunicaiilor: telefoane publice cu cartele electronice sau telefoanele mobile (protocoale
de autentificare a persoanei apelate).
De asemenea, se mai utilizeaz n :
Domeniul sntii, prin intermediul cardurilor electronice care s conin istoricul
medical al unui individ
Securitatea naional: cri de identitate, paapoarte, legitimaii magnetice
Economie: cardurile bancare, comerul electronic
Informatic: confidenialitatea potei electronice, a informaiilor de pe o pagin de web,
pe scurt, dreptul la intimitate.
Unde vom ntlni nevoia de semntur i identificare electronic, vom ntlni criptarea prin RSA.
26
Bibliografie
1. http://andrei.clubcisco.ro/cursuri/f/f-sym/5master/aac-
atcns/Criptografia%20asimetrica.pdf
2. http://en.wikipedia.org/wiki/RSA
3. https://hermes.info.uvt.ro/home/iordan@info.uvt.ro/Curs_MASR/Curs_7.pdf
4. http://rft.forter.ro/2009_3_t/06-arm/03.htm
5. http://www.securitatea-informatiilor.ro/solutii-de-securitate-it/algoritmul-de-criptografie-
rsa/
6. http://www.security.ase.md/publ/ro/pubro23/pubro23.html