asn.1学习笔记
- 格式:pdf
- 大小:65.50 KB
- 文档页数:10
ASN.1笔记——语法规则与类型概述⼀.简介ASN.1(Abstract Syntax Notation dotone),抽象语法标记1。
是定义抽象数据类型形式的标准,是⽤于描述数据表⽰、表⽰、传输、编码的记法。
ASN.1只包含信息结构,不处理具体业务数据,它不是⼀个编程语⾔。
ASN.1没有限定编码⽅法,各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达),常见的编码规则有:基本编码规则(BER),规范编码规则(CER,CanonicalEncoding Rules)、唯⼀编码规则(DER,DistinguishedEncoding Rules)、压缩编码规则(PER,PackedEncoding Rules)和XML编码规则(XER,XMLEncoding Rules)。
这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码。
ASN.1在OSI的ISO8824/ITU X.208(说明语法)和ISO8825/ITU X.209(说明基本编码规则)规范。
⼏个概念:(1)实际语法指诸如C、ObjectiveCaml等这样实际编程语⾔;(2)抽象语法(AbstractSyntax)指ASN.1,是协议采⽤ASN.1规范描述的描述⽂本。
描绘了与任何表⽰数据的编码技术⽆关的通⽤数据结构。
抽象语法使得⼈们能够定义数据类型,并指明这些类型的值。
抽象语法只描述数据的结构形式,与具体的编码格式⽆关,同时也不涉及这些数据结构在计算机内如何存放。
(3)传输语法(TransferSyntax)指表⽰层交换数据的表⽰⽅法,是实际通讯系统间的码流。
当数据在两个表⽰层实体之间传输时,这些数据的实际⽐特模式表⽰⽅法就是传送语法。
(4)编码指将抽象语⾔法转换成实际通讯系统间⽐特流;(5)编码规则将抽象语⾔法转换成实际通讯系统间⽐特流所遵循的语法规则;⼆.相关背景知识1.为了顺利完成应⽤⾳的通讯,需使⽤以下概念:(1)抽象语法:定义了数据的常⽤结构(包括不同的数据类型),并且建⽴了和应⽤层对话所⽤的构架。
ASN.1简介及OpenSSL中ASN.1接⼝使⽤举例ASN.1(Abstract Syntax Notation One)是⼀套标准,是描述数据的表⽰、编码传输、解码的灵活的记法。
它提供了⼀套正式、⽆歧义和精确的规则以描述独⽴于特定计算机硬件的对象结构。
OpenSSL的编码⽅法就是基于该标准。
ASN.1是⼀种结构化的数字对象描述语⾔,它包括两部分:数据描述语⾔和数据编码规则。
ASN.1的数据描述语⾔允许⽤户⾃定义基本的数据类型,并可以通过简单的数据类型组成更复杂的数据类型。
ASN.1是ISO和ITU-T的联合标准,它本⾝只定义了表⽰信息的抽象句法,但是没有限定其编码的⽅法。
各种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)。
这些编码⽅法规定了将数字对象转换成应⽤程序能够处理、保存和⽹络传输的⼆进制编码形式的⼀组规则。
PEM编码全称是Privacy Enhanced Mail,是⼀种保密邮件的编码标准。
ASN.1与特定的ASN.1编码规则⼀起通过使⽤独⽴于计算机架构和编程语⾔的⽅法来描述数据结构,为结构化数据的交互提供了⼿段,特别是在⽹络环境的应⽤程序。
OpenSSL的PEM编码就是在DER编码基础上进⾏BASE64编码,然后添加⼀些头尾信息组成的,如在⽣成的rsa private.pem中头信息为-----BEGIN RSA PRIVATE KEY-----,尾信息为-----END RSA PRIVATE KEY-----,中间的数据部分即是对DER进⾏base64编码后的结果。
asn1语法
ASN.1(Abstract Syntax Notation One)是一种规范语法,用
于描述和表示结构化数据。
它被广泛用于网络通信、存储以及安全领
域中的各种协议。
ASN.1定义了数据类型、数据结构、数据表示和编解码规则。
ASN.1语法中包含以下主要元素:
1. 标识符:每个定义都有一个唯一的标识符。
2. 类型:ASN.1定义了许多数据类型,包括基本类型(例如INTEGER和BOOLEAN)和结构类型(例如SEQUENCE和CHOICE)。
3. 值:ASN.1数据对象具有一个明确的类型和一个对应的值。
值可以是一个标量(例如整数或真/假值),也可以是一个结构化的对象,包含其他ASN.1类型和值。
4. 编码规则:ASN.1定义了一组可移植的规则,以将ASN.1值编码为二进制格式,并将其解码回原始ASN.1表示形式。
ASN.1编码通常用于在网络中传输数据。
ASN.1还包含一些其他元素,例如注释、导入和导出声明。
ASN.1编译器可以使用这些元素来生成代码来处理ASN.1数据对象。
asn1c用法-回复asn1c是一个用于编译ASN.1(Abstract Syntax Notation One)规范的C语言编码器和解码器。
ASN.1是一种用于定义数据结构和传输数据的描述语言,广泛应用于通信和网络领域。
asn1c的使用可以帮助开发人员更方便地处理ASN.1规范的数据,并快速开发高效的通信协议。
首先,我们需要了解ASN.1规范的基本知识。
ASN.1是一种独立于语言的描述数据结构和数据传输的语言。
它可以定义复杂的数据结构,并定义数据编码和解码的规则。
ASN.1规范使用模块化的方式组织,每个模块可以包含类型定义、值定义和约束定义等。
在ASN.1规范中,数据类型被定义为抽象的,而编码和解码规则则使用ASN.1 BER(Basic Encoding Rules)或DER(Distinguished Encoding Rules)进行描述。
接下来,我们可以开始使用asn1c进行编码和解码的工作了。
首先,我们需要安装asn1c工具。
asn1c是一个开源软件,可以从其官方网站下载并安装。
安装完成后,我们可以在终端窗口中输入asn1c命令来检查是否安装成功。
如果成功安装,终端会显示出asn1c的版本信息。
在开始使用asn1c之前,我们需要先创建一个ASN.1规范文件。
ASN.1规范文件以“*.asn”为后缀名,可以用文本编辑器打开进行编辑。
在ASN.1规范文件中,我们可以定义数据类型、值以及编码和解码规则等。
在定义数据类型时,我们可以使用ASN.1提供的基本数据类型,也可以使用已定义的其他数据类型。
在完成ASN.1规范文件的编辑后,我们可以使用asn1c命令来生成编码器和解码器的源代码。
在终端中导航到ASN.1规范文件所在的目录,然后执行以下命令:shellasn1c <ASN.1规范文件名>asn1c会根据ASN.1规范文件的内容生成相应的C语言源代码文件。
生成的源代码文件包括编码器和解码器的函数,以及用于表示ASN.1数据结构的结构体和相关的辅助函数。
ASN.1笔记——基本类型详述一.ASN.1基本类型基本类型汇总表1.BOLLEAN类型BOLLEAN类型只有两个值:TRUE和FALSE2.NULL类型空类型,只有一个值NULL。
作为一种结果,空类型是传输报告和响应的典型情况。
Ack ::= NULL它经常在时间信息中使用,表示传送时间没有赋值,如:Clock ::= CHOICE{time UTCTime,out-of-order NULL}当时钟电池没有电时,值为:battery-down Clock ::= out-of-order:NULLNULL也可以用在表示链表结束的空接点,如:LinkedList::= SEQUENCE{data Data,next CHOICE{linked-list LinkedList,endNULL}}3.INTEGER类型(1).ASN.1没有定义整数的范围,因此必要时需要工确定:Interval::= INTEGER(0..32767)(2).ASN.1描述中不能出现“-0”(3).一些情况下,比如为了定义错误码,需要给一些数值特定的名字,可以使协议更易于理解,也改善了应用层和编解码器之间的接口。
ASN.1为INTEGER类型提供了一种特殊语法来解决这个问题。
以软盘驱动器的错误码为例:ErrorCode::= INTEGER{disk-full(1),no-disk(-1),disk-not-formatted(2)}stupid-error ErrorCode ::= disk-full这些名字只能被用于定义ErrorCode类型的值,不能用于其它类型值的定义。
命名的整数不需要排序。
对于没有命名的整数,还是可以使用的;已经命名的整数,也可以直接使用数字。
4.ENUMERATED类型即枚举类型例:ABRT-diagnostic ::=ENUMERATED{no-reason-given(1),protocol-error(2),authentication-mechanism-name-not-recognized(3),authentication-mechanism-name-required(4),authentication-failure(5),authentication-required(6),...}(1).不能直接使用()中的数字(2).注意事项:<1>按照ASN.1的语义模型,任意两个ENUMERATED类型都是不兼容的。
ASNPER编译码规则技术总结ASN.1 PER编译码规则技术总结1. ASN.1语言简介ASN.1(Abstract Syntax Notation One)是一种类型描述语言具有类似于面向对象程序设计语言中所提供的类型机制,它可定义任意复杂结构的数据类型,而不同的数据类型之间还可以有继承的关系。
标准包括:ISO 8824-1| ITU-T X.680: Specification of basic notationISO 8824-2| ITU-T X.681: Information object specificationISO 8824-3| ITU-T X.682: Constraint specificationISO 8824-4| ITU-T X.683: Parameterization of ASN.1ASN.1 特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构。
ASN.1 可分为两个部分:语法规则:从数据类型、内容顺序或结构方面来描述消息的内容。
编译码规则:如何编译码实际消息的数据。
特点:表达简单和复杂类型的能力;类型根据大小或数值进行约束;大写开头表示类型名,小写开头的表示变量名/字段名;字段可以标记为OPTIONAL,便于扩展。
2.PER 编码简介3GPP的规范中,由ASN.1到传输码的转换统一使用定义在ITU-T X.691中的PER (Packed Encoding Rules)规则,因此这里讲的ASN编译码规则也就是ASN编码中的PER编译码规则。
PER 有两个变体:对齐方式和非对齐方。
对齐方式用于:Iub、Iur、Iu 接口的ASN.1的传输编码。
非对齐方式:仅用于空中(UU)接口的ASN.1转换,两者的编码过程基本相同。
在对齐的方式下,若前面所有单元的信息经编码后得到的比特流长度不是一个八位组的倍数,而后一个信息又是以八位组为单位的(字符串),那么就需要在前面生成的比特流后面补“0”,使其长度为8的倍数。
python asn1tool库原理
asn1tool库是一个用于生成、解析和操作ASN.1格式数据的Python库。
ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构、编码格式和数据传输协议的标准。
asn1tool库通过读取ASN.1定义文件(通常是以`.asn`或`.asn1`为后缀的文件)来解析ASN.1格式数据。
asn1tool库的原理可以分为以下几个步骤:
1. 读取ASN.1定义文件:asn1tool库通过解析ASN.1定义文件来了解数据结构和编码规则。
该定义文件描述了结构化的数据类型和其对应的标记。
2. 生成编码解码器:根据ASN.1定义文件,asn1tool库会生成相应的编码解码器。
编码器用于将数据序列化为ASN.1格式,而解码器用于将ASN.1格式数据解码为可操作的数据结构。
3. 编码数据:要使用asn1tool库编码数据,首先需要将待编码的数据转换为asn1tool库支持的数据类型。
然后,使用编码器对数据进行编码,生成ASN.1格式数据。
4. 解码数据:要使用asn1tool库解码数据,首先需要将ASN.1格式数据作为输入,使用解码器进行解码。
解码器会将ASN.1格式数据解析为一个相应的数据结构,可以通过访问数据结构的字段来获取数据。
asn1tool库的优点是它简化了与ASN.1格式数据的交互。
通过使用asn1tool 库,开发者可以轻松地生成、解析和操作ASN.1格式数据,而不需要手动处理ASN.1编码和解码过程。
这对于涉及到与ASN.1格式数据交互的应用程序特别有用。
ASN.1笔记——Tag与结构类型一.Tag1.Tag传输数据时,接收方要明确知道每个收到的数据的类型,我们就要对各类型进行系统性的编号。
在ASN.1中使用Tag来唯一标识数据的类型。
(1).分配给每个类型的tag实际上是一个值对:<taggingclass, number>。
有四种taggingclass:UNIVERSAL,APPLICATION,context-specific和PRIVATE,分别用00、01、10、11表示。
在一个上下文中,如果TaggingClass不同,则相同number的两个Tag也是不同的。
<1>.UNIVERSAL的Tag是ASN.1标准定义的,在描述中不能修改。
<2>.context-specificTag是对SEQUENCE、SET和CHOICE及其成员使用的,可以在描述中自己定义,只要不产生歧义,相同数值可以在不同结构中反复使用。
如:A-possible-type::= SET{integer[0] CHOICE{a[0] INTEGER,b[1] INTEGER},boolean[1] CHOICE{a[0] BOOLEAN,b[1] BOOLEAN}}SET在ASN.1中定义的Tag值是17,上例的用户定义的类型A-possible-type有两个成员,分别用[0],[1]标识。
这两个成员又各自包含两个成员,同样在自已的范围内用[0],[1]。
<3>.APPLICATION和PRIVATE已经不推荐使用。
2.IMPLICIT tagging和EXPLICITtagging<1>. IMPLICIT看一个例子:overseas [1]IMPLICIT SEQUENCE{nameUTF8String,typeOutletType,locationAddress},该类型编码后,Tag[1]会覆盖掉SEQUENCE的默认类Tag[16],具体格式:oversears是SEQUENCE类型,默认Tag应该是16,这里使用了关键字'IMPLICIT',将其覆盖为1,CHIOCE类型不能用IMPLICIT模式,例:warehouse[2] IMPLICIT CHOICE{northern[0] NULL,southern[1] NULL}CHIOCE类型在编码时只有一个TLV,即northern或southern中的一个,使用IMPLICIT,[0]或[1]会覆盖掉[2]在下面的情况中,warehouse取southern时,就会导致details两个成员的Tag都是[1]:detailsSET{overseas[1] SEQUENCE{nameUTF8String,typeOutletType,locationAddress},warehouse[2] IMPLICIT CHOICE{northern[0] NULL,southern[1] NULL}}因此,CHOICE类型只能用显式Tag<2>. EXPLICIT如果一个类型的Tag是显式(EXPLICIT)的(或者在模块定义中声明了EXPLICITTAGS),则要以constructed方式编码三元组系列。
ans1语法
ASN.1(Abstract Syntax Notation One)是一种接口定义语言,用于描述数据结构的语法。
它是一种标准化的语法,用于描述数据交换的格式和结构。
ASN.1定义了数据类型、数据结构、数据元素的规则和符号,使得不同系统和应用程序之间能够进行互操作。
ASN.1的基本语法规则包括以下几点:
1.数据类型:ASN.1定义了基本的数据类型,如 INTEGER、BOOLEAN、BIT
STRING、OCTET STRING、NULL、REAL等。
2.数据结构:ASN.1使用记录(RECORD)、序列(SEQUENCE)、集合
(SET)等数据结构来描述复杂的数据类型。
3.标签和长度:在ASN.1中,每个数据元素都有一个标签和一个长度。
标签
用于标识数据元素,长度用于表示数据的长度。
4.约束:ASN.1定义了各种约束,如值约束、大小约束、存在约束等,用于限
制数据元素的取值范围和表现形式。
5.模块化:ASN.1支持模块化定义,可以将一组相关的数据类型和数据结构定
义在一个模块中,以便重用和共享。
在实际应用中,可以使用各种工具和软件来生成代码、检查语法和生成文档等。
这些工具可以帮助开发人员更轻松地使用和管理ASN.1定义的数据结构和数据类型。
ASN.1基本语法和编码规则1 ASN.1 简介ASN.1 (Abstract Syntax Notation One),抽象语法标记,是描述抽象类型和值的标记,缩写为ASN.1。
它用于对通过接口和通信媒体进行传输的信息的抽象描述,广泛应用于各种通信协议的说明中。
ASN.1是一个很灵活的标记法,它允许定义众多的数据类型——从整数和位串等简单类型到如集合、序列等的组合结构,还可以是其它复杂定义的类型。
一个ASN.1定义可以选用不同的编码规则,但解码器必须采用和编码器相同的编码规则。
目前标准化的编码规则有4个:BER、DER、CER、PER。
BER在19世纪80年代初形成,广泛应用于各种通信协议中,比如SNMP、MHS、TSAPI 等;DER是BER的一种特殊形式,用于对安全性敏感的应用,比如电子商务,要求对一条消息的编码和解码有且只有一条途径;CER是BER 的另一种特殊形式,类似于DER,但它适用于长消息,可以在知道整条消息之前就开始编码,实际中CER很少应用,这是因为工业界把DER作为安全编码的优先方法;PER在上述编码规则之后出现,因它的高效算法而闻名,它的编码速度和压缩程度比BER高,PER适用于带宽资源缺乏的应用,比如空中交通控制和音频—视频通信等。
2 BER的编码规则和传输语法2.1基本规则BER(Basic Encoding Rules)是ASN.1中最早定义的编码规则。
每种BER 编码方法都由三或四部分组成:(1)Tag octets:定义了ASN.1值的类和标签值,并指明编码方法是简单化的还是结构化的。
(2)Length octets:对于定长编码方法,它指出了内容octet的个数;对于结构化、非定长编码方法,它指明了长度是不确定的。
(3)V alue octets:对于简单的、定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值的内容的BER编码的串联。
(4)End-of-values octets:对于结构化、非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。
“扩展性”也成为了计算机技术领域的一大特色。
通信协议与管理信息库相互独立。
运行代理的网络设备可以是路由器,交换机,代理集线器,主机,网络打印机。
委托代理运行在其他的平台上。
如何标识,表示某一特定管理信息,必须遵守严格的标准,这个标准称为管理信息结构(SMI)抽象语法标记(ASN.1)是一种功能强大的数据定义语言,它通常被用来定义异种系统之间通信使用的数据类型,或者定义协议数据单元SNMP应用程序实体,SNMP的协议实体一个SNMP代理和任意的SNMP应用程序实体一起,组成一个SNMP共同体,每个共同体都有一个以字符串形式表示的名字SNMP程序实体发送或接收的SNMP消息中,必须附有共同体名字。
只有消息中的共同体名和发送该消息的程序实体所处的共同体名相同时,这个消息才是有效的SNMP MIB 视图和SNMP访问模式组成SNMP共同体访问环境SNMP共同体和其对应的SNMP共同体访问环境一起,组成一个访问策略RFC1157中,定义了代理向管理工作站传递Trap的PDU格式,并定义了6种不同类型的标准Trap,这6种Trap包括了最常见的网络事件,同时,还提供了定义其他的扩展机制MIB是标准,设备代理必须根据MIB中的定义,逐一实现其中描述的被管对象。
MIB使用ASN。
1语言来定义被管理对象,其实质是一个赋值语句SMI提供了一种统一的格式,用来定义被管对象,并规定了MIB中被管对象如何标示网络管理程序运行在管理工作站上,而代理运行在被管理设备上ASN。
1是一种数据定义语言,主要用来定义通信协议单元和一种称为“抽象语法”的数据类型,“抽象语法”指与具体的机器平台无关的数据类型ASN。
1定义的数据类型在系统中物理上是不存在的,也就是说虽然使用了他但是系统不会也不需要为ASN。
1语言定义是数据结构分配一块内存所以被称为抽象语法,抽象语法在传输时的编码规则,称为传输语法。
巴柯斯范式被用来定义一种计算机语言,它由一系列的生成式组成:Symbol::=alternativel | alternative2.。
信息技术 asn.1 编码规则第2部分《深入理解信息技术中的ASN.1编码规则》一、引言信息技术中的编码规则是保证数据在传输和存储过程中能够被准确解释和处理的重要环节。
其中,ASN.1编码规则作为一种通用的数据表示和交换标准,在各种领域都有着广泛的应用。
在上一篇文章中,我们已经对ASN.1编码规则的基本概念进行了介绍,本篇文章将继续深入探讨ASN.1编码规则的具体实现和应用。
二、ASN.1编码规则的基本原理在讨论ASN.1编码规则的具体实现之前,我们需要先了解ASN.1编码规则的基本原理。
ASN.1编码规则是一种将数据进行结构化表示和压缩传输的方法,它通过定义数据的类型、值域和编码规则,使得数据既能够被高效地传输和存储,又能够被准确解释和处理。
在ASN.1编码规则中,数据被表示为一系列的标签-长度-值(TLV)组成的结构,其中标签用于唯一标识数据的类型,长度用于表示数据的长度,值用于存储数据的实际数值。
三、ASN.1编码规则的具体实现1. BER编码规则在ASN.1编码规则中,最常用的编码规则之一就是基本编码规则(BER)。
BER编码规则是ASN.1编码规则的最基本形式,它通过将数据按照TLV结构进行编码,并使用可变长度的方式表示数据的标签和长度,从而实现了对各种数据类型的灵活处理。
在实际应用中,BER 编码规则通常被用于对数据进行压缩传输和网络通信,它具有较高的效率和灵活性,能够满足各种复杂数据结构的编码和解码需求。
2. DER编码规则除了基本编码规则(BER)之外,另一个常用的ASN.1编码规则是分布式编码规则(DER)。
与BER相比,DER编码规则在对数据进行编码时进行了严格的限制,包括禁止使用可变长度表示标签和长度、对数据进行唯一标识和排序等。
这些限制使得DER编码规则在对数据进行数字签名和加密等安全操作时具有更高的安全性和可靠性,因此在安全领域得到了广泛的应用。
3. CER编码规则还有一种基本编码规则(CER)也在一些特定领域得到了广泛的应用。