Macht59
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Привет. Не могу найти ошибку... Прошу помочь тех, кто знаком с криптографией, а в частности с алгоритмом AES. Загвоздка в расширении ключа: Код: //byte Nk = 4; //byte Nr = 10; //byte Nb = 4; //uint[] Rcon = { 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000 }; //byte[] ShiftArray = { 24, 16, 8, 0 }; //byte[] ShiftForSubWord = { 28, 20, 12, 4 }; //SBox - большая таблица подстановок. public class KeyGenerator { public KeyGenerator(byte[] key, byte Nk, byte Nr) { _Nk = Nk; _Nr = Nr; _w = new uint[_Nr*_Nk + Nb]; _w = KeyExpansion(key); } private uint[] _w; private byte _Nk, _Nr; public uint[] GetW { get { return _w; } } private uint[] KeyExpansion(byte[] key) { uint temp; for (byte i = 0; i < _Nk; i++) { _w[i] = (uint)(key[i * 4] << 24) | (uint)(key[i * 4 + 1] << 16) | (uint)(key[i * 4 + 2] << 8) | (uint)(key[i * 4 + 3]); } for (byte i = _Nk; i < _w.Length; i++) { if (i % _Nk != 0) { _w[i] = _w[i - 1] ^ _w[i - _Nk]; } else { temp = SubWord(RotWord(_w[i - 1])) ^ Rcon[i / _Nk]; _w[i] = (temp) ^ _w[i - _Nk]; } } return _w; } private uint SubWord(uint p) { uint res = 0; for (byte i = 0; i < Const.Nb; i++) res |= (uint)(Const.SBox[(p >> ShiftForSubWord[i]) & 0x0f, (p >> Const.ShiftArray[i]) & 0x0f]) << ShiftArray[i]; return res; } private uint RotWord(uint w) { return (w << 8) | (w >> 24); } } | Первая ошибка встречается при генерации temp второй раз. А потом все, соответственно наперекосяк. P.S. Проблема решена. Был косяк в таблице подстановок SBox. | Всего записей: 9 | Зарегистр. 17-03-2011 | Отправлено: 04:17 18-12-2011 | Исправлено: Macht59, 11:36 18-12-2011 |
|