密碼學(xué)之消息認(rèn)證碼算法
前言
文中出現(xiàn)的 ?和
?是同一個(gè)意思,都代表 a 序列和 b 序列的concatenation(級(jí)聯(lián)),前者為自己習(xí)慣的用法,后者更為正式。
*注意:括號(hào)內(nèi)的中文來自google translate,未必專業(yè)

一、ECB?& CBC
Block cipher(分組密碼)的block長度是固定的(比如說128bit,256bit等等),但是我們需要加密的信息的長度是不固定的,通常來說都要大于block的長度。問題是如何用一個(gè)固定長度的block cipher來加密非固定長度的message(信息)。
一個(gè)最原始的想法是將message m 切割為長度相等的小塊,每一個(gè)小塊都用block cipher加密,然后將最后加密后的密文組合起來,這種方法叫做ECB (Electronic Code Book) 。

但是這種加密方式有一個(gè)安全缺陷——如果我們的message具有一定的結(jié)構(gòu)性,那么ECB加密后的ciphertext(密文)也會(huì)保留這個(gè)結(jié)構(gòu)性。
CBC (Cipher Block Chaining) 則是在ECB的基礎(chǔ)上加入一些改動(dòng),加密流程如下

二、CBC-MAC
CBC-MAC是運(yùn)用CBC對(duì)我們的message? 進(jìn)行加密,
.
以上的CBC-MAC叫做basic CBC-MAC,只適合用于固定長度的message。因?yàn)楣粽呖梢越?img type="latex" class="latex" src="http://api.bilibili.com/x/web-frontend/mathjax/tex?formula=%F0%9D%91%9A%E2%80%B2%20%3D%20%F0%9D%91%9A%20%E2%80%96%20(%F0%9D%91%A1%20%E2%8A%95%20%F0%9D%91%9A)%2C%20MAC_k(m')%3Dt" alt="%F0%9D%91%9A%E2%80%B2%20%3D%20%F0%9D%91%9A%20%E2%80%96%20(%F0%9D%91%A1%20%E2%8A%95%20%F0%9D%91%9A)%2C%20MAC_k(m')%3Dt">. 這個(gè)不符合前文的安全性的準(zhǔn)則。
為了讓CBC-MAC可以運(yùn)用于任意長度的message,我們?cè)兕~外加一個(gè)key?,我們把basic CBC-MAC輸出的tag(標(biāo)簽)叫做
,我們輸出?
.

三、HMAC (Hash-based Message Authentication Code)
我們讓代表一個(gè)hash function(散列函數(shù)),
其中,opad (outer padding) 是將0x5c重復(fù)排列直至長度為,ipad (inner padding) 是將0x36重復(fù)排列直至長度為block length?
.?

四、CMAC(Cipher-based Message Authentication Code)
CMAC分為以下兩個(gè)部分,
首先是sub-key 的生成,讓E代表一個(gè)block length為?
的block cipher,然后:
,?
?代表長度為b的全部為0的序列
如果L的most significant bit(最高位)為0,則
(<<為比特朝左位移);否則
,?
如果
的most significant bit為0,則
(<<為比特朝左位移);否則
tag 的生成如下:
將message m拆分成n個(gè)小塊
,其中前n-1個(gè)block都為complete block(長度都為b)
如果最后一個(gè)block?
是一個(gè)complete block,則
,否則
令
,
輸出
,MSB代表most significant bit,其中
代表輸出tag的長度

后記
還有其他很多的算法。
參考資料:
Jonathan Katz, Yehuda Lindell -?Introduction to Modern Cryptography
NIST Special Publication 800-38B?
Heiko Knospe -?A Course in Cryptography
使用工具:diagrams.net

THE END.