MixColumns Rijndael

Langkah  dan langkah  adalah sumber penghamburan utama dalam penyandian Rijndael. Tiap kolom dianggap sebagai suku banyak berderajat empat  yang suku-sukunya berada dalam .

Tiap kolom dikali dengan suku banyak tetap  modulus . Inversi suku banyaknya adalah .

 MixColumns 
Operasi ini terdiri dari perkalian modulus dua suku banyak berderajat empat yang koefisiennya ada dalam . Pembagi yang dipakai dalam operasi ini adalah .

Koefisien suku banyak pertama didefinisikan sebagai kolom status  yang berisi empat bita. Tiap bita adalah koefisien dari suku banyak tersebut.



Suku banyak kedua adalah suku banyak tetap . Koefisiennya juga ada dalam . Inversinya adalah .

Dalam halaman ini, kita definisikan beberapa notasi berikut:

  berarti perkalian modulus .
  berarti pertambahan dalam .
  berarti perkalian dalam .

Pertambahan dalam  memiliki sifat berikut:



 Pembuktian bentuk matriks 
Suku banyak  akan dinyatakan sebagai .

 Perkalian suku banyak 



dengan



 Reduksi modulus 
Hasil  adalah suku banyak berderajat tujuh sehingga harus direduksi menjadi kata empat bita. Hal itu dilakukan dengan melakukan perkalian dengan modulus .

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



Secara umum, kita bisa nyatakan bahwa 

Jadi,



dengan



 Bentuk matriks 
Koefisien , , , dan  dapat dinyatakan sebagai berikut:



Ketika kita ganti koefisien  dengan tetapan  yang dipakai oleh penyandian ini, kita dapatkan hasil berikut:



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



 InverseMixColumns 
Operasi  memiliki inversi berikut (bilangan dalam desimal).



atau



 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.

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 
 Heksadesimal Desimal Sebelum Setelah Sebelum Setelah db 13 53 45 8e 4d a1 bc 219 19 83 69 142 77 161 188 f2 0a 22 5c 9f dc 58 9d 242  10 34  92 159 220 88 157 01 01 01 01 01 01 01 01 1 1 1 1 1 1 1 1 c6 c6 c6 c6 c6 c6 c6 c6 198 198 198 198 198 198 198 198 d4 d4 d4 d5 d5 d5 d7 d6 212 212 212 213 213 213 215 214 2d 26 31 4c 4d 7e bd f8 45  38  49  76 77 126 189 248

 Daftar pustaka 
 FIPS PUB 197: Dokumen resmi AES

Kategori:Standar Enkripsi Lanjutan
Kategori:Medan berhingga