Serpent: неправильные раундовые ключи
Здравствуйте!
Можно ли у вас спросить, правильно ли я провожу расчет раундовых ключей в шифрований Serpent?
Допустим, если изначально ключ будет таким:
15FC0D48 D7F8199C BE399183 4D96F327 10000000 00000000 00000000 00000000
32бита 32бита 32бита 32бита 32бита 32бита 32бита 32бита
w-8 w-7 w-6 w-5 w-4 w-3 w-2 w-1
как мы видим, ключ неполный, расширим его до 256 бит. Так же пронумеруем их (w-8, минус (от минус 8 до минус 1)).
wi=(wi-8 xor wi-5 xor wi-3 xor wi-1 xor phi xor i)<<<11
Далее запустим функцию выбора подключей, где phi - это 9e3779b9, запустим от 0 до 131 для получения 33-х 128-битных ключей.
Проведем расчет от 0 до 4, чтобы получить, 1 из 33-х раундовых ключей
(k0,k1,k2,k3)=S3(w0,w1,w2,w3)
и так далее, до w131.
1) i=0
w0=w-8 xor w-5 xor w-3 xor w-1 xor 9e3779b9 xor 0<<<11=15FC0D48 xor 4D96F327 xor 00000000 xor 00000000 xor 9e3779b9 xor 0 <<<11=EC3EB632
2) i=1
w1=w-7 xor w-4 xor w-2 xor w0 xor 9e3779b9 xor 1<<<11=D7F8199C xor 10000000 xor 00000000 xor EC3EB632 xor 9e3779b9 xor 1<<<11=8EB0B5AF
3) i=2
w2=w-6 xor w-3 xor w-1 xor w1 xor 9e3779b9 xor 2<<<11=BE399183 xor 00000000 xor 00000000 xor 8EB0B5AF xor 9e3779b9 xor 2<<<11=F2ECBD75
4) i=3
w3=w-5 xor w-2 xor w0 xor w2 xor 9e3779b9 xor 3<<<11=4D96F327 xor 00000000 xor EC3EB632 xor F2ECBD75 xor 9e3779b9 xor 3<<<11=9C0ED66B
Для первого раундового ключа проведем его через 3-й SBOX:
S3(w0,w1,w2,w3)
EC3EB632
В бинарной записи:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
11|10|11|00|00|11|11|10|10|11|01|10|00|11|00|10|
После перестановки в Sbox3:
11101010001111001110110001101100
EA3CEC6C
8EB0B5AF
В бинарной записи:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10|00|11|10|10|11|00|00|10|11|01|01|10|10|11|11
После перестановки в Sbox3:
10110110101100101000111001001111
B6B28E4F
F2ECBD75
В бинарной записи:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
11|11|00|10|11|10|11|00|10|11|11|01|01|11|01|01
После перестановки в Sbox3:
11010110011111101111001111001001
D67EF3C9
9C0ED66B
В бинарной записи:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10|01|11|00|00|00|11|10|11|01|01|10|01|10|10|11
После перестановки в Sbox3:
10111011010111001001110001100010
BB5C9C62
В итоге мы имеем: EA3CEC6C B6B28E4F D67EF3C9 BB5C9C62
Первый ключ k0 должен быть 2958B648, у меня он EA3CEC6C после S3, и даже после IP он стал FAD796F1, что никак не сходиться с ответом. Может быть, я нарушил порядок нумерации, и w-8 - это самый крайний ключ, хотя везде написано, что начинаем нумерацию с w-8 до w-1. Пробовал проводить расчет вот так:
15FC0D48 D7F8199C BE399183 4D96F327 00000000 00000000 00000000 00000001
32бита 32бита 32бита 32бита 32бита 32бита 32бита 32бита
w-8 w-7 w-6 w-5 w-4 w-3 w-2 w-1
С ответом тоже не сошлось.
И даже если провести ключ w0,w1,w2,w3 через IP, то выходит
FAD796F1 A1F7DDB0 7D51EEB1 17C8762B
что не сходиться с ответами.
Не могли бы Вы, пожалуйста, сказать, в чем ошибка? Заранее Вам спасибо!
Обновление
В Интернете отсутствуют какие-либо примеры тестовых векторов для всех стадий шифрования, есть только вектора PT/KEY/CT, тем самым невозможно сделать дебаггинг Расширения ключа.