Sunteți pe pagina 1din 12

Cifrul RC5, sau Rivest Cipher 5 a fost proiectat de Ronald Rivest de la RSA DataSecurity în 1994.

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).

Cifrul RC5 are următoarele caracteristici:

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.

Parametru Descriere Intervalul de valori


w Reprezintă dimensiunea cuvântului în biți. 16, 32, 64, 128
r Numărul de runde 0, 1, ... , 255
b Reprezintă dimensiunea cheii secrete în octeți. 0, 1, ... , 255
w - reprezintă dimensiunea cuvântului în biți, fiecare cuvânt conține u = (w/8) octeți de 8 biți. Valoare
recomandată de w = 32 biți. RC5 criptează blocuri de 2 cuvinte, atât blocul textului clar cât și blocul textului
cifrat au fiecare lungimea de 2w biți.

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ă).

Notații și operații în RC5:

SAU exclusiv pe cuvinte, realizat bit cu bit (XOR), notat cu ⊕.

Rotație: rotirea lui x la stânga cu y biți notată cu x<<<y.

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).

Pentru w=16, 32, 64 aceste variabile arată astfel:

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)

A = S[i] = ( S[i] xor A xor B ) <<< 3

B = L[j] = ( L[j] xor A xor B ) <<<3 ( A xor B)


i = (i+1) mod t
j = (j+1) mod 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

A= (( A xor B) <<< B) + S[2*i];

B= (( B xor A) <<< A) + S[2*i + 1];


Algoritmul de decriptare:

for i = r downto r do

B= ((B – S[2*i +1]) >>> A) xor A;

A= ((A- S[2*i]) >>> B) xor B;

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.

În articolul de specialitate “RSA LABORATORIES – CryptoBytes (The technical newsletter of RSA


Laboratories, a division of RSA Data Security, Inc)” s-a realizat un scurt raport privind securitatea
algoritmului RC5 împotriva a trei tipuri de atacuri: căutarea exhaustivă, criptanaliza diferențială și
criptanaliza liniară. În urmă testelor realizate s-a ajuns la concluzia că RC5 oferă o securitate bună împotriva
celor trei tipuri de atacuri atunci când atât lunginea cheii secrete cât și numărul de rotații sunt destul de mari.
Fiind un algoritm parametrizat RC5 oferă flexibilitate în ce privește nivelul de securitate.

Moduri de operare RC5:

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

RC5 – 32/1/16 => w = 32 – jumatate din lungimea blocului de biti


r = 1 – numarul de runde

b = 16 – lungimea cheii in biti

Calculam:

u = w/8 => u = 32/8 = 4 – numarul de biti intr-un cuvint

c = b/u => c = 16/4 = 4 – numarul de cuvinte

t = 2(r+1) => t = 2(1+1) = 4

Consideram cheia Key = 9 –> in ASCII este 39.

Copiem K[0..b-1] in L[0..c-1]

Initial avem: key = 0000.0000.0000.0039

L[0] = 0000.0000

L[1] = 0000.0000

L[2] = 0000.0000

L[3] = 0000.0000

Completam L[0..c-1] astfel:

for i = b-1 downto 0 do

L[i/u] = (L[i/u] <<< 8)+K[i]

i = 15 L[15/4] = L[3] = (L[3]<<<8)+K[15] = 0000.0000+K[15] = 0000.0000 + 9 = 0000.0009

i = 14 L[14/4] = L[3] = (L[3]<<<8)+K[14] = 0000.0900+K[14] = 0000.0900 + 3 = 0000.0903

i = 13 L[13/4] = L[3] = (L[3]<<<8)+K[13] = 0009.0300 + K[13] = 0009.0300 + 0 = 0009.0300

i = 12 L[12/4] = L[3] = (L[3]<<<8)+K[12] = 0903.0000 + K[12] = 0903.0000 + 0 = 0903.0000

i = 11 L[11/4] = L[2] = (L[2]<<<8)+K[11] = 0000.0000 + K[11] = 0000.0000 +0 = 0000.0000

i = 10 L[10/4] = L[2] = (L[2]<<<8)+K[10] = 0000.0000 + K[10] = 0000.0000 +0 = 0000.0000

i=9 L[9/4] = L[2] = (L[2]<<<8)+K[9] = 0000.0000 + K[9] = 0000.0000 +0 = 0000.0000

i=8 L[8/4] = L[2] = (L[2]<<<8)+K[8] = 0000.0000 + K[8] = 0000.0000 +0 = 0000.0000

i=7 L[7/4] = L[1] = (L[1]<<<8)+K[7] = 0000.0000 + K[7] = 0000.0000 +0 = 0000.0000


i=6 L[6/4] = L[1] = (L[1]<<<8)+K[6] = 0000.0000 + K[6] = 0000.0000 +0 = 0000.0000

i=5 L[5/4] = L[1] = (L[1]<<<8)+K[5] = 0000.0000 + K[5] = 0000.0000 +0 = 0000.0000

