AES對稱密碼演算法介紹(0)——數學知識簡介
13 人贊了文章
AES,Advanced Encryption Standard,高級加密標準,本質上是一個精簡版的Rijndael(主要砍掉了192、256 bits的塊大小,只能用128-bit塊分組)。具體的歷史就不說了,這段話里兩個超鏈接都有描述。
AES對稱密碼演算法的內部結構有很強的數學結構,要想了解AES演算法,首先要了解一些必需的數學背景知識。
當然,像矩陣乘法什麼的本文就不會講了,畢竟大學裡的公共基礎課程之一。本文的重點不是討論數學,所以本篇將側重於數學理論在AES中的應用,而不會關注於定理公式的推導證明。這也不是專業的密碼學教材,不會涉及AES的安全性證明、已知攻擊等。
AES演算法涉及的最核心的數學知識就是伽羅瓦域。但在此之前先介紹群(Group)的概念。
群指的是元素集合 和 內任意兩個元素的聯合操作 的集合。
群具有以下特徵:
1. 群操作 # 是封閉的。即對所有 , 恆成立。2. 群操作是可結合的。即對所有 , 恆成立。3. 存在一個元素 ,對於所有 都有 。此元素 被稱為中性元(或單位元)。4. 對於每一個 ,都存在一個元素 使得 ,這個 稱為 的逆元。5. 如果在滿足以上特徵的基礎上,對於所有的 都有 ,則稱此群為阿貝爾群(或交換群)。
例如連續整數集合 與操作加法模 組成了一個群:中性元為0,每個元素的逆元都存在:1 + (m-1) = 0 mod m 2 + (m-2) = 0 mod m ............
但連續整數集合 與操作乘法模 不一定能組成一個群,因為不一定每一個元素都存在逆元。
要使一個結構能同時支持加減乘除四種基本運算,我們需要一個域(Field):
域 是具有以下特徵的元素的集合:
1. 中所有的元素形成一個加法交換群,對應的群操作為 ,中性元為 。2. 中除了 以外的所有元素構成一個乘法交換群,對應的群操作為 ,中性元為 。
3. 當混合使用這兩種操作時,分配律應始終成立。即對所有的 ,都有 。
舉個簡單易懂的例子,我們熟悉的實數集就是一個域,加法群中的中性元為 ,任意元素 的逆元為 ;乘法群中的中性元為 ,除 以外任意元素a的逆元為 。(如果你還關心減法和除法,那麼減法可以由加上加法逆元來定義,除法可以由乘以乘法逆元來定義)
但我們只對有限個元素感興趣,這樣的域叫做有限域或伽羅瓦域。而元素的個數叫做有限域的階。
定理1:
只有當 是一個素數的冪,即 (其中 為正整數, 為素數)時,階為 的域才存在。
當 時該域稱為素域,當 時稱為擴展域。
定理2:
假設 是一個素數,那麼整數環 表示為 ,也稱為擁有素數個元素的素數域或伽羅瓦域。 中所有的非零元素都存在逆元, 內的算術運算都是模p實現的。
以最小的有限域 為例:
其加法恰好等價於「異或門」,乘法恰好等價於「與門」。
AES處理的最小單位是一個位元組,即一個二進位的8位無符號整數。要容納這些整數,自然而然的就是選擇 這個擴展域。
但是擴展域並不使用數字來表示擴展域中的元素,而是使用多項式來表達:
在 中,每個元素 都可以表示為:
其中
簡單的說就是多項式的係數只能是 或 ,且係數的運演算法則符合上面提到的 的運演算法則。這樣 這8個數也就正好對應了一個位元組的8個位,在計算機中只需要一定的順序將其儲存為位元組即可,而 這樣的冪完全不需要儲存。
先來看看加法:對應的係數按「異或」相加就行了,非常簡單。
從位元組的角度看, 的加法就是將兩個位元組做按位異或運算即可。同時我們可以很輕鬆的發現, 的減法其實是和加法完全等價的。
而 的乘法就比較複雜了。
還是以上面的 為例,如果聯繫上面群和域的定義,可以用兩次分配律將其展開為這樣一個式子
首先按照計算一般多項式的方法計算,得到
注意係數要模2,所以 這三項的係數就為 了,即
這裡就有問題了, 這些項超過了 ,無法使用 的多項式來表達。所以在定義 的乘法時,還要選擇一個合適的多項式用來對「傳統乘積」做模約。
在AES標準中,Rijndael設計者選擇了一個不可約多項式(irreducible polynomial)作為乘法模約用到的模,它是
注意到
即
同理
帶入上述三式,按加法模2合併同類項,可得 ,即為AES規範下 的乘法結果。這裡也可以嘗試用做豎式除法(長除法,long division)那樣來做,用乘積多項式除以不可約多項式,求得的餘數(余式)就是這個結果,這個比較簡單這裡不講了,只給出一個實例(但是對於後面的擴展歐幾里得演算法非常重要,建議讀者親自動手嘗試)。
雖然AES並不關心 的除法,但是 上的乘法逆元在AES的解密操作過程中至關重要。根據乘法逆元的定義,有 。要求得這個式子中的 ,其實現在的方法已經很多了。
第一種方法最簡單,因為 並不大,把 的每一個非零元素用乘法遍歷,也才65025次,找出其中等於 的,就能確定乘法逆元。但這一點兒也不數學。
第二張方法我們首先要在乘法的基礎上定義 的冪運算為 其中等號右邊共有 個 相乘。考慮到預演算法則之間的「兼容性」,對非零元素 。
一個很有趣的現象是 中的某些元素,例如 ,自身的冪次會循環地遍歷 的每一個非零元素(不一定按順序),這種元素叫做乘法群的本原元或生成元。如下,指數為0~254的範圍內無重複地遍歷了 的每一個非零元素。
易得 ,即 。所以,首先在計算機中算出指數與冪的對應關係表(也被稱為「對數表」),在需要要求 的逆元時,查詢 對應的指數 ,再算出後查詢到對應的 即為 。
第三種方法被稱為擴展歐幾里德演算法(Extended Euclidean Algorithm, EEA)。擴展歐幾里德演算法本身被用於求兩個正整數 的最大公約數(greatest common divisor, gcd)以及方程的兩個係數 。
不妨假設 ,數學上已經證明對於連續自然數 和操作乘法模 構成的群,只有在 時任意元素的逆元才一定存在,此時上式可改寫為 ,即 就是 的逆元。
數學上也證明了對於有限域的情況也是一樣:
注意由於 是一個不可約多項式,故gcd總是等於1。
講了這麼多,我們還是沒有講到如何用EEA解出這個 ,下面我們就以一個小型擴展域為例(考慮到篇幅原因)做講解:計算基於 的有限域 中 的逆元。
首先設定出初始值 :
然後迭代地處理:第[1]輪: 將 改寫作 的形式 (就是用豎式除法,求 除以 的商式和余式,商式記作 ,余式記作 ) ,然後計算 。這裡:
第[2]輪: 將 改寫作 的形式,然後計算 。這裡: 第[3]輪: 將 改寫作 的形式,然後計算 。這裡: 第[4]輪: 將 改寫作 的形式這裡: ,因為 ,break!最終,最後一個 即為 。本例中為 。
小結一下,設定初始變數後,不斷迭代:第[ ]輪中,先求 中的 ,再計算 ,直到 時停止,然後取 作為求逆元的結果。(最大公約數gcd就是 )
擴展歐幾里德演算法中係數 的求法我們這裡並不關注,沒有寫出。如果讀者有興趣可以在超鏈接中查看。
至此,乘法逆元問題我們已經解決了。那麼AES的必需數學基礎也就到這裡了。如果您對本文的內容感興趣,可以嘗試用你熟悉的編程語言實現一個能計算 上的加法、乘法、逆元的程序。
下一講,我們將以此為基礎,正式開始我們的AES之旅。
由於本人知識水平與精力有限,如果本文中有任何知識錯誤或遺漏等(含錯別字),歡迎指正。
參考資料:Paar, Christof, and Jan Pelzl. Understanding cryptography: a textbook for students and practitioners. Springer Science & Business Media, 2009.
推薦閱讀: