密碼學中的數學基礎2 伽羅華域(Galois Field)上的四則運算


1)域的概念

參考《密碼編碼學與網絡安全》這書的有限域一章。形象地說,域有這樣一個性質:在加法和乘法上具有封閉性。也就是說對域中的元素進行加法或乘法運算后的結果仍然是域中的元素。有一點要注意,域里面的乘法和加法不一定是我們平常使用的乘法和加法。可以把C語言中的與運算和異或運算分別定義成加法和乘法。但習慣上,仍然使用符號+ 和 * 表示加法和乘法運算。

2) 域中單位元和逆元兩個概念

  加法和乘法運算都有對應的單位元(這兩個單位元一般不同,但都用符號e表示)。單位元就像線性代數的單位矩陣。一個矩陣乘以單位矩陣等於本身。對應地,在域中的單位元有:對於加法單位元,所有元素加上單位元e,等於其本身。對應乘法單位元,所有元素乘上單位e,等於其本身

        逆元就像數學上的倒數,兩個元素互為對方的逆元。如果元素a和b互為加法逆元,那么就有 a + b = e。若互為乘法逆元,那么就有a * b = e。如果元素a在域中找不到另外一個元素b,使得a+b=e(a*b=e),那么a就沒有加法(乘法)逆元。

  逆元有什么用呢?其實逆元是用於除法運算的。小學的時候老師都會教:除於一個分數就等於乘以該分數的倒數(分數的倒數就是該分數的乘法逆元)。所以要想除於某個數,可以乘以該數的逆元。

  一個集合有加法單位元和乘法單位元,以及每一個元素都對應有加法逆元和乘法逆元,是成為域的必要條件。需要注意:即使集合里面有元素0,並且0沒有對應的乘法逆元,那么該集合也可能是一個域。因為並不要求0有乘法逆元。

例子:

  一個域的例子就是我們平時熟悉的有理數集合相應的加法和乘法就是我們平時用的加法和乘法。其中,加法的單位元為0,有理數a的加法逆元就是其相反數。因為a + (-a) = 0(單位元)。乘法的單位元為1,a的乘法逆元是其倒數。因為a * (1/a) = 1。注意這里的元素0並沒有乘法逆元。

有理數是整數(正整數、0、負整數)和分數的統稱,是整數和分數的集合。一般用黑體字母Q表示。

3)有限域

有限域,是指域中的元素個數是有限的。

4)有限域GF(p):

伽羅華域(Galois Field)
Évariste Galois ,伽羅華(也譯作伽瓦羅),法國數學家,群論的創立者。用群論徹底解決了根式求解代數方程的問題,而且由此發展了一整套關於群和域的理論。

  在密碼學中,有限域GF(p)是一個很重要的域,其中p為素數。簡單來說,GF(p)就是 mod p,因為一個數 模p后,結果在[0, p -1]之間即該域中有p個元素。對於元素a和b,那么(a+b) mod p和(a*b)mod p,其結果都是域中的元素。GF(p)里面的加法和乘法都是平時用的加法和乘法。GF(p)的加法和乘法單位元分別是0和1,元素的加法和乘法逆元都很容易理解和求得,這里就不展開講了,《密碼編碼學與網絡安全》書中有詳講的。

求乘法逆元的實現代碼如下面所示,具體是使用了類似輾轉相除法的方法。

//g_prime就是 GF(p)中的p
int g_prime = 251;
 