i=4 L[4/4] = L[1] = (L[1]<<<8)+K[4] = 0000.0000 + K[4] = 0000.0000 +0 = 0000.0000

i=3 L[3/4] = L[0] = (L[0]<<<8)+K[3] = 0000.0000 + K[3] = 0000.0000 +0 = 0000.0000

i=2 L[2/4] = L[0] = (L[0]<<<8)+K[2] = 0000.0000 + K[2] = 0000.0000 +0 = 0000.0000

i=1 L[1/4] = L[0] = (L[0]<<<8)+K[1] = 0000.0000 + K[1] = 0000.0000 +0 = 0000.0000

i=0 L[0/4] = L[0] = (L[0]<<<8)+K[0] = 0000.0000 + K[0] = 0000.0000 +0 = 0000.0000

Am obținut:

L[0] = 0000.0000

L[1] = 0000.0000

L[2] = 0000.0000

L[3] = 0903.0000

Completăm S[0..t-1] astfel

S[0]=Pw => s[0]=P32=b7e15163 = (1011.0111.1110.0001.0101.0001.0110.0011)2

Avem Q32 = 9e3779b9 = (1001.1110.0011.0111.0111.1001.1011.1001)2

for i = 1 to t-1 do

S[i] = S[i-1]+ Q32

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:

do 3*max(t,c) times => do 12 times

A=S[i]=(S[i]+A+B)<<<3;

B=L[j]=(L[j]+A+B)<<<(A+B);

i=(i+1) mod (t)

j=(j+1) mod (c)

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

i=1 mod 4=1

j=1 mod 4=1

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

i=2 mod 4=2

j=2 mod 4=2

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

j=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

i=4 mod 4=0

j=4 mod 4=0

5)

A=S[0]=(S[0]+A+B)<<<3=bf0a8b1d +cf2e3fcd+ b65fd52b <<<3 = 4498a015<<<3=


0100.0100.1001.1000.1010.0000.0001.0101 <<<3= 0010.0100.1100.0101.0000.0000.1010.1010 =
24c500aa

B=L[0]=(L[0]+A+B)<<<(A+B)=b7e15163+24c500aa + b65fd52b <<<(24c500aa + b65fd52b)=


93062738<<<(3676624341 mod 32)10=1001.0011.0000.0110.0010.0111.0011.1000<<<21=
1110.0111.0001.0010.0110.0000.1100.0100=e71260c4

i=1 mod 4=1

j=1 mod 4=1

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

B=L[1]=(L[1]+A+B)<<<(A+B)= 0d1c9240+9fe4f2a3+ e71260c4<<<(9fe4f2a3+ e71260c4)=


9413e5a7<<<(2264355687 mod 32)10=1001.0100.0001.0011.1110.0101.1010.0111<<<7=
0000.1001.1111.0010.1101.0011.1100.1010 = 09f2d3ca

i=2 mod 4=2

j=2 mod 4=2

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

B=L[2]=(L[2]+A+B)<<<(A+B)= dacd6990 + b3433247+ 09f2d3ca <<<( b3433247+ 09f2d3ca)= 98036fa1


<<< (3174434321 mod 32)10= 1001.1000.0000.0011.0110.1111.1010.0001 <<<17=

1101.1111.0100.0011.0011.0000.0000.0110 = df433006

i=3 mod 4=3

j=3 mod 4=3

8)

A=S[3]=(S[3]+A+B)<<<3= (cf2e3fcd + b3433247+ df433006) <<<3 = 61b4a21a <<<3 =


0110.0001.1011.0100.1010.0010.0001.1010 <<<3= 0000.1101.1010.0101.0001.0000.1101.0011

= 0da510d3

B=L[3]=(L[3]+A+B)<<<(A+B)=( b65fd52b + 0da510d3+ df433006)<<<( 0da510d3+ df433006)=


a3481604 <<< (3974643929 mod 32)10= 1010.0011.0100.1000.0001.0110.0000.0100 <<< 25 =
0000.1001.0100.0110.1001.0000.0010.1100 = 0946902c

i=4 mod 4=0

j=4 mod 4=0

9)

A=S[0]=(S[0]+A+B)<<<3=(24c500aa+0da510d3+ 0946902c)<<<3= 3bb0a1a9 <<< 3 =


0011.1011.1011.0000.1010.0001.1010.1001 <<<3 =

1101.1101.1000.0101.0000.1101.0100.1001 = dd850d49

B=L[0]=(L[0]+A+B)<<<(A+B)=(e71260c4 + dd850d49+ 0946902c) <<<( dd850d49 + 0946902c)=


cdddfe39 <<< (3872103797 mod 32)10= 1100.1101.1101.1101.1111.1110.0011.1001 <<< 21 =
1100.0111.0011.1001.1011.1011.1011.1111 = c739bbbf

i=1 mod 4=1

j=1 mod 4=1

10)

A=S[1]=(S[1]+A+B)<<<3=(9fe4f2a3 + dd850d49 + c739bbbf) <<<3=44a3bbab <<<3 =


0100.0100.1010.0011.1011.1011.1010.1011 <<<3 = 0010.0101.0001.1101.1101.1101.0101.1010 =
251ddd5a
B=L[1]=(L[1]+A+B)<<<(A+B)=(09f2d3ca + 251ddd5a + c739bbbf) <<< (251ddd5a + c739bbbf) =
f64a6ce3 <<< (3965163801 mod 32)10= 1111.0110.0100.1010.0110.1100.1110.0011 <<<25=
1100.0111.1110.1100.1001.0100.1101.1001 = c7ec94d9

i=2 mod 4=2

j=2 mod 4=2

11)

A=S[2]=(S[2]+A+B)<<<3= (b3433247+ 251ddd5a + c7ec94d9) <<<3= a04da47a <<<3 =


1010.0000.0100.1101.1010.0100.0111.1010 <<<3 = 0000.0010.0110.1101.0010.0011.1101.0101 =
026d23d5

B=L[2]=(L[2]+A+B)<<<(A+B)=(df433006 + 026d23d5 + c7ec94d9)<<<( 026d23d5 + c7ec94d9)=


a99ce8b4 <<< (3394877614 mod 32)10= 1010.1001.1001.1100.1110.1000.1011.0100<<<14=
0011.1010.0010.1101.0010.1010.0110.0111= 3a2d2a67

i=3 mod 4=3

j=3 mod 4=3

12)

A=S[3]=(S[3]+A+B)<<<3=(0da510d3+ 026d23d5 + 3a2d2a67)<<<3= 4a3f5f0f <<<3 =


0100.1010.0011.1111.0101.1111.0000.1111 <<< 3= 0101.0001.1111.1010.1111.1000.0111.1010 =
51faf87a

B=L[3]=(L[3]+A+B)<<<(A+B)=(0946902c + 51faf87a +3a2d2a67) <<< (51faf87a +3a2d2a67)= 956eb30d


<<<(2351440609 mod 32)10=1001.0101.0110.1110.1011.0011.0000.1101 <<< 1=
0010.1010.1101.1101.0110.0110.0001.1011 =2add661b

i=4 mod 4=0

j=4 mod 4=0

Criptarea:

Textul pentru criptare: sviluppo => in ASCII: 73 76 69 6c 75 70 70 6f

A=7376696c

B=7570706f

S[0]= dd850d49

S[1]= 251ddd5a

S[2]= 026d23d5

S[3]= 51faf87a
A=A+S[0];

B=B+S[1];

A= 7376696c + dd850d49= 50fb76b5

B= 7570706f + 251ddd5a = 9a8e4dc9

for i=1 to r do

A=((A XOR B)<<<B)+S[2*i];

B=((B XOR A)<<<A)+S[2*i+1];

For i=1 to 1 do

A=((50fb76b5 XOR 9a8e4dc9)<<< 9a8e4dc9)+ 026d23d5= ca753b7c<<<(2593017289 mod 32)+


026d23d5= ca753b7c <<<9 + 026d23d5 = 1100.1010.0111.0101.0011.1011.0111.1100 <<< 9+ 026d23d5 =
1110.1010.0111.0110.1111.1001.1001.0100 + 026d23d5 = ea76f994 + 026d23d5 = ece41d69

B=(( 9a8e4dc9 XOR ece41d69)<<< ece41d69) + 51faf87a = 766a50a0 <<< (3974372713 mod 32)+
51faf87a = 766a50a0 <<< 9+ 51faf87a = 0111.0110.0110.1010.0101.0000.1010.0000 <<< 9 + 51faf87a =

1101.0100.1010.0001.0100.0000.1110.1100 + 51faf87a = d4a140ec + 51faf87a = 269c3966

A= ece41d69

B= 269c3966

Decriptarea:

A= ece41d69

B= 269c3966

S[0]= dd850d49

S[1]= 251ddd5a

S[2]= 026d23d5

S[3]= 51faf87a

for i=r downto 1 do

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=

0111.0110.0110.1010.0101.0000.1010.0000 XOR ece41d69= 766a50a0 XOR ece41d69= 9a8e4dc9

B=B-S[1]= 9a8e4dc9- 251ddd5a = 7570706f

A=(( ece41d69 - 026d23d5) >>> 9a8e4dc9) XOR 9a8e4dc9 = ea76f994 >>>9 XOR 269c3966=
1110.1010.0111.0110.1111.1001.1001.0100 >>> 9 XOR 9a8e4dc9 =

1100.1010.0111.0101.0011.1011.0111.1100 XOR 9a8e4dc9 = ca753b7c XOR 9a8e4dc9 = 50fb76b5

A=A-S[0]= 50fb76b5- dd850d49 = 7376696c

A= 7376696c

B = 7570706f

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