Încerc să înțeleg Key Scheduler folosit în RC6 și am un total de 3 întrebări. The Pagina Wikipedia RC6 spune că singura diferență dintre RC5 iar programatorul de chei RC6 este că mai multe cuvinte sunt produse din cheie în RC6. În aplicația mea, folosesc w=32bits, r=20rounds și b=16bytes.
Prima mea întrebare este dacă acestea sunt două bucle for separate sau a doua este bucla for care iterează de la s-1 la v în prima buclă for care iterează de la 1 la 2r+3?
A doua mea întrebare este de ce setăm A=B=i=j=0 și această comandă și v=3xmax{c,2r+4} se află în prima buclă for?
Hârtia RC6 furnizează și acest pseudocod:
Intrare: cheie b byte furnizată de utilizator preîncărcată în matricea de cuvinte c L[0... c - 1]
Numărul r de runde
Ieșire: taste rotunde w-bit S[0... 2r + 3]
Procedura: S[0] = Pw
pentru i = 1 la 2r + 3 face:
S[i] = S[i - 1] + Qw
A = B = i = j = 0
v = 3 x max{c,2r+4}
pentru s = 1 la v faceți:
{
A = S[i] = (S[i] + A + B)<<<3
B = L[j] = (L[j] + A + B)<<<(A + B)
i = (i + 1)mod(2r + 4)
j = (j + 1)modc
}
A treia mea întrebare este despre cum să preîncărc matricea de cuvinte L cu cheia mea de 16 octeți. Lucrarea RC5 spune:
Primul pas algoritmic de extindere a cheii este de a copia cheia secretă K[0...b-1] într-o matrice L[0...c-1] de cuvinte c=b/u unde u=w/8 este numărul de octeți/cuvânt. Această operație se face într-o manieră naturală folosind u octeți consecutivi de cheie ai lui K pentru a completa fiecare cuvânt succesiv în L, de la un octet de ordin inferior la un octet de ordin superior. Orice poziții de octeți necompletate ale lui L sunt puse la zero.
Și pseudocodul pentru această operație este:
pentru i=b-1 până la 0 faceți:
L[i/u] = (L[i/u]<<<8)+K[i];
Pentru a detalia a treia întrebare, dacă merg de la 15 la 0 și u = 32/8 = 4, cum pot folosi o zecimală pentru a indexa L? De exemplu, când i este 15 avem L[15/4]=(L[15/4]<<<8 + K[i]);