GB/T 36624

编程入门 行业动态 更新时间:2024-10-18 22:24:54

<a href=https://www.elefans.com/category/jswz/34/1770212.html style=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生成流程

准备

  1. 加密算法CIPHER
  2. 密钥K;
  3. counter generation函数
  4. formatting函数
  5. MAC的比特长度Tlen

输入

  1. N为Nonce,长度为n字节
  2. A为associated data ,长度为a字节
  3. P为Message,长度为Plen比特,或记为p字节(Q为p的定长表示,Q的字节长度为q)

GB/T 36624-2018的建议

  1. GB/T 36624-2018推荐标签长度t从集合{32,48,64,80,96,112,128}中选取,并建议t>=64。
  2. GM/T 36624-2018推荐q在集合{2,3,4,5,6,7,8}中取,并建议:对大多数应用而言,建议取q=4。

输出

  1. 密文 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 解密与验证流程

准备:

  1. 加密算法CIPHER
  2. 密钥K;
  3. counter generation函数
  4. formatting函数
  5. MAC的比特长度Tlen

输入

  1. 随机数N
  2. 密文C,长度为Clen比特
  3. 关联数据(associated data)A

输出

  1. 明文 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)

输入

  1. N为Nonce,长度为n字节
  2. A为associated data ,长度为a字节
  3. P为Message,长度为p字节
  4. Q为p的定长表示,Q长度为q

这些长度的取值参见 NIST SP 800-38C A.1

输出

  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)

输入

  1. N为Nonce,长度为n字节
  2. P为Message,长度为p字节;Q为p的定长表示,Q长度为q

输出

  1. 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

  1. N为Nonce,长度为n字节
  2. 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

本文发布于:2024-03-10 21:09:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729040.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:GB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!