CMAC算法原理
1、CMAC 原理
采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,
增加了分组之间的关联性。
CMAC 计算的步骤可分为:
1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理;
2、消息加密处理;
3、最后一个块(block)处理,得到固定长度的 MAC 值。
1.1 、子密钥计算(K1/K2 生成)
AES-CMAC 通过 AES-CBC 加密算法对主密钥 K 进行扩展计算,得到子密钥 K1,之后再由 K1 拓展得到子密钥 K2
主要步骤如下:
1、将密钥 K,及全 0 的常量通过 AES-128(K, const_Zero)计算得到密文 L;
2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。否则,K1 是 const_Rb 与 L 左移 1 位
的异或;
3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。否则,K2 是 const_Rb 与 K1 左移
1 位的异或;
如下为对应的伪代码:
const_Zero = 0x00000000000000000000000000000000;
const_Rb = 0x00000000000000000000000000000087;
/* Variables: L for output of AES-128 applied to 0^128*/
L = AES-128(K, const_Zero);
if (MSB(L) is equal to 0)
{
K1 = L << 1;
}else
{
K1 = (L << 1) XOR const_Rb;
}
if (MSB(K1) is equal to 0)
{
K2 = K1 << 1;
}else
{
K2 = (K1 << 1) XOR const_Rb;
}
return K1, K2;
1.2、CMAC 工作原理
1、初始化:CMAC 使用一个固定长度的密钥来初始化,密钥长度通常与底层的对称加密算法(如 AES)相关联。
2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小
3、生成子密钥,参考上面的子密钥计算;
4、生成 MAC:将消息的每个块与 K1 进行加密。对于最后一个块,若长度不够,则使用填充,填充方式可选 ISO/IEC 9797-1
Padding Method。在与 K2 异或为最后一个块 Mn。若最后一个块 Mn 是完整块,则 Mn 与 K1 异或之后作为最后一个块 Mn。
整体示意图如下: