ASN.1编码详解:从入门到代码实战

一、ASN.1编码简介

ASN.1,全称是Abstract Syntax Notation One,是一种在计算机网络中为传输信息而设计的,采用抽象编码规则的标记语言。ASN.1是一种ISO/ITU-T标准,最初是1984年的CCITT X.409:1984标准的一部分,由于其广泛应用,1988年ASN.1被移动到独立标准X.208,并于1995年进行全面修订后变成X.680系列标准。ASN.1标准本身只定义了表示信息的抽象语法和编码规则,但是没有限定其编码的方法,在如今的计算机编程和信息安全领域,有基于Java/Python/C++等编程语言实现的ASN.1编码方法。

ASN.1编码通过独立于硬件平台和编程语言的抽象语法来描述数据结构和数据类型,实现了平台无关的抽象设计。因此,被ASN.1编码后的数据可以很方便的实现跨设备传输。

ASN.1编码广泛用于X.509证书、HTTPS证书等信息安全标准中,SNMP协议和LDAP协议采用了BER编码来实现数据的传输,信用卡和借记卡的EMV支付标准采用了BER编码来实现卡上数据的刷写。

与ASN.1编码的用途类似的还有Protocol Buffers和Thrift,也可以用来描述数据结构,并提供一套自定义的编解码和序列化处理机制,可以实现跨设备通信。

ASN.1编码的数据样例:

Foo DEFINITIONS ::= BEGIN

Question ::= SEQUENCE {
    id INTEGER,
    question IA5String
}

Answer ::= SEQUENCE {
    id INTEGER,
    answer BOOLEAN
}

END

二、ASN.1编码分类

1.基本编码规则BER(Basic Encoding Rules)

BER是一种原始的ASN.1编码规则,灵活但编码生成的字节流十分冗长,语法基于TLV结构:

示例: INTEGER 42的BER编码

Tag(INTEGER=02) |Length(01) |Value(2A) 
02 01 2A

2.唯一编码规则DER(Distinguished Encoding Rules)

BER的子集,语法比BER更严格,对同一数据只有唯一的一种编码,要求使用定长形式的L字段,BER的L字段是不定长的。

3.规范编码规则CER(Canonical Encoding Rules)

类似于DER用于不定长数据的编码,但外界很少用。

4.压缩编码规则PER(Packed Encoding Rules)

分为Aligned PER和Unaligned PER,旨在高度优化编码长度,实现比特级打包,PER编码省略了部分TLV信息,如标签、长度,解码时需要完整的ASN.1的schema定义。

Aligned PER(APER)在适当位置填充比特至字节边界。

Unaligned PER(UPER)无比特填充,编码上更紧凑。

PER编码规则主要用于带宽敏感的协议,如3G/4G/5G通信等。

5.XML编码规则XER(XML Encoding Rules)

将ASN.1值编码为XML文档,可读性很强,数据很直观,但编码很冗长,扩展的XER,即EXER,支持XML Schema。

XER编码样例:

<FooQuestion>
    <trackingNumber>5</trackingNumber>
    <question>Anybody there?</question>
</FooQuestion>

三、ASN.1编码的核心语法

1.schema文件

通常以 ".asn"或 ".asn1"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员与背包客_CoderZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值