ASN.1概述

ASN.1抽象语法标记(Abstract Syntax Notation One)是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。–来自百度百科 ASN.1_百度百科 (baidu.com)

ASN.1抽象语法描述信息的示例如下:

TestModule DEFINITIONS ::= BEGIN    -- Module parameters preambleCircle ::= SEQUENCE {             -- Definition of Circle typeposition-x INTEGER,             -- Integer positionposition-y INTEGER,          -- Position along Y-axisradius INTEGER (0..MAX)         -- Positive radius}                                     -- End of Circle type
END                                 -- End of TestModule

ASN.1 广泛应用于5G协议语法定义,以及部分通用协议和工控协议语法定义。

编码

除了描述数据的抽象语法,ASN.1还定义了一些方法去编码数据,各种编码方式在空间,互操作性,效率方面的能力不同,协议设计者可以选择文本字节或者的编码规则。

asn1c

asn1c是一个开源的ASN.1编译器,它能把ASN.1的描述文件转化成c++兼容的c源代码,该代码可用于将本机C语言结构序列化为紧凑且明确的基于 BER/OER/PER/XER 的数据文件,并能将这些文件反序列化回来。BER/OER/PER/XER是编码方式。这是官网地址:Lev Walkin’s home site (lionet.info)

从官网下载linux源码,编译之后能得到一个可执行程序asn1c,这就是ASN.1的编译器。编译器的输入就是使用ASN.1编写的数据文件,称为ASN.1模块,如果多个模块之间有依赖,编译时必须同时指定所有模块。编译后的输出主要分为3部分:

  1. 由ASN.1模块定义的数据类型转化的对应的.c .h文件
  2. 通用编码解码文件(BER/OER/PER/XER)和一些帮助程序
  3. 一个主程序可以负责PDU(协议数据单元)和各种编码之间的转化

举例

1、这是LDAP协议中使用ASN.1描述 LDAPMessage 消息的部分内容

LDAPMessage ::= SEQUENCE {messageID       MessageID,protocolOp      CHOICE {bindRequest           BindRequest,bindResponse          BindResponse,...,intermediateResponse  IntermediateResponse },controls       [0] Controls OPTIONAL }

2、使用编译器转化成C语言类型

/* LDAPMessage */
typedef struct LDAPMessage {MessageID_t  messageID;struct LDAPMessage__protocolOp {LDAPMessage__protocolOp_PR present;union LDAPMessage__protocolOp_u {BindRequest_t     bindRequest;BindResponse_t  bindResponse;...IntermediateResponse_t  intermediateResponse;} choice;asn_struct_ctx_t _asn_ctx;} protocolOp;struct Controls   *controls   /* OPTIONAL */;asn_struct_ctx_t _asn_ctx;
} LDAPMessage_t;

3、组装一条 LDAPMessage 消息,组装的参数如下:

messageID: 1
protocolOp: BindRequest
BindRequest中version: 3
BindRequest中name: uid=a,dc=com
BindRequest中authentication: password

然后使用BER编码得到字节序:

0000000: 3020 0201 0160 1b02 0103 040c 7569 643d  0 ...`......uid=
0000010: 612c 6463 3d63 6f6d 8008 7061 7373 776f  a,dc=com..passwo
0000020: 7264                                     rd

4、通过网络传输序列化后的内容到对端,对端采用BER解码器以及已知协议消息结构,反序列化得到xml表示的数据内容,也可以反序列化成其他格式:

<LDAPMessage><messageID>1</messageID><protocolOp><bindRequest><version>3</version><name>75 69 64 3D 61 2C 64 63 3D 63 6F 6D</name><authentication><simple>70 61 73 73 77 6F 72 64</simple></authentication></bindRequest></protocolOp>
</LDAPMessage>

总结:如何解析ASN.1相关协议

若要解析使用到ASN.1语法描述和编码的协议,首先其编解码的实现是相同的,也就是针对BER,PER等编码规则的解码逻辑应该是相同的;
另一方面常规的思路下若要解析协议,清楚其结构逆向解码即可,对ASN.1语法描述的协议而言,其ASN.1模块(也就是ASN.1描述文件)不就是现成的协议文档吗,其内容就是现成的协议结构,人可读,但是困难,费时,若用机器阅读并翻译成解码代码,就是现成的解码器。上面的工具也许可用。

纰漏之处,敬请指正,一起学习,天天向上

ASN.1 compiler asn1c相关推荐

  1. ASN.1 -- 使用asn1c完成ASN encode/decode

    asn1c官网:http://lionet.info/asn1c/blog/ asn1c源代码:https://github.com/vlm/asn1c 一. 下载asn1c并编译生成可执行文件(关掉 ...

  2. ASN.1编解码:asn1c、enber和unber

    ASN.1编解码:asn1c.enber和unber 荣涛 2021年8月24日 相关: ASN.1编解码:asn1c的版本分析-诺基亚 1. 编译安装 见之前的文档. 2. asn1c指令 asn1 ...

  3. ASN.1编解码:asn1c的版本分析-诺基亚

    ASN.1编解码:asn1c的版本分析 荣涛 2021年8月24日 前面两个文档,已经对 ASN.1 编码和 asn1c 的使用做出了详细说明,那么如何将 ASN.1编解码与编程 ASN.1编解码:a ...

  4. ASN.1编解码:asn1c的基本使用

    ASN.1编解码:asn1c的基本使用 荣涛 2021年8月23日 上篇主要讲了ASN.1编码<ASN.1编解码与编程> 本文主要介绍 ASN.1 编码的C语言实现,asn1c.ASN.1 ...

  5. Ubuntu ASN1C实例分析

    1 环境准备 实验平台:ubuntu16.04 2 ASN.1介绍 ASN.1是定义抽象数据类型规格形式的标准.是用于描述数据的表示.编码.传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则 ...

  6. Scapy3.0 Documentation ( Advanced usage )

    说明:写到这里来,只是因为原文链接打开太慢了,至于翻译什么的就不误导大家了,还是原文好看 原文链接:http://phaethon.github.io/scapy/api/advanced_usage ...

  7. [Erlang] XML处理方案

    转载自http://www.cnblogs.com/me-sa/archive/2012/07/20/erlang_xml.html XML以及相关的XSLT,XPath,XSD工具在数据层面为我们提 ...

  8. asn.1 java_【密码工程】asn1——asn1c、javaAsn1Comilper、protobuf的使用示例

    1 使用asn1c实现编码 参考网址:http://lengxuezhixuan.blog.chinaunix.net/uid-28765492-id-3765759.html PS:这个网址就是根据 ...

  9. ASN.1编解码:asn1c-ORAN-E2AP编解码示例

    ASN.1编解码:asn1c-ORAN-E2AP编解码示例 荣涛 2021年9月2日 整体代码:https://gitee.com/rtoax/test/tree/master/ASN.1/asn1c ...

最新文章

  1. oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析
  2. 全球及中国食品行业发展潜力与投资机会评估报告2022版
  3. C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。
  4. Android官方开发文档Training系列课程中文版:管理系统UI之变暗系统条
  5. 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Nginx介绍
  6. Windows创建自动化任务
  7. java异步编程的面试_去年去阿里面试,被问到java 多线程,我是这样手撕面试官的...
  8. 生成BDS卫星1和卫星2的B1C信号的数据分量主码、 导频分量主码和子码
  9. wordpress建站我们如何选择虚拟主机和VPS服务器呢?
  10. 用命令如何返回上级目录
  11. Mac软件推荐:Soulver原来这么好用
  12. 商业智能BI与业务管理决策思维之三:业务质量分析
  13. 布兰迪斯大学计算机科学专业,布兰迪斯大学计算机科学专业
  14. eslint plugins与extends的区别
  15. 浅说ksm的适用范围
  16. 【系统分析师之路】2009年上系统分析师综合知识真题
  17. eclipse中tomcat简单配置
  18. PyTorch中文文档阅读笔记-day1
  19. 【打印技术01】获取及设置系统默认打印机
  20. Android Studio启用新代号,新版本Arctic Fox(白狐)重点新特性一览!

热门文章

  1. 2007年在职攻读硕士学位全国联考答案
  2. win10锁定计算机指令,Windows10命令大全
  3. ASP.NET二手中介房源信息管理系统源码
  4. 常见的人工神经网络模型,人工智能神经网络模型
  5. 开关电源之磁隔离反馈
  6. 广东大专类计算机专业院校排名,广东省十大大专院校排名(2021年参考)-广东最好的大专学校有哪些?...
  7. 观音旦、生财会、观音开库
  8. 在互联网行业如何高效快速接单子
  9. 有的时候,我们有需要将由不同栏位获得的资料串连在一起
  10. Cesium 实战 - 获取 Cartesian3s 四至范围(extent)