GB/T 36624"/>
GB/T 36624
说明:以下章节写为第7章是为了和标准GB/T 36624-2018的章节对应
7. 机制2——CCM
7.1 CCM概述
CCM是加密认证模式,CCM = CTR加密 + CBC-MAC认证。
CCM模式看起来比较繁琐,尤其在参数的选择上,限制不断。
很可能在将来某天被别的方法替代。
7.2 加密与MAC生成流程
准备:
- 加密算法CIPHER
- 密钥K;
- counter generation函数
- formatting函数
- MAC的比特长度Tlen
输入
- N为Nonce,长度为n字节
- A为associated data ,长度为a字节
- P为Message,长度为Plen比特,或记为p字节(Q为p的定长表示,Q的字节长度为q)
GB/T 36624-2018的建议
- GB/T 36624-2018推荐标签长度t从集合{32,48,64,80,96,112,128}中选取,并建议t>=64。
- GM/T 36624-2018推荐q在集合{2,3,4,5,6,7,8}中取,并建议:对大多数应用而言,建议取q=4。
输出
- 密文 C(C包含了P对应的密文和MAC信息)
步骤
Step 1. 用formatting函数formatting_function(N, A, P)生成B0, …,Br
Step 2. Y0= CIPHK(B0).
Step 3. For i = 1 to r, do Yi = CIPHK(Bi ⊕ Yi-1).
Step 4. T=MSBTlen(Yr).
Step 5. 用counter generation函数生成Ctr0, Ctr1, …, Ctrm, 其中m=向上取整(Plen/128).
Step 6. For j=0 to m, do Sj= CIPHK(Ctrj).
Step 7. S= S1 || S2 || …|| Sm.
Step 8. Return C=(P ⊕ MSBPlen(S)) || (T ⊕ MSBTlen(S0)).
其中:
- counter generation函数和formatting函数后面介绍;
- MSBPlen()表示取最高的Plenbit,其余类似。
- r: r+1 = formatting_function(N, A, P)的输出大小 ÷ 加密算法CIPHER的分组大小,一定整数,这也是 formatting_function存在的意义之一。
加密与MAC生成流程示意图如下:
图7.1 CCM的加密与MAC生成流程示意图
7.3 解密与验证流程
准备:
- 加密算法CIPHER
- 密钥K;
- counter generation函数
- formatting函数
- MAC的比特长度Tlen
输入
- 随机数N
- 密文C,长度为Clen比特
- 关联数据(associated data)A
输出
- 明文 P(或者INVALID)
步骤
Step 1. If Clen≤Tlen, then return INVALID.
Step 2. 用counter generation函数生成Ctr0, Ctr1, …, Ctrm, 其中m=向上取整(Plen/128).
Step 3. For j=0 to m, do S j= CIPHK(Ctrj).
Step 4. S= S1 || S2 || …|| Sm.
Step 5. P=MSBClen-Tlen(C) ⊕ MSBClen-Tlen(S).
Step 6. T=LSBTlen(C) ⊕ MSBTlen(S0).
Step 7. 如果 N, A, P无效, then return INVALID,
否则,用formatting函数 formatting_function (N, A, P)生成B0, B1, …, Br.
Step 8. Set Y0= CIPHK(B0).
Step 9. For i = 1 to r, do Yj = CIPHK(Bi ⊕ Yi-1).
Step 10. If T≠MSBTlen(Yr), then return INVALID, else return P.
7.4 formatting_function(N, A, P)
B = B0 || B1 || … || Bm ← Encode(N) || Encode(A)|| Encode(P)
输入
- N为Nonce,长度为n字节
- A为associated data ,长度为a字节
- P为Message,长度为p字节
- Q为p的定长表示,Q长度为q
这些长度的取值参见 NIST SP 800-38C A.1
输出
- B = B0 || B1 || … || Bm,每个128比特
表 B的各个分组的含义概要信息
B的各分组块 | 含义概要 |
B0 | Encode(N) ← flags || N || Q flags为1字节 |
B1~Bu | Encode(A) ← Encode(a) || A || 0...0 Encode(a)为A的字节长度a的编码方案 |
Bu+1~Bm | Encode(P) ← P || 0...0 填充为16字节的整数倍 |
步骤
步骤1:16字节的B0 = Encode(N),记录Nounce值N 和flag等信息。
表 16字节B0的各字节含义
字节序号 | 0 (1字节) | 1 to 15-q (15-q字节) | 16-q to 15 (q字节) |
内容 | Flags | N | Q |
表 B0的第一个字节Flags各比特的含义
比特序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
含义 | Reserved 取0 | 有A取1 无A取0 | (t-2)/2 | q-1 |
GM/T 36624-2018推荐q在集合{2,3,4,5,6,7,8}中取,并建议:对大多数应用而言,建议取q=4。
步骤2: B1~Bu = Encode(A) = Encode(a) || A || 0...0。
这一段是关联数据A的编码。Encode(a)为A的字节长度a的编码方案。
其中0...0表示末尾添加很多零,使得Encode(A)为16字节的倍数
表 Encode(a)的编码方案,a为A的字节长度
a的范围 | Encode(a)长度 | Encode(a)值 |
if 0 < a < 2^16 - 2^8 | 2字节 | [a]16 |
if 2^16 – 2^8 ≤ a < 2^32 | 6字节 | 0xff||0xfe||[a]32 |
If 2^32 ≤ a < 2^64 | 10字节 | 0xff||0xff||[a]64 |
[a]16表示把a写成16bit长,其余类似。
步骤3:Bu+1~Bm = Encode(P) = P || 0...0,记录消息P的编码数据
其中0...0表示末尾添加很多零,使得Encode(P)为16字节的倍数
7.5 counter generation function
Ctr0 || Ctr1 || …|| Ctrm = counter generation(N,q)
输入
- N为Nonce,长度为n字节
- P为Message,长度为p字节;Q为p的定长表示,Q长度为q
输出
- Ctr0 || Ctr1 || …|| Ctrm,每个128比特
步骤
步骤1:Ctri结构与formatting_function(N, A, P) 中的B0非常类似,如下表。
表 每个16字节分组Ctr(i)的含义
字节序号 | 0 (1字节) | 1 to 15-q (15-q字节) | 16-q to 15 (q字节) |
内容 | Flags | N | i |
- N为Nonce,长度为n字节
- GM/T 36624-2018推荐q在集合{2,3,4,5,6,7,8}中取,并建议:对大多数应用而言,建议取q=4。
表 Ctr(i)的第一个字节Flags的含义
比特序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
含义与值 | Reserved 取0 | Reserved 取0 | 000 | q-1 |
这些长度的取值参见 NIST SP 800-38C A.1。
更多推荐
GB/T 36624
发布评论