流程
CMAC(Cipher-based Message Authentication Code,基于密码的消息认证码)是一种通过对称加密算法生成消息认证码(MAC)的技术,用于验证数据的完整性和真实性。以下是CMAC的详细流程:
1. 密钥生成
首先,生成一个对称密钥 𝐾K,这个密钥用于整个CMAC的计算过程。
2. 初始化
初始化阶段使用密钥 𝐾K 和特定的加密算法(例如AES)来生成两个子密钥 𝐾1K1 和 𝐾2K2。
计算 𝐾1K1:
- 使用密钥 𝐾K 对一个全零的块进行加密,得到结果 𝐿L。
- 通过左移操作和条件异或操作生成 𝐾1K1。
计算 𝐾2K2:
- 通过左移 𝐾1K1 并进行条件异或操作生成 𝐾2K2。
3. 块处理
将输入消息 𝑀M 分成多个块,每块大小等于加密算法的块大小(例如128位)。假设消息 𝑀M 被分成 𝑛n 个块 𝑀1,𝑀2,…,𝑀𝑛M1,M2,…,Mn。
- 如果最后一个块的长度不足一个完整块,进行填充操作。
对每个块进行处理:
- 使用密钥 𝐾K 对第一个块进行加密。
- 对后续的每个块,首先与前一块的加密结果进行XOR操作,然后再使用密钥 𝐾K 进行加密。
4. 最终化
处理最后一个数据块:
- 如果最后一个块长度为完整块,使用 𝐾1K1 进行异或操作。
- 如果最后一个块长度不足一个完整块,先进行填充,然后使用 𝐾2K2 进行异或操作。
将上述结果再进行一次加密,得到最终的CMAC值。
步骤总结
- 密钥生成:生成并初始化对称密钥 𝐾K。
- 初始化:计算子密钥 𝐾1K1 和 𝐾2K2。
- 块处理:将消息分块,每块进行XOR和加密处理。
- 最终化:处理最后一个数据块,生成最终的CMAC值。
CMAC通过这些步骤保证了数据的完整性和真实性,适用于多种加密算法,如AES。
case a :消息数据是 128bit 的整数倍,使用私密密钥 k1 生成 MAC(T);
case b:消息数据不能整除,使用私密密钥 k2 生成 MAC(T);
私密密钥的生成又是按照如下方式生成:
- 初始向量 IV(0) + 原始 key,使用 AES-128-CBC,生成一个中间输出 L;
- 判断该 L 最高位是否等于 0;如果等于 0,k1 = L <<1;否则,k1 = (L << 1)XOR 0x87(Rb_const);
- 判断 k1 的最高位是否等于 0;如果等于 0,k2 = k1 <<1;否则,k2 = (L << 1)XOR 0x87(Rb_const);
C实现
![[test_cmac.c]]
结果:
♾️ txt 代码:
--------------------------------------------------
K 3d2e6de2 a12517ba c5b31bbd 0e7e3b54
Subkey Generation
AES_128(key) 3fb57abc bb53101d 5cad5547 bed7d0b3
K1 7f6af579 76a6203a b95aaa8f 7dafa166
K2 fed5eaf2 ed4c4075 72b5551e fb5f42cc
Example 1: len = 0
M <empty string>
AES_CMAC f9e658f2 443fa51b 1cabd200 513486c1
Example 2: len = 16
M 00112233 44556677 8899aabb ccddeeff
AES_CMAC a51eb807 bc447f92 fa33b569 9acb4cdf
Example 3: len = 40
M 00112233 44556677 8899aabb ccddeeff
ae2d8a57 1e03ac9c 9eb76fac 45af8e51
30c81c46 a35ce411
AES_CMAC b62e4ee4 4a0f0802 04cc0f07 60b538c0
Example 4: len = 64
M 00112233 44556677 8899aabb ccddeeff
ae2d8a57 1e03ac9c 9eb76fac 45af8e51
30c81c46 a35ce411 e5fbc119 1a0a52ef
f69f2445 df4f9b17 ad2b417b e66c3710
AES_CMAC b4963c38 9cbf399c d0755ff4 29234acd
--------------------------------------------------