private UInt32[] GetDecryptKey(byte[] key)
{
UInt32[] rk = GetEncryptKey(key);
for (int i = 0, j = 4*rounds; i < j; i += 4, j -= 4)
{
UInt32 temp = rk[i];
rk[i] = rk[j];
rk[j] = temp;
temp = rk[i + 1];
rk[i + 1] = rk[j + 1];
rk[j + 1] = temp;
temp = rk[i + 2];
rk[i + 2] = rk[j + 2];
rk[j + 2] = temp;
temp = rk[i + 3];
rk[i + 3] = rk[j + 3];
rk[j + 3] = temp;
}
for (int i = 1; i < rounds; i++)
{
//rk += 4;
rk[0 + 4*i] =
Td0[Te1[(rk[0 + 4*i] >> 24)] & 0xff] ^
Td1[Te1[(rk[0 + 4*i] >> 16) & 0xff] & 0xff] ^
Td2[Te1[(rk[0 + 4*i] >> 8) & 0xff] & 0xff] ^
Td3[Te1[(rk[0 + 4*i]) & 0xff] & 0xff];
rk[1 + 4*i] =
Td0[Te1[(rk[1 + 4*i] >> 24)] & 0xff] ^
Td1[Te1[(rk[1 + 4*i] >> 16) & 0xff] & 0xff] ^
Td2[Te1[(rk[1 + 4*i] >> 8) & 0xff] & 0xff] ^
Td3[Te1[(rk[1 + 4*i]) & 0xff] & 0xff];
rk[2 + 4*i] =
Td0[Te1[(rk[2 + 4*i] >> 24)] & 0xff] ^
Td1[Te1[(rk[2 + 4*i] >> 16) & 0xff] & 0xff] ^
Td2[Te1[(rk[2 + 4*i] >> 8) & 0xff] & 0xff] ^
Td3[Te1[(rk[2 + 4*i]) & 0xff] & 0xff];
rk[3 + 4*i] =
Td0[Te1[(rk[3 + 4*i] >> 24)] & 0xff] ^
Td1[Te1[(rk[3 + 4*i] >> 16) & 0xff] & 0xff] ^
Td2[Te1[(rk[3 + 4*i] >> 8) & 0xff] & 0xff] ^
Td3[Te1[(rk[3 + 4*i]) & 0xff] & 0xff];
}
return rk;
}