Documente Academic
Documente Profesional
Documente Cultură
Acesta este un cifru de tip bloc, având dimensiunea de bloc (32, 64 sau 128 de biţi), cheia (0 - 2040 biţi) şi
numărul de runde (0 la 255) variabile.
Inițial s-a sugerat folosirea de parametri cu o dimensiune a blocului de 64 de biţi, o cheie de 128- biţi şi 12
runde. O caracteristică de bază a cifrului RC5 este utilizarea datelor dependente de rotaţii, unul dintre
obiectivele RC5 fiind acela de a grăbi studiul și evaluare unor astfel de operaţiunilor ca un primitiv
criptografic. RC5, de asemenea, constă dintr-un număr de adunări modulare și SAU exclusiv (XOR).
este potrivit pentru hardware-ul şi software-ul existent: RC5 utilizează numai operaţii
computaţionale folosite de microprocesoare;
este rapid: aceasta, datorită faptului că cifrul RC5 este un algoritm simplu;
este adaptabil la procesoare cu lungimi diferite de cuvânt;
are un număr variabil de rotații: numărul de rotații este al doilea parametru al lui RC5;
lungimea cheii este variabilă: lungimea cheii este al treilea parametru alcifrului RC5;
este simplu: structura simplă a cifrului RC5 este uşor de implementat;
necesită memorie puţină: deoarece RC5 necesită puţină memorie, el este utilizat pentru cartele
inteligente (smart cards) sau pentru alte dispozitive care necesită memorie limitată;
securitate ridicată: cifrul RC5 are o securitate ridicată dacă se aleg parametrii potriviţi
folosește DDR (data dependent rotations).
DDR(data dependent rotations) a fost folosit prima data de Becker la IBM, iar mai apoi de Madryga. DDR
a stârnit interesul odată cu folosirea acestei metode în RC5.
Rivest descrie acestă metodă astfel: “un cuvânt de rezultate intermediare este rotat ciclic de un anumit număr
de ori, determinat de biții de grad mic dintr-un alt rezultat intermediar.”
Eficiența dată de folosirea DDR este legată de numărul variabil de rotații în timpul cifrării diferitelor blocuri
de date. Specificarea unui număr de rotații pentru un vector binar de n biți necesită log2n biți din șirul de
biți de control. Prin urmare, în RC5utilizarea DDR pe un bloc de n biți este independentă de n-log2n biți ai
celuilalt bloc.
RC5 este un algoritm parametrizat, având forma RC5-w/r/b. Varianta inițială propusă de Rivest a fost
RC5-32/12/16 și o altă versiune pentru platformele (pe atunci viitoare) de 64 biți RC5 - 64/16/16.
r - reprezintă numărul de rotații. RC5 folosește de asemenea, o tabelă extinsă de chei numită S care este
derivată din cheile secrete furnizate de utilizator. Dimensiunea acestei tabele depinde de r, fiind de
t = 2(r+1) cuvinte.
b - reprezintă numărul de biți al cheii secrete K (cheie criptografică de lungime variabilă).
Toate acestea sunt operații rapid de executat fiind suportate de majoritatea procesoarelor.
Pentru a se decripta, operațiile algoritmului trebuie să fie inversate în mod corespunzător pentru a genera
datele pentru fiecare jumătate de rotație esențial fiind mersul înapoi prin algoritm.
Algoritmul RC5, practic este compus din 3 algoritmi: key expansion algorithm, encryption algorithm și
decryption algorithm.
Algoritmul de expansiune cheie
Acesta are rolul de a extinde cheia K a user - ului pentru a se putea realiza tabela S de chei extinse, astfel că
S reprezintă un tablou de t = 2(r+1) cuvinte binare aleatoare determinate de K.
Acest algoritm folosește două “constante magice”, definite în felul următor pentru un cuvânt w oarecare:
Pw = Odd ( ( e - 2 ) * 2w )
Qw = Odd ( ( f - 1 ) * 2w )
unde:
Odd(x) este numărul impar cel mai apropiat de x (rotunjit în sus dacă x este par).
w 16 32 64
Pw b7e1 b7e15163 b7e151628aed2a6b
Qw ge37 ge3779b9 ge3779b97f4a7c15
Tabloul S de subchei este inițializat folosind r și w ca date de intrare, generând un anumit pattern
pseudoaleator. Apoi, cheia de b octeți K[0], K[1], …, K[b-1] este convertită într-un c-cuvânt L[0], L[1], …,
L[c - 1], unde c=[b/u] cuvinte, iar u=w/8.
Modul de inițializare al tabelei S folosind cele două constante poate fi dedus din următorul algoritm:
S0 = P w
Si+1 = Si + Qw
Apoi S este combinat cu L pentru a se obține o tabelă finală S de subchei. Mai exact, tabloul mai mare v-a fi
procesat de 3 ori, iar celălalt de mai multe ori.
i=j=A=B=0
N = 3*max(t, c)
Rivest a declarat că această funcție de expansiune a cheii are un anumit nivel de “one- wayness”: Nu este
atât de ușor să se determinte K din S.
Algoritmul de criptare:
Presupunem că blocul de intrare este dat sub forma a doi w- biți registri A, B și că s-a executat deja
expansiunea key, obținîndu-se tabloul S[0 .. t-1].
A = A + S[0];
B = B + S[1];
for i = 1 to r do
for i = r downto r do
B = B - S[1];
A= A - S[0];
O trăsătură a algoritmului RC5 este folosirea data - dependent rotations – numărul de rotații depinde de
datele de intrare, nu este predeterminat.
Rutinele ce criptare și decriptare sunt foarte simple. În timp ce alte operații (substituția) ar putea fi incluse în
operațiile de bază, data - dependent rotations sunt cele care dau greutate criptării.
RC5 - cifru bloc este de fapt modul ECB: 2w text clar → 2w text cifrat
RC5 - CBC: blocuri repetate de text clar produc diferite blocuri de text cifrat
RC5 – CBC - PAD: prelucreate text clar de orice dimensiune prin umplerea unor simboluri
suplimentare pentru a se ajunge la o lungine multiplu de 2w. Octeții umpluți sunt toți de același fel și
sunt de forma octetului care reprezintă numărul de octeți umpluți (de exemplu dacă sunt 8
octeți umpluți fiecare va avea forma 0000 1000).
RC5 – CTS: este de fapt tot un mod CBC al algoritmului. Acesta prelucreaza text clar de orice
lungime și produce text cifrat de aceeași lungime.
Exemplu practic:
RC5 – w/r/b
Calculam:
L[0] = 0000.0000
L[1] = 0000.0000
L[2] = 0000.0000
L[3] = 0000.0000
Am obținut:
L[0] = 0000.0000
L[1] = 0000.0000
L[2] = 0000.0000
L[3] = 0903.0000
for i = 1 to t-1 do
pentru i = 1
S[1]=S[0]+Q32=b7e15163+9e3779b9=5618cb1c=(1011.0111.1110.0001.0101.0001.0110.0011)2
pentru i = 2
S[2]=S[1]+Q32=5618cb1c+9e3779b9=f45044d5=(1111.0100.0101.0000.0100.0100.1101.0101)2
pentru i = 3
S[3]=S[2]+Q32= f45044d5+9e3779b9=9287be8e=(1001.0010.1000.0111.1011.1110.1000.1110)2
Initializam:
i=0;
j=0;
A=0;
B=0;
Parcurgem ciclul:
A=S[i]=(S[i]+A+B)<<<3;
B=L[j]=(L[j]+A+B)<<<(A+B);
1)
A=S[0]=(S[0]+A+B)<<<3=b7e15163<<<3=1011.0111.1110.0001.0101.0001.0110.0011<<<3=
1011.1111.0000.1010.1000.1011.0001.1101=bf0a8b1d
B=L[0]=(L[0]+A+B)<<<(A+B)=bf0a8b1d<<<bf0a8b1d=
1011.1111.0000.1010.1000.1011.0001.1101<<<(3205139229 mod 32)10 =
1011.1111.0000.1010.1000.1011.0001.1101<<<29=1011.0111.1110.0001.0101.0001.0110.0011= b7e15163
2)
A=S[1]=(S[1]+A+B)<<<3=5618cb1c+bf0a8b1d+b7e15163<<<3=cd04a79c<<<3=
1100.1101.0000.0100.1010.0111.1001.1100<<<3=0110.1000.0010.0101.0011.1100.1110.0110= 68253ce6
B=L[1]=(L[1]+A+B)<<<(A+B)=68253ce6+b7e15163<<<(68253ce6+b7e15163)=20068e49<<<(537300553
mod 32)10=0010.0000.0000.0110.1000.1110.0100.1001<<<9= 0000.1101.0001.1100.1001.0010.0100.0000
= 0d1c9240
3)
A=S[2]=(S[2]+A+B)<<<3=f45044d5+68253ce6+0d1c9240<<<3=699213fb<<<3=
0110.1001.1001.0010.0001.0011.1111.1011<<<3=0100.1100.1001.0000.1001.1111.1101.1011= 4c909fdb
B=L[2]=(L[2]+A+B)<<<(A+B)=4c909fdb+0d1c9240<<<(4c909fdb+0d1c9240)=59ad321b<<<(150452277
9 mod 32)10=0101.1001.1010.1101.0011.0010.0001.1011<<<27=
1101.1010.1100.1101.0110.1001.1001.0000 = dacd6990
i=3 mod 4=3
4)
A=S[3]=(S[3]+A+B)<<<3=9287be8e+4c909fdb+dacd6990<<<3=b9e5c7f9<<<3=
1011.1001.1110.0101.1100.0111.1111.1001<<<3=1100.1111.0010.1110.0011.1111.1100.1101= cf2e3fcd
B=L[3]=(L[3]+A+B)<<<(A+B)= 09030000+cf2e3fcd+dacd6990<<<(cf2e3fcd+dacd6990)=
b2fea95d<<<(2851842397 mod 32)10=1011.0010.1111.1110.1010.1001.0101.1101<<<29=
1011.0110.0101.1111.1101.0101.0010.1011 = b65fd52b
5)
6)
A=S[1]=(S[1]+A+B)<<<3=68253ce6+24c500aa + e71260c4<<<3=73fc9e54<<<3=
0111.0011.1111.1100.1001.1110.0101.0100<<<3= 1001.1111.1110.0100.1111.0010.1010.0011
= 9fe4f2a3
7)
A=S[2]=(S[2]+A+B)<<<3=(4c909fdb +9fe4f2a3+ 09f2d3ca) <<<3 = f6686648 <<< 3=
1111.0110.0110.1000.0110.0110.0100.1000 <<<3= 1011.0011.0100.0011.0011.0010.0100.0111
= b3433247
1101.1111.0100.0011.0011.0000.0000.0110 = df433006
8)
= 0da510d3
9)
1101.1101.1000.0101.0000.1101.0100.1001 = dd850d49
10)
11)
12)
Criptarea:
A=7376696c
B=7570706f
S[0]= dd850d49
S[1]= 251ddd5a
S[2]= 026d23d5
S[3]= 51faf87a
A=A+S[0];
B=B+S[1];
for i=1 to r do
For i=1 to 1 do
B=(( 9a8e4dc9 XOR ece41d69)<<< ece41d69) + 51faf87a = 766a50a0 <<< (3974372713 mod 32)+
51faf87a = 766a50a0 <<< 9+ 51faf87a = 0111.0110.0110.1010.0101.0000.1010.0000 <<< 9 + 51faf87a =
A= ece41d69
B= 269c3966
Decriptarea:
A= ece41d69
B= 269c3966
S[0]= dd850d49
S[1]= 251ddd5a
S[2]= 026d23d5
S[3]= 51faf87a
B=((B-S[2*i+1])>>>A) XOR A
A=((A-S[2*i])>>>B) XOR B
B= ((269c3966- 51faf87a) >>> ece41d69) XOR ece41d69= (d4a140ec >>>9) XOR ece41d69=
(1101.0100.1010.0001.0100.0000.1110.1100>>>9) XOR ece41d69=
A=(( ece41d69 - 026d23d5) >>> 9a8e4dc9) XOR 9a8e4dc9 = ea76f994 >>>9 XOR 269c3966=
1110.1010.0111.0110.1111.1001.1001.0100 >>> 9 XOR 9a8e4dc9 =
A= 7376696c
B = 7570706f