# 2017q1 Team7 ( clz ) 補充資料
contributed by < `laochanlam` >, < `etc276` >, < `jack81306 `>, < `peterting` >
# 目錄
- [ ] GCM (Galois/Counter Mode) 詳細介紹
- [ ] AES (Advanced Encryption Standard) 詳細介紹
# GCM (Galois/Counter Mode) 詳細介紹
符號 | 定義
--- | ---
Ek | 使用秘鑰k對輸入做對稱加密運算
XOR | 異或運算
Mh | 將輸入與秘鑰h在有限域GF(2^128)上做乘法
在介紹 GCM 之前,必須先介紹以下幾種加密模式:
---
## CTR (Counter Mode)
<br>
![CTR](http://img.blog.csdn.net/20161116105807395?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
<br>
如上圖所示,CTR 是 Block Cipher 的一種加密的模式( 其他模式可見 CBC ECB OFB CFB ),先通過一定的 bit 數量對明文進行分組,再透過一個加密後的 Counter 來跟明文進行 XOR 的運算,然後得出密文。
**為什麼要用 Counter ?**
- 因為要確保同一樣的明文加密後不會得到相同的密文。
- 這樣加密可不需依賴前者,可進行同時加密加快速度。
- 若密文有部分錯誤,并不會導致整個解密出來的數據全錯誤。
可是,任何的加密方法有可能會遭到惡意修改再重新發送,那麼,我們怎樣可以保證資料的完整性及來源準確性呢?
---
## MAC (Message Authentication Code)
而這個時候,我們可以引入 MAC 的概念來確保資料的**準確性**!
<br>
![MAC](http://img.blog.csdn.net/20161116105836646?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
<br>
如上方的流程圖所示,假設現在 A 要傳資料給 B,以下為傳送步驟:
1) A, B 雙方先共享同一組密鑰 K。
2) A 把需要被傳送的消息 (無論於之前有無加密) 用 K 計算,得出 MAC 值。
3) A 把消息連同 MAC 值一同傳送到 B。
4) B 用之前事先共享的密鑰 K 進行計算,並對比 MAC 值。
**問:為什麼會這樣做?為什麼不直接傳送 資料 + Hash 值 就好?**
- 若被有心人截取,可以把密文修改完產生 Hash 值 + 資料 送到你手中(消息來源準確性)。
- 若使用預先共享的密鑰,截取者就無法得知密鑰,無法產生對應的 MAC 值(消息完整性)。
---
## GMAC (Galois message authentication code mode)
而接下來 GMAC 則是改用 GF 的乘法運算來求出 MAC 值。
>GF 的乘法運算幫忙補充~~~
>我想這邊應該就是有用到 carry-less multiplication 的部分 (?
>[color=blue][name=laochanlam]
>
> 目前想到的就是做 GF 的 cl_mul
> 然後因為大小不能超過 2^n ,所以會用到 reduced polynomial
> 也就是兩數做完運算之後,看 clz 是否 > n 而決定要不要 reduced
> 這樣的好處是避免線性,然後也應用 clz 不會花太多時間 (?
> [color=green][name=etc276]
>
![image alt](http://img.blog.csdn.net/20161116105910185?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
---
#### GCM (Galois/Counter Mode)
最後回來 GCM 了! GCM 其實就是 **GMAC** + **CTR**,以下為流程圖:
![GCM](http://img.blog.csdn.net/20161116105930631?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
簡單來說,就是用 CTR 的模式加密,再用 GMAC 的方法求出 MAC 值,再把資料和 MAC 值一併傳送給接收者。
### 參考及引用資料
[AES-GCM 加密算法](http://blog.csdn.net/t0mato_/article/details/53160772)
[分組密碼工作模式](https://zh.wikipedia.org/wiki/分组密码工作模式)
---
# AES (Advanced Encryption Standard) 詳細介紹
* 利用上面所介紹到之 Galois field 來進行運算
* 有三種通用的方式來表達一個 byte
* 用8個 bits 來表示
* 作為 F~256~ field 裡面的一個元素
* [0~255] 裡面的正整數
* 加密時,各輪 AES 加密迴圈均包含4個步驟(最後一輪除外)
* **Mixcolumns** - 對於矩陣的每一直行,與一個多項式 c(x) 進行多項式乘法。
> 此處的多項式乘法並非使用一般的乘法,而是使用不同的運算方式.例如,將某個 byte 所對應的值乘以 2,其結果就是將該值的二進制位左移一位,如果原始值的最高位為 1,則還需要將移位後的結果 xor 00011011.
> 且各個值相加的時候是使用 xor 運算.
* **SubBytes** - 透過 S-Box 函數 S 將每個 Byte 做轉換,也就是 b[i,j] = S( a[i,j] )。
> S-box 為一個矩陣,可以映射出另外一個數值.
> 另外在解密時使用 S^-1^ 來解密
* **ShiftRows** - 對於矩陣的每一橫列進行 Shift 移位的動作,移位的步伐大小與列號成正比。
* **AddRoundKey** - 資料與金鑰做 XOR 運算,也就是 b[i,j] = a[i,j] xor k[i,j]。
![](https://i.imgur.com/Gi9pQzH.png)
![](https://i.imgur.com/gWptDw7.png)
![](https://i.imgur.com/LhW0MwB.png)
![](https://i.imgur.com/VwuWVqw.png)
## 加密動作演算法
1. 對第一個區塊,進行下列動作
1. AddRoundKey()
2. 從第二個區塊開始,對每個區塊都執行下列動作
1. SubBytes()
2. ShiftRows()
3. MixColumns()
4. AddRoundKey()
3. 對最後一個區塊,執行下列動作
1. SubBytes()
2. ShiftRows()
3. AddRoundKey()
## 解密動作演算法
1. 對最後一個區塊,進行下列動作
1. AddRoundKey()
2. ShiftRows()
3. SubBytes()
2. 從倒數第二個區塊開始,對每個區塊都執行下列動作
4. AddRoundKey()
3. MixColumns()
2. ShiftRows()
1. SubBytes()
3. 對第一個區塊,執行下列動作
1. AddRoundKey()
* 在 AES 的加解密過程中,加密時採用正向的進行掃描,而解密時卻是逆向的進行掃描。
## AES Key
* AES 區塊長度固定為 16-byte,而 key 的長度則可為128、
192、256 bits
* key 的長度決定 round 的數目
* ex. 128 bits(16 bytes) 的 round = 10
* 192 bits(24 bytes) 的 round = 12
* 256 bits(36 bytes) 的 round = 14
* rounds = (key-size in 4-byte words) + 6
* 每個 round 需要 16 bytes 的 keying material (密鑰的格式、長度、數量),所以若給一個 16-byte 的 input,經過 AES key 排程計算會產生一個 176 bytes 的 output,前 16 bytes 是自己,而剩餘的 160 bytes 會被拿來進行計算,一次 4 個 bytes,每四個 bytes 都是先前4個 bytes 經過排列得到的。
![](https://i.imgur.com/VBAzj33.jpg)
- AES 中 mixcolumn 部分設計有限體乘法操作,在使用中需要消耗較多的時間。現在的計算平台都擁有豐富的軟體資源,因此 AES 的軟體實做一般都會採用查表的方式,將所有步驟一起查表,大概消耗 8-10K byte 的存儲空間,但效率非常之高。
### 參考資料
* Implementing SSL/TLS
* [AES 對稱式加解密法](http://www.codedata.com.tw/social-coding/aes/)