伽羅華域運算及C語言實現

2021-08-19 15:32:49 字數 3312 閱讀 2100

在數學中,有限域(或稱伽羅華域)是乙個包含有限元素的域。與其他域一樣,有限域是進行加減乘除運算都有定義並且滿足特定規則的集合。其中加法和乘法必須滿足交換、結合和分配的規律。加法和乘法具有封閉性,即加法和乘法結果仍然是域中的元素。

伽羅華域一般用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,...