Автор: Macht59
Дата сообщения: 18.12.2011 02:17
Привет.
Не могу найти ошибку...
Прошу помочь тех, кто знаком с криптографией, а в частности с алгоритмом 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);
}
}