int calculateInverse(int x)
{
    int a1 = 1, a2 = 0, a3 = g_prime;
    int b1 = 0, b2 = 1, b3 = x;
 
    while( 1 )
    {
        if( b3 == 0 )
            throw std::logic_error("should not be 0");
 
        if( b3 == 1 )
            break;
 
        int q = a3 / b3;
 
        int t1 = a1 - q*b1, t2 = a2 - q*b2, t3 = a3 - q*b3;
 
        a1 = b1; a2 = b2; a3 = b3;
        b1 = t1; b2 = t2; b3 = t3;
    }
 
    return (b2 + g_prime)%g_prime;
}
View Code

  為什么p一定要是一個素數呢?

  這是因為當p為素數時,才能保證集合中的所有的元素都有加法和乘法逆元(0除外)。

        假如p等於10,其加法和乘法單位元分別是0和1。加法沒有問題,所有元素都有加法逆元,但對於乘法來說,比如元素2,它就沒有乘法逆元。因為找不到一個數a,使得2*a mod 10等於1。這時,就不能進行除於2運算了。

        對於p等於素數,那么它就能保證域中的所有元素都有逆元。即,對於域中的任一個元素a,總能在域中找到另外一個元素b,使得a*b mod p 等於1。這個是可以證明的,利用反證法和余數的定義即可證明,不難。

 5)有限域GF(2^8):

  現在重點講一下GF(2^n),特別是GF(2^8),因為8剛好是一個字節的比特數。

        前面說到, GF(p),p得是一個素數,才能保證集合中的所有元素都有加法和乘法逆元(0除外)。但我們卻很希望0到255這256個數字也能組成一個域。因為很多領域需要用到。mod 256的余數范圍就是0到255,但256不是素數。小於256的最大素數為251,所以很多人就直接把大於等於251的數截斷為250。在圖像處理中,經常會這樣做。但如果要求圖像無損的話,就不能截斷。

        貌似已經到了死胡同,救星還是有的,那就是GF(p^n),其中p為素數。在這里我們只需令p為2,n為8,即GF(2^8)。

 6)多項式運算

  要弄懂GF(2^n),要先明白多項式運算。這里的多項式和初中學的多項式運算有一些區別。雖然它們的表示形式都是這樣的:f(x) = x^6 + x^ 4 + x^2 + x + 1。下面是它的一些特點。

  • 多項式的系數只能是0或者1。當然對於GF(p^n),如果p等於3,那么系數是可以取:0, 1, 2的
  • 合並同類項時,系數們進行異或操作,不是平常的加法操作。比如x^4 + x^4等於0*x^4。因為兩個系數都為1, 進行異或后等於0
  • 無所謂的減法(減法就等於加法),或者負系數。所以,x^4 – x^4就等於x^4 + x^4。-x^3就是x^3。

 看一些例子吧。對於f(x) = x^6 + x^4 + x^2 + x + 1。g(x) = x^7 + x + 1。

        那么f(x) + g(x)  = x^7 + x^6 + x^4+ x^2 + (1+1)x + (1+1)1 = x^7 + x^6 + x^4 + x^2。f(x) – g(x)等於f(x) + g(x)。

        f(x) * g(x) =(x^13 + x^11 + x^9 + x^8 + x^7)  +  (x^7 + x^5 + x^3 + x^2 + x)  +  (x^6+ x^4 + x^2 + x + 1) = x^13 + x^11 + x^9 + x^8 + x^6 + x^5+ x^4+ x^3+1。

下圖是除法,除法得到的余數,也就是mod操作的結果。

7)素多項式(本原多項式):

        對於多項式也類似素數,有素多項式。其定義和素數類似,素多項式不能表示為其他兩個多項式相乘的乘積。  

  伽羅華域的元素可以通過該域上的本原多項式生成。通過本原多項式得到的域,其加法單位元都是 0,乘法單位元是1。

  以GF(2^3)為例,指數小於3的多項式共8個: 0, 1, x, x+1, x^2, x^2+1, x^2 + x, x^2+x+1。其系數剛好就是000,001, 010, 011, 100, 101, 110, 111,是0 到7這8個數的二進制形式。多項式對應一個值,我們可以稱這個值為多項式值
  GF(2^3)上有不只一個本原多項式,選一個本原多項式x^3+x+1,這8個多項式進行四則運算后 mod (x^3+x+1)的結果都是8個之中的某一個。因此這8個多項式構成一個有限域。
  對於GF(2^3),取素多項式為x^3 + x+1,那么多項式x^2+x的乘法逆元就是x+1。系數對應的二進制分別為110和011。此時,我們就認為對應的十進制數6和3互為逆元。
 
部分 GF(2^w)域經常使用的本原多項式如下:

 8)通過本原多項式生成元素

