目录
1. CCM模式
2.认证加密过程
3.校验解密过程
1. CCM模式
CCM(Counter with CBC-MAC) 首先使用 CBC-MAC 来保证数据完整性和真实性,然后使用 CTR 模式来保证数据机密性。
在CCM中,受保护的数据被称为payload,简称P;参与认证的特定关联数据(associated data),简称A;与P和ADD配对的数据Nonce,该数据在特定上下文下只会使用一次,简称N。CCM生成的MAC,记为T。
2.认证加密过程
CCM认证加密功能需要四个输入:
- 明文,简称P;
- 额外认证数据(AAD),简称A;
- Nonce,简称N;
- 密钥Key
总体流程如下:
图 13 CCM加密过程
具体步骤为:
- 将N || A || P拼接,拆分为128位为单位的Block,记为B0,B1....Br;
- 使用CBC-MAC进行计算得到T,其中B0的生成在下文讲述;
- 将明文P拆分为128位为单位的Block(根据实际开发,标准中不需要拆分),记为P1,P2...Pm;
- 使用CTR对明文进行加密得到密文C1 ||...||...Cm;对T进行加密得到C0;
- 将C0作为最终Tag值拼接在密文最后,得到最终输出C。
CBC-MAC使用到的B0格式如下:
其中,N表示nonce,Q表示明文P的长度的二进制表现;
Flag位域解释如下:
- Adata = 1,表示当前AAD输入不为空;否则ADD为空;
- t表示MAC长度,取指范围{4, 6, 8, 10, 12, 14, 16}。由于最大长度为16字节,但位域只有3bit,因此需要做编码处理;例如假设当前t = 16,对应Flag bit[5:3]就为(16-2)/2 = 7,二进制位111;
- q影响Q的字节长度,取指范围{2,3,4,5,6,7,8}
N的长度n取值范围为{7, 8, 9, 10, 11, 12, 13},这将影响q的取值;
B0生成举例如下:
假设N的长度为7,q = 15-7 = 8,因此Flag中,[q-1]3 = 111,故Q的长度为7个字节,假设当前P的长度为10000个字节,故Q的十六进制为00 00 00 00 00 27 10,对应二进制为:00000000 00000000 00000000 00000000 00000000 00100111 00010000;如MAC要求长度为16,则t = 16,对应bit为111;不包含AAD,Flag.bit6 = 0,故整体B0 生成如下(十六进制):
3F NN NN NN NN NN NN NN NN 00 00 00 00 00 27 10
CTRi的生成方式如下:
其中,i表示当前counter数,q与B0生成方式中的q一致。
3.校验解密过程
校验解密过程就是一个逆序过程,需要的输入为:
- Nonce;
- associated data,A;
- 密文C
过程如下:
具体步骤如下:
- 判断如果密文长度小于Tag长度,直接返回无效,不进行解密;
- 将密文取出(排除Tag)划分为m个数据块,使用CTR进行解密,得到明文;取出Tag使用CTR进行解密,得到实际T;
- 使用CBC-MAC计算出T*,与T进行比较,如果比较成功,返回明文;否则返回无效,拒绝返回明文。
4.小结
可以看到,对于算法的使用者来说,必要的输入为Nonce和associated data(A),而Nonce主要是用于生成CTR0,B0,因此它其实就是对应我们常谈论的IV,只是在生成过程中做了拼接。