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

ASN.1编解码:asn1c、enber和unber本文详细介绍了 ASN 1 编解码工具 asn1c 的使用 包括编译安装 unber 的 BER 解码功能 以及 enber 逆操作 通过实例展示了如何将二进制数据转换为 XML 和回转

大家好,欢迎来到IT知识分享网。


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


荣涛


2021年8月24日

1. 编译安装

见之前的文档。

2. asn1c指令

asn1c会安装三个可执行文件asn1cunberenber

  • asn1c:the ASN.1 Compiler,用ASN.1文件生成C语言文件;
  • unber:the ASN.1 BER Decoder,将 ber 二进制文件转化为特定的XML文件;
  • enber:Convert the unber XML output back into BER,与unber呈逆操作;

在这里插入图片描述

2.1. asn1c

此处就不做过多解释了,详情请见之前的文档。

2.2. unber

解码以十六进制形式指定的给定标记/长度序列:

unber -t "bf 20" 

使用双空间解码 DER 文件(就是缩进空格数):

unber -i 2 filename.der 

解码从标准输入中取出的二进制流:

cat filename.der | unber - 

解码二进制流并将其编码回相同的流(参见 enber(1):)

cat filename.der | unber -p - | enber - > filename.ber 

2.2.1. XML 格式

一个 XML 解析出来的 例子为:

<I O="0" T="[UNIVERSAL 16]" TL="2" V="Indefinite" A="SEQUENCE"> <P O="2" T="[UNIVERSAL 19]" TL="2" V="2" A="PrintableString">US</P> <C O="6" T="[UNIVERSAL 16]" TL="2" V="6" A="SEQUENCE"> <P O="8" T="[UNIVERSAL 2]" TL="2" V="4" A="INTEGER" F></P> </C O="14" T="[UNIVERSAL 16]" A="SEQUENCE" L="8"> </I O="14" T="[UNIVERSAL 0]" TL="2" L="16"> 

XML 通用的格式如下:

<tform O="off" T="tag" TL="t_len" V="{Indefinite|v_len}" [A="type"] [F]> 

上面的格式中:

  • tform 在线面数据类型中的格式化编码
    • 原始 (“P”)
    • 结构体 (“C”)
    • 未定义长度的结构体 (“I”)
  • off 该结构在数据流中的偏移
  • tag 人类能读懂的tag class和值
  • t_len The length of the TL (BER Tag and Length) encoding.
  • v_len The length of the value (V, encoded by the L), may be “Indefinite”.
  • type Likely name of the underlying ASN.1 type (for UNIVERSAL tags).
  • [F] Indicates that the value was reformatted (pretty-printed). This will never appear in the output produced using the -p command line option.

在发布的源代码中,可以进入asn1c-0.9.28/examples/sample.source.PKIX1目录进行测试:

$ cat sample-Certificate-1.der | unber - | more <C O="0" T="[UNIVERSAL 16]" TL="4" V="1124" A="SEQUENCE"> <C O="4" T="[UNIVERSAL 16]" TL="4" V="844" A="SEQUENCE"> <C O="8" T="[0]" TL="2" V="3"> <P O="10" T="[UNIVERSAL 2]" TL="2" V="1" A="INTEGER" F>2</P> </C O="13" T="[0]" L="5"> <P O="13" T="[UNIVERSAL 2]" TL="2" V="16" A="INTEGER">&#x44;&#xbe;&#x0c;&#x8b;&#x50;&#x00;&#x24;&#xb4;&#x11 ;&#xd3;&#x36;&#x30;&#x4b;&#xc0;&#x33;&#x77;</P> <C O="31" T="[UNIVERSAL 16]" TL="2" V="13" A="SEQUENCE"> <P O="33" T="[UNIVERSAL 6]" TL="2" V="9" A="OBJECT IDENTIFIER" F>1.2.840..1.1.5</P> <P O="44" T="[UNIVERSAL 5]" TL="2" V="0" A="NULL"></P> </C O="46" T="[UNIVERSAL 16]" A="SEQUENCE" L="15"> [...此处省略一万个字] 

2.3. enber

将 XML 文件再转化为 ber格式文件。

unber -p filename.ber | enber - > reconstructed.ber 

还是用上面的里子,进入asn1c-0.9.28/examples/sample.source.PKIX1目录进行测试:

unber -p sample-Certificate-1.der | enber - > output.ber 

对上面的输出文件进行 unber 解析,可以达到与 unber 小节同样的结果:

$ cat output.ber | unber - | more <C O="0" T="[UNIVERSAL 16]" TL="4" V="1124" A="SEQUENCE"> <C O="4" T="[UNIVERSAL 16]" TL="4" V="844" A="SEQUENCE"> <C O="8" T="[0]" TL="2" V="3"> <P O="10" T="[UNIVERSAL 2]" TL="2" V="1" A="INTEGER" F>2</P> </C O="13" T="[0]" L="5"> <P O="13" T="[UNIVERSAL 2]" TL="2" V="16" A="INTEGER">&#x44;&#xbe;&#x0c;&#x8b;&#x50;&#x00;&#x24;&#xb4;&#x11 ;&#xd3;&#x36;&#x30;&#x4b;&#xc0;&#x33;&#x77;</P> <C O="31" T="[UNIVERSAL 16]" TL="2" V="13" A="SEQUENCE"> <P O="33" T="[UNIVERSAL 6]" TL="2" V="9" A="OBJECT IDENTIFIER" F>1.2.840..1.1.5</P> <P O="44" T="[UNIVERSAL 5]" TL="2" V="0" A="NULL"></P> </C O="46" T="[UNIVERSAL 16]" A="SEQUENCE" L="15"> [...此处省略一万个字] 

不能说相似吧,只能说一模一样。

4. 参考链接

  1. https://github.com/nokia/asn1c

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143527.html

(0)
上一篇 2025-05-02 20:33
下一篇 2025-05-02 20:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信