分組密碼鏈接-消息認證碼--CCM Counter with CBC-MAC
組成CCM的關鍵算法是AES加密算法、CTR工作模式和CMAC認證算法,在加密和MAC算法中共用一個密鑰K。
CCM加密過程的輸入由三部分構成:
1、將要被加密和認證的數據,即明文消息P數據塊
2、將要被認證,但是不需要加密的相關數據A,如協議頭等。
3、臨時量N,作為負載和相關數據的補充,對每條消息N取值唯一,以防止重放攻擊等。


由計數器產生大量的Ctri
Galois/計數器模式--GCM Galois/Counter Mode
GCM基於並行化設計,可以提供高效的吞吐率和低成本、低延遲。其本質是消息在變型的CTR模式下加密,密文結果與密鑰以及消息長度信息在GF(2128)域上相乘。該標准還同時制定了僅支持MAC的工作模式即GMAC。
GCM模式使用兩個函數:帶密鑰的Hash函數GHASH,以及計數器每次增1 的CTR模式的GCTR。
1、GHASH
GHASHH(X)函數將Hash密鑰H和位串X作為輸入,經過轉化函數可表示成:
GHASHH(X) = (X1•Hm)⊕(X2•Hm-1)⊕...⊕(Xm-1•H2)⊕(Xm•H)
該式非常適合快速實現,如果使用相同的Hash密鑰認證多個消息,那么H2,H3,...能夠通過一次預計算來對所有消息進行認證,並且待認證的數據分組(X1,X2,...,Xm)能夠並行處理,因為每組計算都相互獨立。
2、GCRT

inc32(S)函數對S的最右32位增1並取模232,其余位不變。
最后一次加密生成MSB,根據Xn'的長度截取后再與Xn'異或產生Yn'
3、整個認證函數結構

(1)令 H = E(K , 0128)
(2)定義分組J0如下
如果len(IV) = 96,則令J0 = IV || 031 || 1。
如果len(IV) ≠ 96,則令 s = 128⌈len(IV)/128⌉ - len(IV)
並令J0 = GHASHH(IV || 0s+64 || [len(IV)64]) //[s+64+len(IV)]%64 = 0,說白了就是使輸入滿足剛好可分整數組的長度
(3)令C = GCRTK(inc32(J0) , P)
(4)令u = 128⌈len(C)/128⌉ - len(C) v = 128⌈len(A)/128⌉ - len(A) //目的也是為了滿足分組長度
(5)定義分組S如下
S = GHSASHH(A || 0v || C || ou || [len(A)]64 || [len(C)64])
(6)令 T = MSBt(GCTRK(J0 , S)),這里t是支持的MAC長度
