在數學中,有限域(或稱伽羅華域)是乙個包含有限元素的域。與其他域一樣,有限域是進行加減乘除運算都有定義並且滿足特定規則的集合。其中加法和乘法必須滿足交換、結合和分配的規律。加法和乘法具有封閉性,即加法和乘法結果仍然是域中的元素。
伽羅華域一般用gf(
2m
)gf(2^m)
gf(2m)
表示,這個域中含有2
m2^m
2m個元素。gf(
2m
)gf(2^m)
gf(2m)
上的四則運算是基於多項式運算的,上過學的應該都知道什麼是多項式,一般都是這種結構f(x
)=x6
+x4+
x2+x
+1
f(x) = x^6 + x^ 4 + x^2 + x + 1
f(x)=x
6+x4
+x2+
x+1 。
本原多項式 (primitive polynomial)是一種特殊的不可約多項式。當乙個域上的本原多項式確定了,這個域上的運算也就確定了。本原多項式一般通過查表得知,同乙個域往往有多個本原多項式。
g f(
2m
)gf(2^m)
gf(2m)
域,當m=8時,其中比較常見的乙個本原多項式為p(x
)=x8
+x4+
x3+x
2+
1p(x)=x^8+x^4+x^3+x^2+1
p(x)=x
8+x4
+x3+
x2+1
。g f(
28
)gf(2^8)
gf(28)
域也是計算機領域用的比較多的一種域,因為一位元組等於8位元嘛。研究這個玩意也是因為aes加密中列混合變換中用到了伽羅華域運算,但是aes加解密演算法中,使用的不可約多項式(irreducible
polynomial)為p(x
)=x8
+x4+
x3+x
+1
p(x)=x^8+x^4+x^3+x+1
p(x)=x
8+x4
+x3+
x+1,所以下面主要討論aes演算法中用到的gf(
28
)gf(2^8)
gf(28)
域,多項式為p(x
)=x8
+x4+
x3+x
+1
p(x)=x^8+x^4+x^3+x+1
p(x)=x
8+x4
+x3+
x+1乘法的實現。
在伽羅華域中,加法是模2運算,也就是忽略進製的加法,等同於計算機中的xor異或,即1^1=0, 1^0=1, 0^0=0
。
伽羅華域中的乘法是基於多項式運算的,比如:5
=00000101b=
(22+
1)
5=00000101b=(2^2+1)
5=0000
0101
b=(2
2+1)
,對應多項式為 (x2
+1
)(x^2+1)
(x2+1)
。舉例:
在相乘得到的多項式結果中,如果x的次數大於7,就需要對多項式在gf(2)上關於本原多項式p(x)求餘數,即mod
p(x)
mod p(x)
modp(x
)。
因為加法為模2加法,相同項相加為0,所以減法可以當成加法來計算。
基於多項式p(x
)=x8
+x4+
x3+x
2+
1p(x)=x^8+x^4+x^3+x^2+1
p(x)=x
8+x4
+x3+
x2+1
:基於多項式p(x
)=x8
+x4+
x3+x
+1
p(x)=x^8+x^4+x^3+x+1
p(x)=x
8+x4
+x3+
x+1:
因為在aes演算法列混合環節中用到了伽羅華域乘法,所以接下來的**實現使用aes演算法指定的不可約多項式p(x
)=x8
+x4+
x3+x
+1
p(x)=x^8+x^4+x^3+x+1
p(x)=x
8+x4
+x3+
x+1進行分析。
gmul(2, v)
為了方便程式設計我們先找找規律,假設函式gmul(u, v)表示伽羅華域乘法,先看與2相乘的伽羅華域計算,即gmul(2, v),v、u不分左右:
看上式,假如v對應的多項式x的次數大於7,即v的最高位為1,也就是v>>7 == 1
的話就進行 mod
p(x)
mod p(x)
modp(x
) 化簡,比如:
從上面的3個例子可以總結乙個規律:
g mu
l(2,
v)
=v<<1, & \text . \\ (v<<1) \land \text , & \text . \end
gmul(2
,v)=
return v;
}gmul(u, v)
根據上述對gmul(u, v)的總結,可以用一下**實現:
uint8_t gmul
(uint8_t u, uint8_t v)
v =gmul2
(v);
//呼叫gmul(2,v)
u >>=1;
}return p;
}
為了**整潔可以寫成乙個通用的函式,aes演算法實現中列混合環節可以直接呼叫下面的函式:
uint8_t gmul
(uint8_t u, uint8_t v)
int flag =
(v &
0x80);
v <<=1;
if(flag)
u >>=1;
}return p;
}
csdn部落格 伽羅華域(galois field)上的四則運算
aes演算法標準 federal information processing standards publication 197 advanced encryption standard (aes)
**參考 libtom aes code
C語言實現矩陣運算
最近在學習機械人運動控制學,用到了矩陣運算,並用c語言實現之 首先宣告該 在ubuntu18.04下執行通過,如若在windows下執行失敗請考慮編譯器版本問題 乙個矩陣最基本的有行數line,列數row和 行數乘以列數個資料 row line 所以用乙個最基本的結構體變數來表示乙個矩陣 矩陣的結構...
C語言實現大整數運算
我們知道,c語言中的整型有short int long。ansi c標準定義的整數型別範圍為 型別 位元數取值範圍 unsigned short int 160至65535 0至2 16 1 signed short int 16 32768至32767 2 15至2 15 1 unsigned i...
用C語言實現Warshall運算
用c語言實現warshall運算 1.先定義兩個整形變數m n。用scanf輸入,m代表陣列的行,n代表陣列的列。然後定義陣列a m n 2.用兩個for迴圈對陣列進行輸入.寫乙個while迴圈迴圈條件為判斷i是否小於矩陣的列。3.用兩個for迴圈對矩陣每個元素進行判斷,判斷是否等於1,如果等於1,...