Я пытаюсь понять Key Scheduler, используемый в RC6, и у меня всего 3 вопроса. Страница RC6 в Википедии говорит, что единственная разница между RC5 и планировщик ключей RC6 заключается в том, что из ключа в RC6 создается больше слов. В моем приложении я использую w = 32 бита, r = 20 раундов и b = 16 байт.
Мой первый вопрос: это два отдельных цикла for или второй цикл for, который повторяется от s-1 до v внутри первого цикла for, который повторяется от 1 до 2r+3?
Мой второй вопрос: почему мы устанавливаем A=B=i=j=0 и эта команда и v=3xmax{c,2r+4} находятся внутри первого цикла for?
Документ RC6 также содержит этот псевдокод:
Вход: предоставленный пользователем байтовый ключ b, предварительно загруженный в массив c-слов L[0... c - 1]
Количество r раундов
Выход: w-битные круглые ключи S[0... 2r + 3]
Процедура: S[0] = Pw
для i = 1 до 2r + 3 выполните:
S[i] = S[i - 1] + Qw
А = В = я = j = 0
v = 3 х макс{с, 2r+4}
для s = 1 до v выполните:
{
А = S[i] = (S[i] + A + B)<<<3
B = L[j] = (L[j] + A + B)<<<(A + B)
я = (я + 1) по модулю (2г + 4)
j = (j + 1)modc
}
Мой третий вопрос о том, как предварительно загрузить массив слов L с помощью моего 16-байтового ключа. В документе RC5 говорится:
Первым алгоритмическим шагом раскрытия ключа является копирование секретного ключа K[0...b-1] в массив L[0...c-1] слов c=b/u, где u=w/8 равно количество байт/слово. Эта операция выполняется естественным образом, используя u последовательных ключевых байтов K для заполнения каждого последующего слова в L, от младшего байта до старшего байта. Любые незаполненные байтовые позиции L обнуляются.
И псевдокод для этой операции:
для i=b-1 до 0 выполните:
L[i/u] = (L[i/u]<<<8)+K[i];
Чтобы уточнить мой третий вопрос, если я иду от 15 до 0, а мое u = 32/8 = 4, как я могу использовать десятичную дробь для индекса L? Например, когда i равно 15, мы имеем L[15/4]=(L[15/4]<<<8 + K[i]);