正文
ASN.1(Abstract Syntax Notation One,抽象语法记法1)是一种在计算机网络中为传输数据结构信息提供编码规则的标记语言,在商用密码技术、产品和服务中被广泛应用。商用密码应用安全性评估(以下简称“密评”)实施过程中,密评人员经常需要对基于ASN.1编码规则定义的X.509数字证书、密钥、密文、签名、电子签章等数据进行分析。本文简要介绍ASN.1的基本语法、编码规则和应用,给出对基于ASN.1编码的X.509数字证书数据、RSA/SM2公私钥数据、SM2签名/加密数据、安全电子签章数据等进行分析的内容和目的、思路和方法,希望为密评人员开展相关密评工作提供借鉴和参考。
ASN.1是ISO和ITU-T的联合标准,最初为1984年的CCITT X.409:1984的一部分。由于其广泛应用,1988年ASN.1移到独立标准X.208,1995年进行全面修订后变成X.680系列标准,最新可用为2021年的版本。
ASN.1作为描述结构化信息的标记语言,为计算机网络传输数据结构信息提供相应的编解码规则,其与平台和编程语言无关,允许用一致的方式从简单数据类型构造任意复杂的数据结构,适合表示现代通信应用中的那些复杂的、变化的及可扩展的数据结构。
ASN.1 语言规范分为两部分:语法规则和编码规则。语法规则从数据类型、内容顺序或结构等方面来描述消息的内容;编码规则说明如何对语法规则中定义的抽象值进行编码。ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、正则编码规则(CER,Canonical Encoding Rules)、非典型编码规则(DER,Distinguished Encoding Rules)、紧缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。
ASN.1基本语法包括ASN.1词项、类型定义、子类型定义、赋值以及类型分类。ASN.1最基本的概念是类型和值,一种类型是一组值的集合(非空)。一个类型可以是简单类型也可以是构造类型,简单类型是ASN.1的基本组成部分,是“原子级”的类型,通常用来描述事物的单一属性。构造类型是由两种以上成分构成的类型。
关于ASN.1的高级特点(例如宏)以及更多细节,读者可查阅ITU-T相关标准进行深入了解。
ASN.1词项:
● 由字母开头;
●
由字母、数字、连字符(减号)组成;
●
不能以连字符结尾;
●
不能有两个连续的连字符在一块。
特别指出:
●
类型名由大写字母开头。
●
标识符由小写字母开头。
●
ASN.1保留字全部由大写字母组成,例:SET、SEQUENCE等。
●
标记用方括号表示,通过给出它的类别和类别编号来说明,包括通用、应用、专用和上下文特定四种类别,例如[APPLICATION 0]。方括号中仅有数字为上下文特定类别,例如[0]、[1]等。
语法:
::=
示例:
语法:
::=
(
)
示例:
ASN.1定义了包括布尔、整数、位串、字符串、八位位组等在内的多种简单类型,它们是构成复杂数据类型和值的基础。简单类型是“原子级”的类型。表1列举了一些简单类型。
除了简单类型,ASN.1还定义了构造类型,构造类型是通过基本类型的组合而形成的较复杂的数据结构。表 2列举了一些构造类型。
表 2 构造类型
ASN.1在商用密码中应用时,常见的编码规则有BER(基本编码规则)、CER(正则编码规则)、DER(非典型编码规则)。其中:BER(基本编码规则)是ASN.1中最早定义的编码规则,采用TLV三元组
的编码形式。CER(正则编码规则)和DER(非典型编码规则)均是BER的变体,是在BER基础上增加了限制,适用于不同应用场景。
限于篇幅原因,本文不对BER、CER、DER等ASN.1编码规则进行展开介绍,后期将通过系列文章分别对BER、CER、DER等ASN.1编码规则进行详细介绍。
ASN.1编码在商用密码中的应用,包括但不限于X.509数字证书、公私钥格式、SM2数据格式、SM2数字信封以及安全电子签章等方面。本文主要对相关标准中定义的X.509数字证书、公私钥格式、SM2数据格式、SM2数字信封、安全电子签章的数据结构进行分析。
X.509数字证书的基本数据结构如下:
上述的证书数据结构由tbsCertificate、signatureAlgorithm和signatureValue三个域组成。这些域的含义如下:
● tbsCertificate域包含主体名称和颁发者名称、主体的公钥、证书有效期以及其他的相关信息。
● signatureAlgorithm域包含证书签发机构签发该证书所使用的密码算法的标识符。一个算法标识符的ASN.1结构如下:
算法标识符用来标识一个密码算法,其中OBJECT IDENTIFIER部分标识了具体的算法。其中可选参数的内容完全依赖于所标识的算法。该域的算法标识符必须与tbsCertificate中的signature标识的签名算法项相同。如果签名算法为SM2,无参数。
● signatureValue域包含了对tbsCertificate域进行数字签名的结果。采用ASN.1 DER编码的tbsCertificate作为数字签名的输入,而签名的结果则按照ASN.1编码成BIT STRING类型并保存在证书签名值域内。
● 版本号(version)
其类型Version的ASN.1结构如下:
Version ::= INTEGER {v1(0),v2(1),v3(2)},到目前为止,证书格式的版本只有v1、v2、v3,分别用整数0、1、2表示。
● 证书序列号(serialNumber)
其类型CertificateSerialNumber的ASN.1结构如下:
CertificateSerialNumber::=INTEGER。
● 签名算法(signature)
签名算法(signature)给出了CA签发证书时所使用的数字签名算法,它的类型与signatureAlgorithm的类型相同,都为AlgorithmIdentifier。
● 颁发者(issuer)
本项标识了证书签名和证书颁发的实体,该项被定义为Name类型,Name描述了由一些属性组成的层次结构的名称,ASN.1结构如下:
● 有效期(validity)
证书的有效使用期包含起、止两个时间值,时间值可以使用UTCTime或者GeneralizedTime的形式表示,ASN.1结构如下:
● 主体(subject)
本项描述了与主体公钥项中的公钥相对应的实体。主体名称可以出现在主体项和/或主体替换名称扩展项中(subjectAltName)。其ASN.1结构参见颁发者项(issuer)。证书的签发者和证书主体用X.509 DN表示,DN是由RDN构成的序列,采用多个字段来标识一个实体。RDN用“属性类型=属性值”的形式表示。常用的属性类型名称和简写如下:
●
主体公钥信息(subjectPublicKeyInfo)
本项用来标识公钥和相应的公钥算法,ASN.1结构如下:
●
颁发者唯一标识符(issuerUniqueID)
证书签发者的唯一标识符,ASN.1结构如下:
UniqueIdentifier ::= BIT STRING
●
主体唯一标识符(subjectUniqueID)
证书主体的唯一标识符,ASN.1结构参见颁发者唯一标识符(issuerUniqueID)。
●
扩展项(extensions)
本项是一个或多个证书扩展的序列,ASN.1结构如下:
公私钥格式在不同标准中有不同的定义,本节对RSA、SM2公私钥在不同标准中公私钥封装格式进行了梳理,关于RSA、SM2公私钥封装格式更多细节,读者可查阅PKCS#1、PKCS#8、GB/T 35275-2017、GB/T 35276-2017、SEC 1: Elliptic Curve Cryptography等标准进行深入了解。
(1)RSAPublicKey
PKCS#1:
RSA Cryptography Specifications Version 2.1
定义了一种RSA公钥格式,ASN.1定义为:
其中:
图2 RSA公钥ASN.1结构示例(RSAPublicKey)
(2)SubjectPublicKeyInfo
RSA X.509数字证书中的公钥格式为SubjectPublicKeyInfo,ASN.1定义为:
其中:
图 3 RSA公钥ASN.1结构示例(SubjectPublicKeyInfo)
(1)SM2PublicKey
GB/T 35276-2017
《信息安全技术 SM2密码算法使用规范》定义了一种SM2公钥格式,ASN.1定义为:
SM2PublicKey为BIT STRING 类型,内容为04‖ X‖ Y,其中,X和Y分别标识公钥的x 分量和y分量,其长度各为256 位。
(2)SubjectPublicKeyInfo
GB/T
35275-2017
《信息安全技术 SM2密码算法加密签名消息语法规范》定义了一种SM2公钥格式,ASN.1定义为:
其中:
图 4 SM2公钥ASN.1结构示例(SubjectPublicKeyInfo)
(1)RSAPrivateKey
PKCS#1: RSA
Cryptography Specifications Version 2.1定义了一种RSA私钥格式,ASN.1定义为:
RSAPrivateKey结构中各项含义见表 3。
图 5 RSA私钥ASN.1结构示例(RSAPrivateKey)
(2)PrivateKeyInfo
PKCS#8: Private-Key
Information Syntax Standard定义了一种私钥信息的语法,可适用于RSA明文私钥格式,ASN.1定义为:
PrivateKeyInfo结构中各项含义见表4。
表4
PrivateKeyInfo数据类型
图 6 RSA私钥ASN.1结构示例(PrivateKeyInfo)
(3)EncryptedPrivateKeyInfo
PKCS#8: Private-Key
Information Syntax Standard定义了一种加密私钥信息的语法,可适用于RSA密文私钥格式,ASN.1定义为:
EncryptedPrivateKeyInfo
结构中各项含义见表5。
表5
EncryptedPrivateKeyInfo数据类型
图7 RSA私钥ASN.1结构示例(EncryptedPrivateKeyInfo)
(1)SM2PrivateKey
GB/T 35276-2017《信息安全技术 SM2密码算法使用规范》定义了一种SM2私钥格式,ASN.1定义为:
SM2PrivateKey ::=
INTEGER
(2)
ECPrivateKey
GB/T 35275-2017《信息安全技术 SM2密码算法加密签名消息语法规范》定义了一种SM2私钥格式,ASN.1定义为:
表6
ECPrivateKey
数据
类型
图 8 SM2私钥ASN.1结构示例(
ECPrivateKey
)
(3)PrivateKeyInfo
SM2私钥格式也可以为PKCS#8定义的PrivateKeyInfo,此时,PrivateKey 的值为ECPrivateKey。
图9 SM2私钥ASN.1结构示例(PrivateKeyInfo)
GB/T 35276-2017《信息安全技术 SM2密码算法使用规范》为SM2密码算法的使用制定了统一的数据格式和使用方法,本节介绍加密数据格式、签名数据格式和密钥对保护数据格式。SM2密钥数据格式已在上节(公私钥格式)中表述,在此不再赘述。
SM2算法加密后的数据格式的ASN.1定义为:
SM2Cipher结构中各项含义见表 7。
SM2算法签名数据格式的ASN.1定义为:
SM2Signature
结构中各项含义见
表
8。
表8
SM2Signature数据类型
在SM2密钥对传递时,需要对SM2密钥对进行加密保护。具体保护方法为:
b) 按对称密码算法标识指定的算法对SM2 私钥进行加密,得到私钥的密文。若对称算法为分组算法,则其运算模式为ECB;
c) 使用外部SM2公钥加密对称密钥得到对称密钥密文;
d) 将私钥密文、对称密钥密文封装到密钥对保护数据中。
SM2 密钥对的保护数据格式的 ASN.1 定义为:
SM2EnvelopedKey结构中各项含义见表9。
GB/T 35275-2017《信息安全技术 SM2密码算法加密签名消息语法规范》中定义了6种消息数据封装类型,包括数据类型(Data)、签名数据类型(signedData)、数字信封数据类型(envelopedData)、签名及数字信封数据类型(signedAndEnvelopedData)、加密数据类型(encryptedData)、密钥协商类型(keyAgreementInfo)。本节选取数字信封数据类型(envelopedData),对其ASN.1结构进行介绍。
ContentInfo类型标明内容交换通用语法结构,内容交换的通用语法结构定义如下:
其中:
ContentType内容类型是一个对象标识符,数字信封数据类型的对象标识符为1.2.156.10197.6.1.4.2.3。
content为内容,可选。
数字信封envelopedData数据类型由加密数据和至少一个接收者的数据加密密钥的密文组成。其中,加密数据用数据加密密钥加密,数据加密密钥用接收者公钥加密。
envelopedData数据类型结构定义如下:
EnvelopedData结构中各项含义见表10。
表10
EnvelopedData数据类型
RecipientInfo结构中各项含义见表11。
表11 RecipientInfo数据类型
EncryptedContentInfo结构中各项含义见表12。
表
12 EncryptedContentInfo数据类型
图13 数字信封ASN.1结构示例
国内电子签章产品种类众多,应用范围广泛。本节参考GB/T38540-2020《信息安全技术 安全电子签章密码技术规范》,主要介绍基于ASN.1的电子印章数据格式、电子签章数据格式。
电子印章由印章信息、制章者证书、签名算法标识、签名值等部分组成。电子印章数据的ASN.1定义为:
表13
电子印章数据类型
其中,印章信息eSealInfo由印章头、印章标识、印章属性、印章图像数据、自定义数据等部分组成。印章信息eSealInfo的ASN.1定义如下:
SES_SealInfo结构中各项含义见表14。
表14
印章
信息数据类型
其中,印章头由头标识、版本号和厂商标识等组成。印章头的ASN.1定义为:
SES_Header结构中各项含义见表15。
表15
印章头数据
类型
印章属性由印章类型、印章名称、签章者证书信息类型、签章者证书信息列表、制作时间、有效期起始时间、有效期终止时间等部分组成。印章属性的ASN.1定义为:
SES_ESPropertyInfo结构中各项含义见表 16。
表16
印章属性数据
类型
签章者证书信息列表的ASN.1定义为:
其中:
CertInfoList为签章者证书
CertDigestList为签章者证书杂凑值
其中:
ObjType为自定义类型
CertDigestValue为证书杂凑值
印章图像数据由图像类型、图像数据、图像显示宽度和图像显示高度等部分组成。印章图像数据的ASN.1定义为:
SES_ESPictrueInfo结构中各项含义见表 17。
表17
印章图像数据
类型
自定义数据包含一系列自定义属性字段,可用于支持电子印章扩展特性,其ASN.1定义为:
ExtData结构中各项含义见表18。
电子签章数据由签章信息、签章者证书、签章算法标识、签名值、时间戳等组成。电子签章数据的ASN.1定义为:
SES_Signature结构中各项含义见表 19。
表19 电子签章
数据类型
其中,签章信息由版本号、电子印章、签章时间、原文杂凑值、自定义数据等组成。签章信息的ASN.1定义为:
TBS_Sign结构中各项含义见表20。
表20
签章信息数据类型
密评实施过程中,常常需要对采集的数据包、协议报文、数字证书等数据进行密码应用安全性分析研判。其中很多数据的编码都基于ASN.1实现,本章重点介绍对密评过程中采集的基于ASN.1编码的X.509数字证书数据、RSA/SM2公私钥数据、SM2签名/加密数据、安全电子签章数据等进行分析的内容和目的、思路和方法。
分析内容和目的:
针对常见的SSL、IPSec协议报文、数据库中的X.509数字证书的类型、颁发者、使用者、有效期、签名算法、签名值等数据进行分析,检验其合规性。
分析思路和方法:
(1)结合X.509数字证书类型,并依据相关标准,查阅X.509数字证书在相关标准定义的ASN.1结构以及字段的描述,RSA数字证书可参考ITU-T X.509,SM2数字证书可参考GM/T 0015-2012《基于SM2密码算法的数字证书格式规范》。
(2)使用ASN.1解码工具打开X.509数字证书数据。例如,使用Asn1View打开X.509数字证书数据,可直观展示X.509数字证书的字段内容,Asn1View工具如图15所示。
图15 Asn1View工具
(3)查看并分析证书关键字段信息,包括证书颁发者、证书使用者、证书有效期、证书签名算法、证书签名等字段。核查证书颁发者字段,确认签发该证书的CA机构信息;核查证书使用者字段,确认证书的使用主体;核查证书有效期字段,确认证书是否过期;核查证书签名算法字段,确认上级CA签名使用的算法;核查证书签名值,确认上级CA签名的签名值。X.509数字证书ASN.1结构示例如下所示。
图17 证书使用者
图18 证书有效期(起始日期)
图19 证书有效期(终止日期)
图20 证书签名算法
证书签名算法对象标识符为1.2.156.10197.1.501,由GM/T 0006-2012《密码应用标识规范》可知为基于SM2算法和SM3算法的签名。
图21 对象标识符
图22 证书签名值
证书签名格式为BIT
STRING,从BIT STRING的Value中可提取出SM2签名数据。
若获取了证书链,可以提取使用者证书、CA证书的证书签名,借助算法校验工具,可对证书链签名值的正确性进行验证。
证书签名格式为BIT
STRING,从BIT STRING的Value中可提取出SM2签名数据。
(4)若获取了证书链,可以提取使用者证书、
CA证书的证书签名,借助算法校验工具,可对证书链签名值的正确性进行验证。
分析内容和目的:针对应用系统客户端或服务端存储的RSA、SM2公私钥数据,核查私钥是否为明文存储、验证密钥对匹配性等。
分析思路和方法:
(1)查阅
RSA
、SM2公私钥格式在相关标准定义的ASN.1结构以及字段描述,RSA公私钥格式可参考PKCS#1、PKCS#8,SM2公私钥格式可参考GB/T 35275-2017《信息安全技术 SM2密码算法加密签名消息语法规范》、GB/T 35276-2017《信息安全技术 SM2密码算法使用规范》、SEC 1: Elliptic
Curve Cryptography、PKCS#8。
(2)分析公私钥的结构,若私钥为明文,可借助算法校验工具验证密钥对的匹配性。RSA、SM2公私钥数据ASN.1结构示例如下所示。
图23
RSA公钥算法对象标识符
如图23所示,由前文所介绍公钥格式的ASN.1结构和算法标识的对象标识符(1.2.840.113549.1.1.1)可知,为RSA公钥且格式为SubjectPublicKeyInfo。
图24 RSA公钥
如图24所示,RSA公钥为BIT STRING,BIT STRING的Value为RSAPublicKey。
图25
RSA私钥算法对象标识符
如图25所示,由前文所介绍私钥格式的ASN.1结构和算法标识的对象标识符(1.2.840.113549.1.1.1)可知,为RSA私钥且格式为PrivateKeyInfo。
图26