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

伽羅華域(Galois Field)簡介

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

伽羅華域一般用GF(2M) 表示,這個域中含有2M 個元素。GF(2M) 上的四則運算是基於多項式運算的,上過學的應該都知道什麼是多項式,一般都是這種結構f(x)=x6+x4+x2+x+1

本原多項式 (primitive polynomial)是一種特殊的不可約多項式。當一個域上的本原多項式確定了,這個域上的運算也就確定了。本原多項式一般通過查表得知,同一個域往往有多個本原多項式

GF(2M) 域,當M=8時,其中比較常見的一個本原多項式爲P(x)=x8+x4+x3+x2+1GF(28) 域也是計算機領域用的比較多的一種域,因爲一字節等於8比特嘛。研究這個玩意也是因爲AES加密中列混合變換中用到了伽羅華域運算,但是 AES加解密算法中,使用的不可約多項式(irreducible
polynomial)爲P(x)=x8+x4+x3+x+1 ,所以下面主要討論AES算法中用到的GF(28) 域,多項式爲P(x)=x8+x4+x3+x+1 乘法的實現。

運算規則

加法

在伽羅華域中,加法是模2運算,也就是忽略進位的加法,等同於計算機中的XOR異或,即 1^1=0, 1^0=1, 0^0=0

乘法

伽羅華域中的乘法是基於多項式運算的,比如:5=00000101b=(22+1) ,對應多項式爲 (x2+1)

舉例:

  • 37=(x+1)(x2+x+1)=x3+x2+x+x2+x+1=x3+(x2+x2)+(x+x)+1=x3+1
    (模2加法中相同項相加爲0)。

在相乘得到的多項式結果中,如果x的次數大於7,就需要對多項式在GF(2)上關於本原多項式P(x)求餘數,即modP(x)
因爲加法爲模2加法,相同項相加爲0,所以減法可以當成加法來計算。

基於多項式P(x)=x8+x4+x3+x2+1 :

  • 1295=(x7+1)(x2+1)=(x9+x7+x2+1)
    =(x9+x7+x2+1)+(xP(x))=(x9+x7+x2+1)+(x9+x5+x4+x3+x)
    =x7+x5+x4+x3+x2+x+1=10111111b=0xBF=191

基於多項式P(x)=x8+x4+x3+x+1 :

  • 1295=(x7+1)(x2+1)=(x9+x7+x2+1)
    =(x9+x7+x2+1)+(xP(x))=(x9+x7+x2+1)+(x9+x5+x4+x2+x)
    =x7+x5+x4+x+1=10110011b=0xB3=179

代碼實現

推導

因爲在AES算法列混合環節中用到了伽羅華域乘法,所以接下來的代碼實現使用AES算法指定的不可約多項式P(x)=x8+x4+x3+x+1 進行分析。

GMul(2, v)

爲了方便編程我們先找找規律,假設函數GMul(u, v)表示伽羅華域乘法,先看與2相乘的伽羅華域計算,即GMul(2, v),v、u不分左右:

  • 27=(x)(x2+x+1)=x3+x2+x (可以看出伽羅華域中一個數與2相乘等於這個數左移一位)

看上式,假如v對應的多項式x的次數大於7,即v的最高位爲1,也就是v>>7 == 1的話就進行 modP(x) 化簡,比如:

  • 2129=x(x7+1)=x8+x=(x8+x)+P(x)
    =(x8+x)+(x8+x4+x3+x+1)=x4+x3+1
    =00011001=0x19=0000001000011011=0x020x1B=(129<<1)0x1B

  • 2176=x(x7+x5+x4)=x8+x6+x5=(x8+x6+x5)+P(x)
    =(x8+x6+x5)+(x8+x4+x3+x+1)=x6+x5+x4+x3+x+1
    =01111011=0x7B=1100,000000011011=0xC00x1B=(176<<1)0x1B

從上面的3個例子可以總結一個規律:

GMul(2,v)={v<<1,if (v>>7) is 0x00.(v<<1)0x1B,if (v>>7) is 0x01.

GMul(3, v)

3v=(2+1)v=GMul(2,v)+v = GMul(2, v) ^ v

GMul(4, v)

4v=22v = GMul(2, GMul(2, v))

GMul(7, v)

7v=00000111=(22+2+1) = GMul(2, GMul(2, v)) ^ GMul(2, v) ^ v

GMul(8, v)

8v=(222)v =GMul(2, GMul(2, GMul(2, v)))
8=2^3,循環3次GMul(2,v)

GMul(11111111b, v)

11111111b=27+26+25+24+23+22+2+1
所以相當於: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;
}

參考

  1. CSDN博客 伽羅華域(Galois Field)上的四則運算
  2. AES算法標準 Federal Information Processing Standards Publication 197 ADVANCED ENCRYPTION STANDARD (AES)
  3. 代碼參考 Libtom AES code
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章