Rijndael MixColumns - Rijndael MixColumns

Tarafından gerçekleştirilen MixColumns işlemi Rijndael Şifreleme, ShiftRows adımı ile birlikte ana kaynaktır. yayılma Rijndael'de. Her sütun dört terimli bir polinom olarak değerlendirilir alan içindeki unsurlar . Polinomların katsayıları, asal alt alan .

Her sütun sabit bir polinom ile çarpılır modulo ; bu polinomun tersi .

MixColumns

İşlem, katsayıları aşağıdaki unsurları olan iki dört terimli polinomun modüler çarpımından oluşur. . Bu işlem için kullanılan modül .

İlk dört terimli polinom katsayıları durum sütunu tarafından tanımlanır , dört bayt içeren. Her bayt, dört terimin katsayısıdır, böylece

İkinci dört terimli polinom sabit bir polinomdur . Katsayıları ayrıca aşağıdaki unsurlardır: . Tersi .

Bazı gösterimler tanımlamamız gerekiyor:

çarpım modülünü belirtir .
üzerinde toplamayı gösterir .
çarpma anlamına gelir (polinomlar arasında olağan polinom çarpımı ve üzerinden çarpma katsayılar için).

Katsayıları aşağıdakilerin elemanları olan iki polinomun toplanması aşağıdaki kurala sahiptir:

Gösteri

Polinom olarak ifade edilecek .

Polinom çarpımı

nerede:

Modüler redüksiyon

Sonuç çarpım modulosu yapılarak yapılan dört baytlık bir kelimeye indirgenmesi gereken yedi terimli bir polinomdur .

Bazı temel polinom modüler işlemleri yaparsak şunu görebiliriz:

Genel olarak şunu söyleyebiliriz

Yani

nerede

Matris gösterimi

Katsayı , , ve şu şekilde de ifade edilebilir:

Ve katsayılarını değiştirdiğimizde sabitlerle şifrede kullanıldığında aşağıdakileri elde ederiz:

Bu, işlemin kendisinin bir Tepe şifresi. A çarpılarak yapılabilir koordinat vektörü içinde dört numara Rijndael'in Galois sahası takip eden dolaşan MDS matrisi:

Uygulama örneği

Bu, fiili uygulamada, 2 ile çarpmayı tek bir kaydırma ve koşullu dışlayıcı ile değiştirerek veya ve 3 ile çarpmayı, özel veya ile birleştirilmiş 2 ile çarpma ile değiştirerek bir şekilde basitleştirilebilir. Bir C Böyle bir uygulamanın örneği şöyledir:

 1 geçersiz gmix_column(imzasız kömür *r) { 2     imzasız kömür a[4]; 3     imzasız kömür b[4]; 4     imzasız kömür c; 5     imzasız kömür h; 6     / * 'A' dizisi sadece 'r' girdi dizisinin bir kopyasıdır 7      * 'B' dizisi, 'a' dizisinin her bir öğesinin 2 ile çarpımıdır 8      * Rijndael'in Galois alanında 9      * a [n] ^ b [n], Rijndael'in Galois alanındaki n öğesinin 3 ile çarpımıdır * / 10     için (c = 0; c < 4; c++) {11         a[c] = r[c];12         / * h, r [c] 'nin yüksek biti ayarlanmışsa 0xff, aksi takdirde 0'dır * /13         h = (imzasız kömür)((imzalı kömür)r[c] >> 7); / * aritmetik sağa kaydırma, dolayısıyla sıfırlara veya birlere kayma * /14         b[c] = r[c] << 1; / * örtük olarak yüksek biti kaldırır çünkü b [c] 8 bitlik bir karakterdir, bu nedenle sonraki satırda 0x1b değil, 0x1b ile xor yaparız * /15         b[c] ^= 0x1B & h; / * Rijndael'in Galois alanı * /16     }17     r[0] = b[0] ^ a[3] ^ a[2] ^ b[1] ^ a[1]; / * 2 * a0 + a3 + a2 + 3 * a1 * /18     r[1] = b[1] ^ a[0] ^ a[3] ^ b[2] ^ a[2]; / * 2 * a1 + a0 + a3 + 3 * a2 * /19     r[2] = b[2] ^ a[1] ^ a[0] ^ b[3] ^ a[3]; / * 2 * a2 + a1 + a0 + 3 * a3 * /20     r[3] = b[3] ^ a[2] ^ a[1] ^ b[0] ^ a[0]; / * 2 * a3 + a2 + a1 + 3 * a0 * /21 }

Bir C # örneği

 1 özel bayt GMul(bayt a, bayt b) { // Galois Field (256) İki Baytın Çarpımı 2     bayt p = 0; 3  4     için (int sayaç = 0; sayaç < 8; sayaç++) { 5         Eğer ((b & 1) != 0) { 6             p ^= a; 7         } 8  9         bool hi_bit_set = (a & 0x80) != 0;10         a <<= 1;11         Eğer (hi_bit_set) {12             a ^= 0x1B; / * x ^ 8 + x ^ 4 + x ^ 3 + x + 1 * /13         }14         b >>= 1;15     }16 17     dönüş p;18 }19 20 özel geçersiz MixColumns() { // 's', ana Durum matrisidir, 'ss', 's' ile aynı boyutlara sahip geçici bir matristir.21     Dizi.Açık(ss, 0, ss.Uzunluk);22 23     için (int c = 0; c < 4; c++) {24         ss[0, c] = (bayt)(GMul(0x02, s[0, c]) ^ GMul(0x03, s[1, c]) ^ s[2, c] ^ s[3, c]);25         ss[1, c] = (bayt)(s[0, c] ^ GMul(0x02, s[1, c]) ^ GMul(0x03, s[2, c]) ^ s[3,c]);26         ss[2, c] = (bayt)(s[0, c] ^ s[1, c] ^ GMul(0x02, s[2, c]) ^ GMul(0x03, s[3, c]));27         ss[3, c] = (bayt)(GMul(0x03, s[0,c]) ^ s[1, c] ^ s[2, c] ^ GMul(0x02, s[3, c]));28     }29 30     ss.Kopyala(s, 0);31 }

MixColumn () için test vektörleri

OnaltılıkOndalık
ÖnceSonraÖnceSonra
db 13 53 458e 4d a1 bc219 19 83 69142 77 161 188
f2 0a 22 5c9f dc 58 9d242 10 34 92159 220 88 157
01 01 01 0101 01 01 011 1 1 11 1 1 1
c6 c6 c6 c6c6 c6 c6 c6198 198 198 198198 198 198 198
d4 d4 d4 d5d5 d5 d7 d6212 212 212 213213 213 215 214
2d 26 31 4c4d 7e bd f845 38 49 7677 126 189 248

InverseMixColumns

MixColumns işlemi aşağıdaki tersi içerir (sayılar ondalıktır):

Veya:

Referanslar

Ayrıca bakınız