MixColumns combines each state column with finite-field byte arithmetic. The grid is recomputed from ShiftRows.

highlighted = computed this step

Why columns mix

MixColumns treats each column as a small finite-field vector. The output grid is recomputed with GF arithmetic over bytes.

mix each column\text{mix each column}
MixColumnsAES state bytes shown as a column-major grid.MixColumns - mixcolumnsrowc0c1c2c3r00x040xe00x480x28r10x660xcb0xf80x06r20x810x190xd30x26r30xe50x9a0x7a0x4c

Pin two GF products

For this round, 0xd4 times 2 is 0xb3, and 0xbf times 3 is 0xda.

0xd42=0xb3,0xbf3=0xda0xd4\cdot2=0xb3,\quad0xbf\cdot3=0xda
MixColumnsAES state bytes shown as a column-major grid.MixColumns - mixcolumnsrowc0c1c2c3r00x040xe00x480x28r10x660xcb0xf80x06r20x810x190xd30x26r30xe50x9a0x7a0x4c

Read the MixColumns state

The recomputed state is 0x046681e5e0cb199a48f8d37a2806264c. This is the same carryless arithmetic family introduced in CRC.

0x046681e5e0cb199a48f8d37a2806264c0x046681e5e0cb199a48f8d37a2806264c
MixColumnsAES state bytes shown as a column-major grid.MixColumns - mixcolumnsrowc0c1c2c3r00x040xe00x480x28r10x660xcb0xf80x06r20x810x190xd30x26r30xe50x9a0x7a0x4c

Summary

MixColumns diffuses each column through GF byte arithmetic. NOTE: no-padding; no-side-channel; no-production; never-roll-your-own. Exact byte transforms of ONE AES round over GF(2^8); real AES with 128 runs 10 rounds with a key schedule inside a reviewed mode such as CBC or GCM.

MixColumns recomputed\text{MixColumns recomputed}
MixColumnsAES state bytes shown as a column-major grid.MixColumns - mixcolumnsrowc0c1c2c3r00x040xe00x480x28r10x660xcb0xf80x06r20x810x190xd30x26r30xe50x9a0x7a0x4c