| 标准编号 | GB/T 38636-2020 (GB/T38636-2020) | | 中文名称 | 信息安全技术 传输层密码协议(TLCP) | | 英文名称 | Information security technology - Transport layer cryptography protocol (TLCP) | | 行业 | 国家标准 (推荐) | | 中标分类 | L80 | | 国际标准分类 | 35.040 | | 字数估计 | 34,357 | | 发布日期 | 2020-04-28 | | 实施日期 | 2020-11-01 | | 引用标准 | GB/T 20518; GB/T 35275; GB/T 35276 | | 发布机构 | 国家市场监督管理总局、中国国家标准化管理委员会 | | 范围 | 本标准规定了传输层密码协议,包括记录层协议、握手协议族和密钥计算。本标准适用于传输层密码协议相关产品(如SSL VPN网关、浏览器等)的研制,也可用于指导传输层密码协议相关产品的检测、管理和使用。 |
GB/T 38636-2020
Information security technology--Transport layer cryptography protocol(TLCP)
ICS 35.040
L80
中华人民共和国国家标准
信息安全技术 传输层密码协议(TLCP)
2020-04-28发布
2020-11-01实施
国 家 市 场 监 督 管 理 总 局
国 家 标 准 化 管 理 委 员 会 发 布
目次
前言 Ⅰ
1 范围 1
2 规范性引用文件 1
3 术语和定义 1
4 符号和缩略语 1
5 密码算法和密钥种类 2
5.1 概述 2
5.2 密码算法 3
5.3 密钥种类 3
6 协议 4
6.1 概述 4
6.2 数据类型定义 4
6.3 记录层协议 5
6.4 握手协议族 10
6.5 密钥计算 23
附录A(规范性附录) GCM可鉴别加密模式 24
参考文献 31
前言
本标准按照GB/T 1.1-2009给出的规则起草。
请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。
本标准由全国信息安全标准化技术委员会(SAC/TC260)提出并归口。
本标准起草单位:山东得安信息技术有限公司、格尔软件股份有限公司、北京信安世纪科技有限公
司、成都卫士通信息产业股份有限公司、长春吉大正元信息技术股份有限公司、北京握奇智能科技有限
公司、北京三未信安科技发展有限公司、北京海泰方圆科技有限公司、国家密码管理局商用密码检测中
心、北京江南天安科技有限公司、中金金融认证中心有限公司、北京天融信网络安全技术有限公司。
本标准主要起草人:郑强、马洪富、汪宗斌、罗俊、赵丽丽、张立廷、汪雪林、田敏求、张岳公、蒋红宇、
吕春梅、李国、孙圣男、雷晓锋。
信息安全技术 传输层密码协议(TLCP)
1 范围
本标准规定了传输层密码协议,包括记录层协议、握手协议族和密钥计算。
本标准适用于传输层密码协议相关产品(如SSLVPN网关、浏览器等)的研制,也可用于指导传输
层密码协议相关产品的检测、管理和使用。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文
件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
GB/T 20518 信息安全技术 公钥基础设施 数字证书格式规范
GB/T 35275 信息安全技术 SM2密码算法加密签名消息语法规范
GB/T 35276 信息安全技术 SM2密码算法使用规范
3 术语和定义
下列术语和定义适用于本文件。
3.1
数字证书 digitalcertificate
由证书认证机构(CA)签名的包含公开密钥拥有者信息、公开密钥、签发者信息、有效期以及扩展信
息的一种数据结构。
注:按类别可分为个人证书、机构证书和设备证书,按用途可分为签名证书和加密证书。
3.2
一种能以任意标识作为公钥,不需要使用数字证书证明公钥的非对称密码算法。
3.3
IBC标识 IBCidentity
表示实体身份或属性的字符串。
3.4
IBC公共参数 IBCpublicparameter
包含了IBC密钥管理中心的名称、运算曲线、标识编码方式和密钥生成算法等公开参数信息。
注:参数信息用于将实体标识转换为公开密钥。
3.5
在密码变换中,为增加安全性或使密码设备同步而引入的用作数据变换的起始数据。
4 符号和缩略语
4.1 符号
下列符号适用于本文件。
+:串联。
⊕:异或运算。
0s:包含s个‘0’比特的比特串。
CIPHK(X):对于密钥为K,分组为X 的分组密文的输出。
GCTRK(ICB,X):对于比特串为X,初始技术分组为ICB,密钥为K的GCTR函数的输出。
GHASHH(X):对于杂凑密钥为H,比特串为H的GHASH的输出。
HMAC(X,Y):以X 为密钥对Y 进行密码杂凑运算。
incs(X):比特串X 的最右边s比特的递增输出。
int(X):比特串X 的整数表示。
len(X):比特串X 的长度。
LSBs(X):比特串X 的最右段的s位比特串。
MSBs(X):比特串X 的最左端的s位比特串。
X||Y:比特串X 与比特串Y 的连接。
A:附加可鉴别的数据。
C:密文。
H:杂凑子密钥。
K:分组密钥。
P:明文。
R:算法中用于分组乘法运算的常数。
T:鉴别标签。
t:鉴别标签的长度。
4.2 缩略语
下列缩略语适用于本文件。
CTR:计数器(Counter)
DN:识别名(DistinguishedName)
IBC:标识密码算法 (Identity-BasedCryptography)
XOR:异或(Exclusive-OR)
5 密码算法和密钥种类
5.1 概述
TLCP是利用密码技术,为两个应用程序之间提供保密性和数据的完整性。协议用到的密码算法
包含非对称密码算法、分组密码算法、密码杂凑算法、数据扩展函数和伪随机函数,协议用到的密钥种类
包含服务端密钥、客户端密钥、预主密钥、主密钥和工作密钥。
5.2 密码算法
5.2.1 非对称密码算法
用于身份鉴别、数字签名、密钥交换等。
5.2.2 分组密码算法
用于密钥交换数据的加密保护和报文数据的加密保护。采用的工作模式应为GCM或CBC模式。
5.2.3 密码杂凑算法
用于对称密钥生成和完整性校验。
5.2.4 数据扩展函数P_hash
P_hash函数定义如下:
P_hash(secret,seed)= HMAC(secret,A(1)+seed)+
HMAC(secret,A(2)+seed)+
HMAC(secret,A(3)+seed)+
..
其中:
secret是进行计算所需要的密钥。
seed是进行计算所需要的数据。
A(0)=seed
A(i)= HMAC(secret,A(i-1))
P_hash能够反复迭代直至产生要求长度的数据。
5.2.5 伪随机函数PRF
PRF的计算方法如下:
PRF(secret,label,seed)=P_hash(secret,label+seed)
5.3 密钥种类
5.3.1 概述
采用非对称密码算法进行身份鉴别和密钥交换,身份鉴别通过后协商预主密钥,双方各自计算主密
钥,进而推导出工作密钥。使用工作密钥进行加解密和完整性校验。
5.3.2 服务端密钥
服务端密钥为非对称密码算法的密钥对,包括签名密钥对和加密密钥对,其中签名密钥用于握手过
程中服务端身份鉴别,加密密钥对用于预主密钥的协商。
5.3.3 客户端密钥
客户端密钥为非对称密码算法的密钥对,包括签名密钥对和加密密钥对,其中签名密钥用于握手过
程中客户端身份鉴别,加密密钥对用于预主密钥的协商。
5.3.4 预主密钥
预主密钥(pre_master_secret)是双方协商生成的密钥素材,用于生成主密钥。
5.3.5 主密钥
主密钥(master_secret)由预主密钥、客户端随机数、服务端随机数、常量字符串,经计算生成的
48字节密钥素材,用于生成工作密钥。
5.3.6 工作密钥
工作密钥包括数据加密密钥和校验密钥。其中数据加密密钥用于数据的加密和解密,校验密钥用
于数据的完整性计算和校验。发送方使用的工作密钥称为写密钥,接收方使用的工作密钥称为读密钥。
6 协议
6.1 概述
TLCP包括记录层协议和握手协议族,握手协议族包含密码规格变更协议、报警协议及握手协议。
6.2 数据类型定义
6.2.1 基本数据类型
定义了六种基本数据类型,分别为opaque、uint8、uint16、uint24、uint32、uint64。所有类型都以网
络字节顺序表示,最小数据的大小是一个8位字节。
opaque:任意类型数据,1个字节。
uint8:无符号的8位整数,1个字节。
uint16:无符号的16位整数,2个字节。
uint24:无符号的24位整数,3个字节。
uint32:无符号的32位整数,4个字节。
uint64:无符号的64位整数,8个字节。
6.2.2 向量
向量(Vectors)是给定类型的数据序列。向量分为两种:定长和变长。定长向量以[x]来表示;变长
向量以< x.y >来表示,其中x代表下限,y代表上限,如果只需表达上限时,用< y >表示。所有向量的长
度都以字节为单位。变长向量首部表示向量实际长度,其首部大小为能够容纳变长向量最大长度的最
小字节数。
6.2.3 枚举类型
枚举(Enumerateds)是一系列特定值的字段集合,通常每个字段都包括一个名称和值。如果包含
一个未命名的值,这个值表示指定的最大值。如果只包含了名称而不定义值,只能用来指代状态值,不
能在实际编码中使用。例如,enum{red(0),green(1),(255)}color。枚举变量大小为能够容纳最大枚
举值的最小字节数。
6.2.4 结构类型
结构类型(ConstructedTypes)用struct来定义,与C语言的struct语法类似。struct中的字段按
照先后顺序串连起来进行编码。如果一个struct包含于另一个struct中,则可以省略该struct的名字。
6.2.5 变体类型
变体(Variants)类型用select、case来定义,用于定义依赖外部信息而变化的结构,类似于C语言中
的union或ASN.1的CHOICE。
6.3 记录层协议
6.3.1 概述
记录层协议是分层次的,每一层都包括长度字段、描述字段和内容字段。记录层协议接收将要被传
输的消息,将数据分块、压缩(可选)、计算HMAC、加密,然后传输。接收到的数据经过解密、验证、解压
缩(可选)、重新封装然后传送给高层应用。
记录层协议包括:握手、报警、密码规格变更等类型。为了支持协议的扩展,记录层协议可支持其他
的记录类型。任何新的记录类型都应在针对上述类型分配的内容类型值之外去分配。如果接收到一个
不能识别的记录类型应忽略。
6.3.2 连接状态
连接状态是记录层协议的操作环境。包括四种典型的连接状态:当前读状态、写状态、未决的读状
态、未决的写状态。其中,读表示接收数据,写表示发送数据。所有记录都是在当前读写状态下处理的。
未决状态的安全参数可以由握手协议设定,而密码规格变更消息可使未决状态变为当前状态。除了最
初的当前状态外,当前状态应包含经过协商的安全参数。
连接状态的安全参数结构如下:
struct{
ConnectionEnd entity;
CipherType cipher_type;
uint8 key_material_length;
MACAlgorithm mac_algorithm;
uint8 hash_size;
opaque master_secret[48];
opaque client_random[32];
opaque server_random[32];
uint8 record_iv_length;
uint8 fixed_iv_length;
uint8 mac_length;
}SecurityParameters;
其中:
a) ConnectionEnd
表示本端在连接中的角色,为客户端或服务端。定义为:
enum{server,client}ConnectionEnd。
b) BulkCipherAlgorithm
用于数据加解密的密码算法。定义为:
enum{sm4}BulkCipherAlgorithm。
表示密码算法的类型。定义为:
enum{block}CipherType。
d) key_material_length
表示密钥材料的长度。
e) MACAlgorithm
用于计算和校验消息完整性的密码杂凑算法。定义为:
enum{sha_256,sm3}MACAlgorithm。
f) hash_size
表示杂凑的长度。
g) CompressionMethod
用于数据压缩的算法。定义为:
enum{nul(0),(255)}CompressionMethod。
h) master_secret
在协商过程中由预主密钥、客户端随机数、服务端随机数计算出的48字节密钥。
i) client_random
由客户端产生的32字节随机数据。
j) server_random
由服务端产生的32字节随机数据。
k) record_iv_length
初始向量的长度。
l) fixed_iv_length
固定的初始向量长度。
m) mac_length
MAC长度。
记录层将使用上述安全参数来生成下列内容:
---客户端写密钥clientwritekey。
---服务端写密钥serverwritekey。
---客户端写初始向量clientwriteiv。
---服务端写初始向量serverwriteiv。
服务端接收和处理记录时使用客户端写参数,客户端接收和处理记录时使用服务端写参数。用安
全参数生成这些密钥的算法,见6.5。密钥生成后,连接状态就可以改变为当前状态。
6.3.3 记录层
6.3.3.1 概述
记录层接收从高层来的任意大小的非空连续数据,将数据分段、压缩、计算校验码、加密,然后传输。
接收到的数据经过解密、验证、解压缩、重新封装然后传送给高层应用。
6.3.3.2 分段
记录层将数据分成214字节或者更小的片段。
每个片段结构如下:
struct{
uint16length;
}TLSPlaintext;
其中:
a) Type:
片段的记录层协议类型。定义为:
enum{
change_cipher_spec(20),alert(21),handshake(22),
}ContentType;
b) Version:
所用协议的版本号。这里的版本号为1.1。定义为:
struct{
uint8major=0x01,
uint8minor=0x01;
}ProtocolVersion;
c) length
以字节为单位的片段长度,小于或等于214。
d) fragment
将传输的数据。记录层协议不关心具体数据内容。
6.3.3.3 压缩和解压缩
所有的记录都使用当前会话状态指定的压缩算法进行压缩。当前会话状态指定的压缩算法被初始
化为空算法。
压缩算法将一个TLSPlaintext结构的数据转换成一个TLSCompressed结构的数据。
压缩后的数据长度最多只能增加1024个字节。如果解压缩后的数据长度超过了214个字节,则报
压缩后数据结构如下:
struct{
uint16length;
}TLSCompressed;
其中:
a) type、version的定义同6.3.3.2中的a)、b)。
b) length
c) fragment
6.3.3.4 加密和校验
6.3.3.4.1 概述
加密运算和校验运算把一个TLSCompressed结构的数据转化为一个TLSCiphertext结构的数据。
解密运算则是执行相反的操作。
加密后数据结构如下:
struct{
uint16length;
caseaead:GenericAEADCipher;
}fragment;
}TLSCiphertext;
其中:
a) type、version的定义同6.3.3.2中a)、b)。
b) length
c) fragment
6.3.3.4.2 校验算法的数据处理
校验码的计算是在加密之前进行,运算方法如下:
其中:
a) seq_num
序列号。每一个读写状态都分别维持一个单调递......
|