1. 程式人生 > 其它 >AES-GCM查表原理

AES-GCM查表原理

內容來源論文The Galois/Counter Mode of Operation(GCM),本文主要根據第4.1章軟體實現進行原理推導。

問題:已知 f = 1 + α + α2 + α7 + α128求 H · X,其中X、H都是128位的位元串

一、查表1

The operation H ·X is linear in the bits of X, over the field GF(2). This property can be exploited tomakeefficient table-driven implementations,in which tables computedforaparticular valueof H can be used to multiply H byan arbitrary elementX. The simplest method computes Z = X·H as

Z = M0[byte(X, 0)] ⊕ M1[byte(X, 1)] ⊕ ... ⊕ M15[byte(X, 15)]

解釋:實際上就是將 X 拆分成16個獨立的操作進行查表。

X · H = (x0+ x1α + x2α2+ x3α3 + ···· + x126α126 + x127α127) · H

= (x0+ x1α + x2α2+ x3α3+ ···· + x7α7+ 0α8 + ···+ 0α127) · H +

(0+ 0α + ···· + 0α7+ x8α8+ x9α9 + ··· + x15α15 + 0α16 +···+ 0α127) · H +

··· +

(0+ 0α + ···· + 0α119

+ x120α120+ x121α121+ ··· + x127α127) · H -- 公式1

這樣就可以轉化為16次乘法 + 16次加法操作,對於每個乘法操作,由於只有1個位元組不為0,所以我們可以預先遍歷256種取值,對於每一個取值 x,計算 x · H。當後續需要時直接查表即可,因此可以轉化為16次查表 + 16次加法操作。具體可以再配製金鑰完成後,先計算出H,再進行預計算。

所需要的空間:16(表的數量)· 256(每張表中元素的個數)· 16(每個元素的位元組數,為128位元) = 24·28·24 = 64KBytes。

另外一種方法可以按照 4位元 拆分,因此一共需要32次查表 + 32次加法。

所需要的空間:32(表的數量)· 16(每張表中元素的個數)· 16(每個元素的位元組數,為128位元) = 25·24·24= 8KBytes。

二、查表2

1、With a small increase in the amount of computation, we can reduce the storage requirements considerably, as describedby Shoup[9].We can use only the table M0 defined above to multiply an arbitrary element X ∈ GF(2128) by H as follows.Wefirstexpresstheproductas

X · H = (x0+ x1α + x2α2+ x3α3+ ···· + x126α126+ x127α127) · H

= (x0+ x1α + x2α2+ x3α3+ ···· + x7α7+ 0α8+ ···+ 0α127) · H +

(0+ 0α + ···· + 0α7+ x8α8+ x9α9+ ··· + x15α15+ 0α16+···+ 0α127) · H +

··· +

(0+ 0α + ···· + 0α119+ x120α120+ x121α121+ ··· + x127α127) · H

= (x0+ x1α + x2α2+ x3α3+ ···· + x7α7+ 0α8+ ···+ 0α127) · H +

(0+ 0α + ···· + 0α7+ x8α0+ x9α1+ ··· + x15α7+ 0α16+···+ 0α127) · α8· H +

··· +

(0+ 0α + ···· + 0α119+ x120α0+ x121α1+ ··· + x127α7) · α120·H -- 公式2

論文中轉換後的演算法如下


演算法1


Z = 0

for i = 15 to 1 do
Z = Z⊕ (Xi · H)
Z = Z · α8

end for

Z = Z⊕ (X0 · H)

return Z


2、解釋:這裡演算法中的Xi分別對應16個位元組(等價於xi*8+0xi*8+1xi*8+2xi*8+3xi*8+4xi*8+5xi*8+6xi*8+7)。

論文中對演算法1進行了解釋,但期初看起來可能比較費解。這裡我們詳細計算驗證演算法的等價性。

i = 15結束後:Z = X15 · H ·α8

i = 14結束後:Z = (X15· H ·α8⊕ X14· H) ·α8

= X15· H ·α16⊕ X14· H ·α8

i = 13結束後:Z = (X15· H ·α16⊕ X14· H ·α8 ⊕ X13· H) ·α8

= X15· H ·α24⊕ X14· H ·α16⊕ X13· H·α8

···

i = 1結束後:Z = X15· H ·α120⊕ X14· H ·α112⊕ X13· H·α104⊕ ···⊕ X2· H·α16⊕ X1· H·α8

演算法結束後:Z = X15· H ·α120⊕ X14· H ·α112⊕ X13· H·α104⊕ ···⊕ X2· H·α16⊕ X1· H·α8⊕ X0· H -- 公式3

以位元串的形式表示,我們可以發現公式3和公式2是等價的,因此可以證明演算法1是正確的。

3、演算法1的求解

1)Xi· H 可以通過查表得到,其中Xi只有第1個位元組不為0,其餘120位元全為0,因此我們只需要遍歷256種情況即可。16次查表操作均可以只使用1個表格,再通過移位實現。

2)Z⊕ (Xi· H)對應的二進位制位元串將不再是隻有第1個位元組不為0,重點求解Z = Z ·α8

Z = Z ·α8

= Z ·α·α7

= ((Z >> 1)⊕ x127R) ·α7(其中,R = 0xe1000···0,高 8 位元為 e1,後 120 位元為全 0;x127R 表示若 Z 的第 127 位元為 0,則 x127R 為 0,否則為 R)

=(Z' ⊕ x127R) ·α7(記 Z' 表示 Z 右移 1 位)

=(Z' ⊕ x127R)·α·α6

= ((Z' ⊕ x127R)'⊕ x127R) ·α6

= ((Z'' ⊕ x127R'⊕ x126R)·α6

= ((Z''' ⊕ x127R''⊕ x126R'⊕ x125R)·α5

···

= Z'''''''' ⊕ x127R'''''''⊕ x126R''''''⊕ x125R'''''⊕ ···⊕ x120R -- 公式4

其中Z'''''''' 可以直接通過迴圈右移 8 位元得到;對於x127R'''''''⊕ x126R''''''⊕ x125R'''''⊕ ···⊕ x120R,由於 R 本身是常量,因此我們可以遍歷x127、x126、 x125、···、x120共256種取值進行預計算,最終通過查表得到實際結果。

所需要的空間:1(Xi· H表的數量,只對第1個位元組預計算)· 256(每張表中 Xi 取值的情況)· 16(每個結果的位元組數,為128位元)+ 1(R表的數量)· 256 (x127、x126、 x125、···、x120256種取值)+ 2(由於R只有最高8位元非0,最多右移8次,因此只需要16位元即可表示) = 4KBytes + 512 Bytes。

同理,若按照 4位元 拆分,所需要的空間:1(Xi· H表的數量,只對 x0x1x2x3預計算)· 16(每張表中x0x1x2x3 取值的情況)· 16(每個結果的位元組數,為128位元)+ 1(R表的數量)· 16 (x127、x126、x125x124共16種取值)+ 2(由於R只有最高8位元非0,最多右移8次,因此只需要16位元即可表示) = 256Bytes + 32 Bytes。

4)這裡給出按照 4位元 拆分時,R表的構造方法。8 位元拆分的計算方法同理

根據公式4,可以容易的推匯出

Z = Z ·α4

=Z'''' ⊕ x127R'''⊕ x126R''⊕ x125R'⊕ ···⊕ x124R -- 公式5

x124x125x126x127 結果

0 0 0 0 0

0 0 0 1 R''' = 0xe1 >> 3 = 0x1c20

0 0 1 0 R'' = 0xe1 >> 2 =0x3840

0 0 1 1 R'''⊕ R'' = 0x1c20⊕ 0x3840 = 0x2460

0 1 0 0 R'= 0xe1 >> 1 = 0x7080

0 1 0 1 R'''⊕ R' = 0x1c200x7080= 0x6ca0

0 1 1 0 R''⊕ R' = 0x38400x7080= 0x48c0

0 1 1 1 R'''⊕ R'' ⊕ R'= 0x24600x7080=0x54e0

1 0 0 0 R=0xe100

1 0 0 1 R'''⊕ R = 0x1c200xe100=0xfd20

1 0 1 0 R''⊕ R = 0x38400xe100=0xd940

1 0 1 1 R'''⊕ R'' ⊕ R= 0x24600xe100=0xc560

1 1 0 0 R'⊕ R =0x70800xe100=0x9180

1 1 0 1 R'''R'⊕ R = 0x6ca00xe100=0x8da0

1 1 1 0 R''⊕ R' ⊕ R= 0x48c00xe100=0xa9c0

1 1 1 1 R'''⊕ R''⊕ R'⊕ R = 0x54e00xe100=0xb5e0