Sunteți pe pagina 1din 26

1

Andra Carmina RADU


Claudia TUDOSIE

Criptosistemul RSA
28/05/2014


2


Cuprins
Scurt istoric ..................................................................................................................................... 3
Criptosistemul RSA ........................................................................................................................ 5
Cheie public. Cheie privat ....................................................................................................... 6
Generarea cheilor ........................................................................................................................ 7
Descrirea principiilor de cifrare i descifrare .............................................................................. 9
Exemplu criptare ....................................................................................................................... 10
Implementare ................................................................................................................................ 11
Securitate....................................................................................................................................... 20
Tipuri de atacuri ............................................................................................................................ 22
Atac cu text cifrat ales............................................................................................................... 22
Cazul 1 .................................................................................................................................. 22
Cazul 2 .................................................................................................................................. 23
Atac cu ajutorul modulelor comune .......................................................................................... 24
Aplicaii ale algoritmului RSA ..................................................................................................... 25
Bibliografie ................................................................................................................................... 26


















3


Scurt istoric


Criptografia este tiina scrierilor secrete. Ea folosete metode matematice pentru transformarea
datelor, n intenia de a ascunde coninutul lor sau de a le proteja mpotriva modificrii.
Criptografia are o lung istorie, confidenialitatea comunicrii fiind o cerin a tuturor timpurilor.
Drept dovad, ntlnim texte codificate nc din antichitate. Astfel, n 1900 .e.n., un scrib
egiptean utiliza simboluri n locul literelor obinuite, pentru a ascunde de priviri nedorite scrierile
sale. n 500 .e.n., scribii evrei cripteaz mesaje prin permutarea literelor alfabetului (A devine Z,
B devine Y, etc.), dnd natere limbajului atbash. n 50 .e.n., Iulius Cezar creeaz metoda ce-i
poart numele; aceasta const n a nlocui fiecare liter din alfabet cu cea de peste trei poziii
spre dreapta, cu reluarea alfabetului de la capt, acolo unde este cazul. Astfel, litera A devine D,
B devine E i aa mai departe. De fapt, el cripteaz textul utiliznd funcia afin xax+3. Fiabilitatea
acestei metode era asigurat n principal de noutatea ei, nimeni necunoscnd "trucul".
n zilele de azi astfel de metode nu mai sunt sigure, algoritmii de acest tip fiind spari cu destul
de mult uurin.
Orice criptare conine dou etape: mai nti, codarea mesajului pe care dorim s-l transmitem,
etap n care atribuim un numr fiecrei litere din mesaj (i transmiterea mesajului revine la
transmiterea unui ir de cifre, numit i cod), i criptarea codului, etap n care modificm codul
astfel nct acesta s nu poat fi reconstituit dect de persoana sau persoanele autorizate n acest
sens.
Astzi se cunosc dou tipuri de algoritmi de criptare: algoritmi simetrici (sau cu cheie secret), i
algoritmi asimetrici (sau cu cheie public). Algoritmii simetrici au la baz acelai principiu ca i
codul lui Cezar i anume substituia. Puterea lor const ns n faptul c se lucreaz cu secvene


4

de numere din ce n ce mai lungi, ghicirea combinaiei fiind astfel din ce n ce mai grea, necesitnd
foarte mult timp. La cifrarea i descifrarea unui cod simetric se folosete aceeai cheie, cunoscut
doar de cel care trimite mesajul i cel care trebuie s-l primeasc.
ns acest algoritm are i cteva dezavantaje: dac se pierde cheia sau dac este aflat, textul se
pierde sau este decriptat de persoane indezirabile; n plus, persoana care trimite mesajul, are
cheia pentru a-l decripta.
Aceste dou neajunsuri au fost rezolvate n 1976 de Whitfield Diffie i Martin Hellman, care
propun o nou metod de criptare: utilizarea unei funcii P definite pe mulimea numerelor
ntregi i inversa acesteia S. Dac cele dou funcii P i S sunt cunoscute, este uor de decriptat
orice mesaj codificat cu ajutorul funciei P. Dac ns nu cunoatem dect funcia P, dei putem
cripta mesajul, nu-l putem decripta, fiind foarte greu de aflat funcia S. Ceea ce ns nu au reuit
cei doi matematicieni a fost s gseasc o astfel de pereche de funcii (P, S). Dar acest obstacol a
fost depit destul de repede: n 1977, D. Rivest, A. Shamin i L. Adleman gsesc o soluie, cea
mai bun i cea mai utilizat astzi: criptografia RSA.








5

Criptosistemul RSA


Algoritmul RSA a fost inventat de ctre Ron Rivest, Adi Shamir i Leonars Adleman fiind studiat n
cadrul unor studii criptanalitice extinse. Securitatea RSA-ului se bazeaz pe dificultatea
factorizrii numerelor mari. Cheia public si cheia privat sunt funcie de o pereche de numere
prime mari(de 200 de c.ifre sau chiar mai mult). Recuperarea textului clar din cheia public i
textul cifrat este echivalent cu factorizarea produsului a dou numere prime.
Criptosistemul RSA se bazeaz pe urmtoarele dou adevruri:
este uor de fabricat dou numere prime p i q foarte mari (de exemplu, de 100 de
cifre);
dat un numr n=pq , unde p i q sunt numere prime suficient de mari, este foarte greu
de regsit p i q.

Puterea sa criptografic se bazeaz pe dificultatea problemei factorizrii numerelor ntregi,
problem la care se reduce criptanaliza RSA i pentru care toti algoritmii de rezolvare cunoscui
au complexitate exponenial. Exist ns cteva metode de criptanaliz care ocolesc factorizarea
efectiv, exploatnd maniere eronate de implementare efectiv a schemei de criptare.

Figur 1. Criptosistemul RSA


6

Cheie public. Cheie privat

n criptograa cu chei publice sunt dou tipuri de chei: o cheie public i o cheie privat (termenul
de cheie secret va folosit pentru criptograa simetric). Cele dou tipuri de chei nu se pot
deduce (computaional acest lucru se realizeaz ntr-un un timp foarte mare). Matematic, cele
dou chei sunt legate, ns cheia privat nu poate fi obinut din cheia public. n caz contrar,
orcine ar putea decripta mesajele destinate unui alt utilizator, fiindc oricine are acces la cheia
public a acestuia.
Criptograa cu chei publice se poate folosi att la asigurarea condenialittii ct i la asigurarea
autenticiii (semntura digital). Numai trei algoritmi sunt siguri, din punct de vedere
criptograc, pentru a folosii att la cifrare ct i la semntur digital: RSA, ElGamal i Rabi.
O analogie foarte potrivit pentru procesul de criptare cu cheie public este folosirea cutiei
potale. Oricine poate pune n cutia potal a cuiva un plic, dar la plic nu are acces dect posesorul
cheii de la cutia potal.
Un sistem criptografic (criptosistem) este compus din:
Mtext clar;
Ctext cifrat;
2 funcii inverse E() si D();
un algoritm care produce cheile Ke si Kd


7


Generarea cheilor

Perechea de chei se genereaz dup urmtorii pai:
1. Se genereaz dou numere prime, de preferat mari, p i q;
2. Se calculeaz n = pq i = (p-1)(q-1)
3. Se alege un ntreg aleator e, 1 < e < , astfel ncat cmmdc(e, ) = 1.
4. Se calculeaz ntregul d, unicul cu proprietatea c: de 1mod
Perechea (n, e) este cheia public, iar perechea (n, d) constituie cheia secret.
Decizia cu privire la care dintre e si d este cheia public i care este cea secret este, din punct de
vedere matematic, arbitrar, oricare dintre cele dou numere poate juca oricare dintre roluri. n
practic ns, pentru a mri viteza de criptare, i ntruct dintre cele dou numere e este cel ales
arbitrar, e este cheia public. Valoarea sa este aleas un numr mic, de regula 3, 17 sau 65537.
Figur 2. Strcutura criptosistem RSA


8

Aceasta conduce la un numr minim de nmuliri, deci la o performan sporit, deoarece toate
aceste numere au doar dou cifre 1 n reprezentarea lor binar.



Figur 3. Generarea cheilor


9


Descrirea principiilor de cifrare i descifrare

O dat generate perechile de chei se trece la cifrarea i respectiv descifrarea mesajelor.
Pentru a cifra un mesaj m l vom diviza n blocuri de lungime mai mic n. Dac p i q sunt numere
prime de 100 cifre atunci n va avea sub 200 de cifre, iar ecare mesaj bloc va avea sub 200 de
cifre. Dac trebuie cifrate blocuri de lungime x atunci vom apela la operaia de padding cu zero.
Mesajul cifrat c se va obine prin concatenarea mesajelor ci care au aproximativ aceiai lungime.
Formula de cifrare va :


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

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