Tôi đang cố gắng hiểu Key Scheduler được sử dụng trong RC6 và tôi có tổng cộng 3 câu hỏi. Các Trang Wikipedia về RC6 nói rằng sự khác biệt duy nhất giữa RC5 và bộ lập lịch khóa RC6 là nhiều từ được tạo ra từ khóa trong RC6. Trong ứng dụng của tôi, tôi đang sử dụng w=32bits, r=20rounds và b=16bytes.
Câu hỏi đầu tiên của tôi là đây là hai vòng lặp for riêng biệt hay vòng lặp for thứ hai lặp từ s-1 đến v bên trong vòng lặp for đầu tiên lặp từ 1 đến 2r+3?
Câu hỏi thứ hai của tôi là tại sao chúng ta đặt A=B=i=j=0 và lệnh này và v=3xmax{c,2r+4} bên trong vòng lặp for đầu tiên?
Bài báo RC6 cũng cung cấp mã giả này:
Đầu vào: Khóa b byte do người dùng cung cấp được tải trước vào mảng c-word L[0... c - 1]
Số vòng r
Đầu ra: các phím tròn w-bit S[0... 2r + 3]
Quy trình: S[0] = Pw
cho i = 1 đến 2r + 3 làm:
S[i] = S[i - 1] + Qw
A = B = i = j = 0
v = 3 x max{c,2r+4}
cho s = 1 đến v làm:
{
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
}
Câu hỏi thứ ba của tôi là về cách tải trước mảng từ L bằng khóa 16byte của tôi. Bài báo RC5 cho biết:
Bước thuật toán đầu tiên của việc mở rộng khóa là sao chép khóa bí mật K[0...b-1] vào một mảng L[0...c-1] gồm các từ c=b/u trong đó u= w/8 là số byte/từ. Hoạt động này được thực hiện một cách tự nhiên bằng cách sử dụng u byte khóa liên tiếp của K để lấp đầy từng từ liên tiếp trong L, byte thứ tự thấp đến byte thứ tự cao. Mọi vị trí byte chưa được lấp đầy của L đều bằng không.
Và mã giả cho hoạt động này là:
for i=b-1 downto 0 làm:
L[i/u] = (L[i/u]<<<8)+K[i];
Để giải thích thêm về câu hỏi thứ ba của tôi, nếu tôi đang đi từ 15 xuống 0 và u của tôi = 32/8=4, làm cách nào tôi có thể sử dụng số thập phân để lập chỉ mục L? Ví dụ: khi tôi 15 tuổi, chúng ta có L[15/4]=(L[15/4]<<<8 + K[i]);