public string[,] MixColumns(string[,] str) // This is the array rendered from ShiftRows
{
string[] c1 = { str[0,0], str[1,0], str[2,0], str[3,0] };
string[] c2 = { str[0,1], str[1,1], str[2,1], str[3,1] };
string[] c3 = { str[0,2], str[1,2], str[2,2], str[3,2] };
string[] c4 = { str[0,3], str[1,3], str[2,3], str[3,3] };
string[][] columns = { c1, c2, c3, c4 };
string[][] resultColumns = new string[4][];
for (int h = 0; h < 4; h++) // Each column in array
{
int[] converted = { ToInt(columns[h][0]), ToInt(columns[h][1]), ToInt(columns[h][2]), ToInt(columns[h][3]) };
string[] tmp = new string[4];
tmp[0] = (GFMultX2(converted[0]) ^ GFMultX3(converted[1]) ^ converted[2] ^ converted[3]).ToString("x2");
tmp[1] = (converted[0] ^ GFMultX2(converted[1]) ^ GFMultX3(converted[2]) ^ converted[3]).ToString("x2");
tmp[2] = (converted[0] ^ converted[1] ^ GFMultX2(converted[2]) ^ GFMultX3(converted[3])).ToString("x2");
tmp[3] = (GFMultX3(converted[0]) ^ converted[1] ^ converted[2] ^ GFMultX2(converted[3])).ToString("x2");
resultColumns[h] = tmp;
}
string[,] result = { { resultColumns[0][0], resultColumns[1][0], resultColumns[2][0], resultColumns[3][0] },
{ resultColumns[0][1], resultColumns[1][1], resultColumns[2][1], resultColumns[3][1] },
{ resultColumns[0][2], resultColumns[1][2], resultColumns[2][2], resultColumns[3][2] },
{ resultColumns[0][3], resultColumns[1][3], resultColumns[2][3], resultColumns[3][3] } };
return result;
}
public int GFMultX2(int number)
{
string str = Convert.ToString(number, 2).PadLeft(8, '0');
str = str.Substring(1) + "0";
int val = Convert.ToInt32(str, 2);
if (val >= 128) val ^= 27;
return val;
}
public int GFMultX3(int number)
{
int original = number;
number = GFMultX2(number);
return (number ^ original);
}
public int ToInt(string hex)
{
return int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
}