MixColumns Rijndael

Langkah  dan langkah  adalah sumber penghamburan utama dalam penyandian Rijndael. Tiap kolom dianggap sebagai suku banyak berderajat empat b(x) = b_3 x^3 + b_2 x^2 + b_1 x + b_0 yang suku-sukunya berada dalam \operatorname{GF}(2^8).

Tiap kolom dikali dengan suku banyak tetap a(x) = 3x^3 + x^2 + x + 2 modulus x^4 + 1. Inversi suku banyaknya adalah a^{-1}(x) = 11x^3 + 13x^2 + 9x + 14.

## MixColumns
Operasi ini terdiri dari perkalian modulus dua suku banyak berderajat empat yang koefisiennya ada dalam \operatorname{GF}\left(2^8\right). Pembagi yang dipakai dalam operasi ini adalah x^4 + 1.

Koefisien suku banyak pertama didefinisikan sebagai kolom status \begin{bmatrix} b_3 & b_2 & b_1 & b_0 \end{bmatrix} yang berisi empat bita. Tiap bita adalah koefisien dari suku banyak tersebut.

: b(x) = b_3 x^3 + b_2 x^2 + b_1 x + b_0

Suku banyak kedua adalah suku banyak tetap a(x) = 3x^3 + x^2 + x + 2. Koefisiennya juga ada dalam \operatorname{GF}\left(2^8\right). Inversinya adalah a^{-1}(x) = 11x^3 + 13x^2 + 9x + 14.

Dalam halaman ini, kita definisikan beberapa notasi berikut:

: \otimes berarti perkalian modulus x^4 + 1.
: \oplus berarti pertambahan dalam \operatorname{GF}\left(2^8\right).
: \bullet berarti perkalian dalam \operatorname{GF}\left(2^8\right).

Pertambahan dalam \operatorname{GF}\left(2^8\right) memiliki sifat berikut:

: \begin{align}
      & \left(a_3 x^3 + a_2 x^2 + a_1 x + a_0\right) + \left(b_3 x^3 + b_2 x^2 + b_1 x + b_0\right) \\
  ={} & \left(a_3 \oplus b_3\right)x^3 + \left(a_2 \oplus b_2\right) x^2 + \left(a_1 \oplus b_1\right)x + \left(a_0 \oplus b_0\right)
\end{align}

## Pembuktian bentuk matriks
Suku banyak a(x) = 3x^3 + x^2 + x + 2 akan dinyatakan sebagai a(x) = a_3 x^3 + a_2 x^2 + a_1 x + a_0.

### Perkalian suku banyak

: \begin{align}
  a(x) \bullet b(x) = c(x)
    &= \left(a_3 x^3 + a_2 x^2 + a_1 x + a_0\right) \bullet \left(b_3 x^3 + b_2 x^2 + b_1 x + b_0\right) \\
    &= c_6 x^6 + c_5 x^5 + c_4 x^4 + c_3 x^3 + c_2 x^2 + c_1 x + c_0
\end{align}

dengan

: \begin{align}
c_0 &= a_0 \bullet b_0 \\
c_1 &= a_1 \bullet b_0 \oplus a_0 \bullet b_1 \\
c_2 &= a_2 \bullet b_0 \oplus a_1 \bullet b_1 \oplus a_0 \bullet b_2 \\
c_3 &= a_3 \bullet b_0 \oplus a_2 \bullet b_1 \oplus a_1 \bullet b_2 \oplus a_0 \bullet b_3 \\
c_4 &= a_3 \bullet b_1 \oplus a_2 \bullet b_2 \oplus a_1 \bullet b_3 \\
c_5 &= a_3 \bullet b_2 \oplus a_2 \bullet b_3 \\
c_6 &= a_3 \bullet b_3
\end{align}

### Reduksi modulus
Hasil c(x) adalah suku banyak berderajat tujuh sehingga harus direduksi menjadi kata empat bita. Hal itu dilakukan dengan melakukan perkalian dengan modulus x^4 + 1.

Bila kita melakukan perkalian modulus suku banyak, kita bisa lihat bahwa

: \begin{align}
  x^6 \bmod \left(x^4 + 1\right) &= -x^2 = x^2 \text{ dalam } \operatorname{GF}\left(2^8\right) \\
  x^5 \bmod \left(x^4 + 1\right) &= -x = x \text{ dalam } \operatorname{GF}\left(2^8\right) \\
  x^4 \bmod \left(x^4 + 1\right) &= -1 = 1 \text{ dalam } \operatorname{GF}\left(2^8\right)
\end{align}

Secara umum, kita bisa nyatakan bahwa x^i \bmod \left(x^4 + 1\right) = x^{i \bmod 4}.

Jadi,

: \begin{align}
      & a(x) \otimes b(x) = c(x) \bmod \left(x^4 + 1\right) \\
  ={} & \left(c_6 x^6 + c_5 x^5 + c_4 x^4 + c_3 x^3 + c_2 x^2 + c_1 x + c_0\right) \bmod \left(x^4 + 1\right) \\
  ={} & c_6 x^{6 \bmod 4} + c_5 x^{5 \bmod 4} + c_4 x^{4 \bmod 4} + c_3 x^{3 \bmod 4} + c_2 x^{2 \bmod 4} + c_1 x^{1 \bmod 4} + c_0 x^{0 \bmod 4} \\
  ={} & c_6 x^2 + c_5 x + c_4 + c_3 x^3 + c_2 x^2 + c_1 x + c_0 \\
  ={} & c_3 x^3 + \left(c_2 \oplus c_6\right) x^2 + \left(c_1 \oplus c_5\right) x + c_0 \oplus c_4 \\
  ={} & d_3 x^3 + d_2 x^2 + d_1 x + d_0
\end{align}

dengan

: \begin{align}
d_0 &= c_0 \oplus c_4 \\
d_1 &= c_1 \oplus c_5 \\
d_2 &= c_2 \oplus c_6 \\
d_3 &= c_3
\end{align}

### Bentuk matriks
Koefisien d_3, d_2, d_1, dan  d_0  dapat dinyatakan sebagai berikut:

: \begin{align}
d_0 &= a_0 \bullet b_0 \oplus a_3 \bullet b_1 \oplus a_2 \bullet b_2 \oplus a_1 \bullet b_3 \\
d_1 &= a_1 \bullet b_0 \oplus a_0 \bullet b_1 \oplus a_3 \bullet b_2 \oplus a_2 \bullet b_3 \\
d_2 &= a_2 \bullet b_0 \oplus a_1 \bullet b_1 \oplus a_0 \bullet b_2 \oplus a_3 \bullet b_3 \\
d_3 &= a_3 \bullet b_0 \oplus a_2 \bullet b_1 \oplus a_1 \bullet b_2 \oplus a_0 \bullet b_3
\end{align}

Ketika kita ganti koefisien a(x) dengan tetapan \begin{bmatrix} 3 & 1 & 1 & 2 \end{bmatrix} yang dipakai oleh penyandian ini, kita dapatkan hasil berikut:

: \begin{align}
d_0 &= 2 \bullet b_0 \oplus 3 \bullet b_1 \oplus 1 \bullet b_2 \oplus 1 \bullet b_3 \\
d_1 &= 1 \bullet b_0 \oplus 2 \bullet b_1 \oplus 3 \bullet b_2 \oplus 1 \bullet b_3 \\
d_2 &= 1 \bullet b_0 \oplus 1 \bullet b_1 \oplus 2 \bullet b_2 \oplus 3 \bullet b_3 \\
d_3 &= 3 \bullet b_0 \oplus 1 \bullet b_1 \oplus 1 \bullet b_2 \oplus 2 \bullet b_3
\end{align}

Hal ini menunjukkan bahwa operasi ini mirip dengan sandi Hill. Ia dapat digambarkan sebagai perkalian matriks berikut:

: \begin{bmatrix} d_0 \\ d_1 \\ d_2 \\ d_3 \end{bmatrix} =
\begin{bmatrix}
  2 & 3 & 1 & 1 \\
  1 & 2 & 3 & 1 \\
  1 & 1 & 2 & 3 \\
  3 & 1 & 1 & 2
\end{bmatrix}
\begin{bmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \end{bmatrix}

## InverseMixColumns
Operasi  memiliki inversi berikut (bilangan dalam desimal).

: \begin{bmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \end{bmatrix} =
\begin{bmatrix}
  14 & 11 & 13 &  9 \\
   9 & 14 & 11 & 13 \\
  13 &  9 & 14 & 11 \\
  11 & 13 &  9 & 14
\end{bmatrix}
\begin{bmatrix} d_0 \\ d_1 \\ d_2 \\ d_3 \end{bmatrix}

atau

: \begin{align}
b_0 &= 14 \bullet d_0 \oplus 11 \bullet d_1 \oplus 13 \bullet d_2 \oplus  9 \bullet d_3 \\
b_1 &=  9 \bullet d_0 \oplus 14 \bullet d_1 \oplus 11 \bullet d_2 \oplus 13 \bullet d_3 \\
b_2 &= 13 \bullet d_0 \oplus  9 \bullet d_1 \oplus 14 \bullet d_2 \oplus 11 \bullet d_3 \\
b_3 &= 11 \bullet d_0 \oplus 13 \bullet d_1 \oplus  9 \bullet d_2 \oplus 14 \bullet d_3
\end{align}

## Contoh implementasi
Operasi ini dapat disederhanakan dalam implementasinya dengan mengganti perkalian dengan dua dengan geseran tunggal dan XOR bersyarat serta mengganti perkalian dengan tiga dengan perkalian dengan dua yang digabung dengan XOR. Berikut contoh implementasi dalam bahasa C.


```c
void gmix_column(unsigned char *r) {
	unsigned char a[4];
	unsigned char b[4];
	unsigned char c;
	unsigned char h;
	/* Larik a adalah salinan dari larik r.
	 * Larik b adalah larik a yang dikali dua dalam medan berhingga Rijndael.
	 * a[n] ^ b[n] adalah perkalian dengan tiga dalam medan berhingga Rijndael.
	 */
	for (c = 0; c < 4; c++) {
		a[c] = r[c];
		/* h adalah 0xff jika bit tinggi r[c] diatur; nilainya 0 jika tidak */
		h = (unsigned char) ((signed char) r[c] >> 7); /* geseran aritmetika kanan */
		b[c] = r[c] << 1; /* secara tersirat menghapus bit tinggi karena b[c] adalah char 8 bit,
		                   * maka di-XOR dengan 0x1B dan bukan 0x11B pada baris selanjutnya */
		b[c] ^= 0x1B & h; /* medan berhingga Rijndael */
	}
	r[0] = b[0] ^ a[3] ^ a[2] ^ b[1] ^ a[1]; /* 2 * a0 + a3 + a2 + 3 * a1 */
	r[1] = b[1] ^ a[0] ^ a[3] ^ b[2] ^ a[2]; /* 2 * a1 + a0 + a3 + 3 * a2 */
	r[2] = b[2] ^ a[1] ^ a[0] ^ b[3] ^ a[3]; /* 2 * a2 + a1 + a0 + 3 * a3 */
	r[3] = b[3] ^ a[2] ^ a[1] ^ b[0] ^ a[0]; /* 2 * a3 + a2 + a1 + 3 * a0 */
}
```


## Vektor uji untuk MixColumns

## Daftar pustaka
* FIPS PUB 197: Dokumen resmi AES