密码学之消息认证码算法
前言
文中出现的 和
是同一个意思,都代表 a 序列和 b 序列的concatenation(级联),前者为自己习惯的用法,后者更为正式。
*注意:括号内的中文来自google translate,未必专业

一、ECB & CBC
Block cipher(分组密码)的block长度是固定的(比如说128bit,256bit等等),但是我们需要加密的信息的长度是不固定的,通常来说都要大于block的长度。问题是如何用一个固定长度的block cipher来加密非固定长度的message(信息)。
一个最原始的想法是将message m 切割为长度相等的小块,每一个小块都用block cipher加密,然后将最后加密后的密文组合起来,这种方法叫做ECB (Electronic Code Book) 。

但是这种加密方式有一个安全缺陷——如果我们的message具有一定的结构性,那么ECB加密后的ciphertext(密文)也会保留这个结构性。
CBC (Cipher Block Chaining) 则是在ECB的基础上加入一些改动,加密流程如下

二、CBC-MAC
CBC-MAC是运用CBC对我们的message 进行加密,
.
以上的CBC-MAC叫做basic CBC-MAC,只适合用于固定长度的message。因为攻击者可以建立. 这个不符合前文的安全性的准则。
为了让CBC-MAC可以运用于任意长度的message,我们再额外加一个key ,我们把basic CBC-MAC输出的tag(标签)叫做
,我们输出
.

三、HMAC (Hash-based Message Authentication Code)
我们让代表一个hash function(散列函数),
其中,opad (outer padding) 是将0x5c重复排列直至长度为,ipad (inner padding) 是将0x36重复排列直至长度为block length
.

四、CMAC(Cipher-based Message Authentication Code)
CMAC分为以下两个部分,
首先是sub-key 的生成,让E代表一个block length为
的block cipher,然后:
,
代表长度为b的全部为0的序列
如果L的most significant bit(最高位)为0,则
(<<为比特朝左位移);否则
,
如果
的most significant bit为0,则
(<<为比特朝左位移);否则
tag 的生成如下:
将message m拆分成n个小块
,其中前n-1个block都为complete block(长度都为b)
如果最后一个block
是一个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.

