伽羅華域(Galois Field)簡介
在數學中,有限域(或稱伽羅華域)是一個包含有限元素的域。與其他域一樣,有限域是進行加減乘除運算都有定義並且滿足特定規則的集合。其中加法和乘法必須滿足交換、結合和分配的規律。加法和乘法具有封閉性,即加法和乘法結果仍然是域中的元素。
伽羅華域一般用 表示,這個域中含有 個元素。 上的四則運算是基於多項式運算的,上過學的應該都知道什麼是多項式,一般都是這種結構 。
本原多項式 (primitive polynomial)是一種特殊的不可約多項式。當一個域上的本原多項式確定了,這個域上的運算也就確定了。本原多項式一般通過查表得知,同一個域往往有多個本原多項式。
域,當M=8時,其中比較常見的一個本原多項式爲 。 域也是計算機領域用的比較多的一種域,因爲一字節等於8比特嘛。研究這個玩意也是因爲AES加密中列混合變換中用到了伽羅華域運算,但是 AES加解密算法中,使用的不可約多項式(irreducible
polynomial)爲 ,所以下面主要討論AES算法中用到的 域,多項式爲 乘法的實現。
運算規則
加法
在伽羅華域中,加法是模2運算,也就是忽略進位的加法,等同於計算機中的XOR異或,即 1^1=0, 1^0=1, 0^0=0
。
乘法
伽羅華域中的乘法是基於多項式運算的,比如: ,對應多項式爲 。
舉例:
-
(模2加法中相同項相加爲0)。
在相乘得到的多項式結果中,如果x的次數大於7,就需要對多項式在GF(2)上關於本原多項式P(x)求餘數,即。
因爲加法爲模2加法,相同項相加爲0,所以減法可以當成加法來計算。
基於多項式 :
基於多項式 :
代碼實現
推導
因爲在AES算法列混合環節中用到了伽羅華域乘法,所以接下來的代碼實現使用AES算法指定的不可約多項式 進行分析。
GMul(2, v)
爲了方便編程我們先找找規律,假設函數GMul(u, v)表示伽羅華域乘法,先看與2相乘的伽羅華域計算,即GMul(2, v),v、u不分左右:
- (可以看出伽羅華域中一個數與2相乘等於這個數左移一位)
看上式,假如v對應的多項式x的次數大於7,即v的最高位爲1,也就是v>>7 == 1
的話就進行 化簡,比如:
從上面的3個例子可以總結一個規律:
GMul(3, v)
= GMul(2, v) ^ v
GMul(4, v)
= GMul(2, GMul(2, v))
GMul(7, v)
= GMul(2, GMul(2, v)) ^ GMul(2, v) ^ v
GMul(8, v)
=GMul(2, GMul(2, GMul(2, v)))
8=2^3,循環3次GMul(2,v)
GMul(11111111b, v)
所以相當於:GMul(2,v)循環7次 ^ GMul(2,v)循環6次 … GMul(2,v)循環1次 ^ v
代碼實現
GMul(2, v)
根據上面總結的公式可以很容易用代碼實現GMul(2, v)
uint8_t GMul2(uint8_t v){
int flag = (v & 0x80);
v <<= 1;
if (flag) {
v ^= 0x1B; /* P(x) = x^8 + x^4 + x^3 + x + 1 */
}
return v;
}
GMul(u, v)
根據上述對GMul(u, v)的總結,可以用一下代碼實現:
uint8_t GMul(uint8_t u, uint8_t v) {
uint8_t p = 0;
for (int i = 0; i < 8; ++i) {
if (u & 0x01) {
p ^= v;
}
v = GMul2(v); //調用GMul(2,v)
u >>= 1;
}
return p;
}
爲了代碼整潔可以寫成一個通用的函數,AES算法實現中列混合環節可以直接調用下面的函數:
uint8_t GMul(uint8_t u, uint8_t v) {
uint8_t p = 0;
for (int i = 0; i < 8; ++i) {
if (u & 0x01) {
p ^= v;
}
int flag = (v & 0x80);
v <<= 1;
if (flag) {
v ^= 0x1B; /* P(x) = x^8 + x^4 + x^3 + x + 1 */
}
u >>= 1;
}
return p;
}