設P(x)是GF(2^w)上的某一個本原多項式,GF(2^w)的元素產生步驟是: 
1、給定一個初始集合,包含0,1和元素x,即 {0,1,x}; 
2、將這個集合中的最后一個元素,即x,乘以x,如果結果的度大於等於w,則將結果mod P(x)后加入集合;
3、直到集合有2^w個元素,此時最后一個元素乘以x再mod P(x)的值等於1。

例如,GF(2^4)含有16個元素,本原多項式為P(x)=x^4+x+1,除了 0、1外,另外14個符號均由本原多項式生成。
注意到x^14=x^3+1,此時計算x^15=x^14*x=(x^3+1)*x=x^4+x=1,生成結束。

 9)伽羅華域上的運算

加法和減法:

        加法即異或運算

   減法即加法

乘法和除法:

伽羅華域上的多項式乘法,其結果需要mod P(x),可以通過以下方式簡化計算。

首先,考慮x^8,x^8 mod P(x) = P(x) – x^8 = x^4 + x^3 +x^2 +1 。

  對於一般形式的多項式f(x)=a7*x^7 + a6*x^6 + a5*x^5 + a4*x^4 + a3*x^3 + a2*x^2 + a1*x + a0,乘以x得到

x*f(x) = (a7*x^8 + a6*x^7 + a5*x^6 + a4*x^5 + a3*x^4 + a2*x^3 + a1*x^1 + a0*x) mod P(x)

這時有兩種情況:
1)a7 == 0,此時結果是一個小於指數小於8的多項式,不需要取模計算。
2)a7 == 1,則將x^8替換為x^4 + x^3 + x^2 +1,而不用進行除法取模計算,結果為:
x*f(x) = (x^4 + x^3 + x^2 +1) + a6*x^7 + a5*x^6 + a4*x^5 + a3*x^4 + a2*x^3 + a1*x^1 + a0*x 

雖然可以通過替換減少除法計算,但還是過於復雜。尤其是在需要大量運算的場合,比如圖像處理。於是牛人提出通過查表來減少計算。

10)查表的原理

  首先介紹一個概念,生成元。
  生成元是域上的一類特殊元素,生成元的冪可以遍歷域上的所有元素。假設g是域GF(2^w)上生成元,那么集合 {g0 ,g1 , ……,g(2^w-1) } 包含了域GF(2^w)上所有非零元素。

  將生成元應用到多項式中, GF(2^w)中的所有多項式都是可以通過多項式生成元g通過冪求得。即域中的任意元素a,都可以表示為a = g^k。

  GF(2^w)是一個有限域,就是元素個數是有限的,但指數k是可以無窮的。所以必然存在循環。這個循環的周期是2^w-1(g不能生成多項式 0)。所以當k大於等於2^w-1時,g^k =g^(k%(2^w-1))。

  對於g^k = a,有正過程和逆過程。知道指數k求a是正過程,知道值a求指數k是逆過程。 

  對於乘法,假設a=g^n,b=g^m。那么a*b = g^n* g^m = g^(n+m)。查表的方法就是根據a和b,分別查表得到n和m,然后查表g^(n+m)即可。

  因此需要構造正表和反表,在GF(2^w)域上分別記為gflog和gfilog。gflog是將二進制形式映射為多項式形式,gfilog是將多項式形式映射為二進制形式。

注意:多項式0 ,是無法用生成元生成的。g^0等於多項式1,而不是 0。

 根據上文的GF(2^4)的元素表示,生成gflog表和gfilog表如下:

 

查表進行乘法和除法運算的例子
在GF(2^4)域上的乘法和除法,已知2^w-1 = 2^4 -1 = 15:
乘法:
    7 * 9 = gfilog[gflog[7] + gflog[9]] = gfilog[10 + 14]
       = gfilog[24 mod 15] = gfilog[9] = 10
除法:
    13 / 11 = gfilog[gflog[13] - gflog[11]] =  gfilog[13 - 7] = gfilog[6] = 12

 

摘自:

https://blog.csdn.net/shelldon/article/details/54729687

https://blog.csdn.net/luotuo44/article/details/41645597


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM