跳转到主要内容

ASN.1类型和编解码器

撤销此版本的原因

用户应仅使用pyasn1

项目描述

Python的ASN.1库

PyPI Python Versions GitHub license

这是一个免费的、开源的ASN.1类型和编解码器的Python包实现。最初是为了支持特定的协议(SNMP)而编写的,但后来被推广到适用于基于ASN.1规范的广泛协议。

该项目已分叉以进行持续维护和现代化。

功能

  • ASN.1类型的通用实现(X.208)
  • 符合标准的BER/CER/DER编解码器
  • 可以操作序列化数据流
  • 从Python类型导出/加载ASN.1结构
  • 100% Python,与Python 2.7和3.5+兼容
  • MT安全
  • 贡献ASN.1编译器Asn1ate

为什么使用pyasn1

ASN.1解决了数据序列化问题。这个解决方案是由智慧的古人很久以前设计的。当时,他们没有浪费位的奢侈。这就是为什么ASN.1被设计为将无界复杂性的数据结构序列化为紧凑且在处理数据时高效的东西。

这也许可以解释为什么许多网络协议和文件格式仍然依赖于30多年前的技术。包括一些高调的互联网协议和文件格式。

许多书籍都涉及ASN.1这个主题。《Olivier Dubuisson的《异构系统间的通信》(无follow链接)》是其中一本在互联网上免费提供的高质量书籍。

pyasn1包旨在帮助Python程序员在网络协议和文件格式方面进行编程,而无需离开他们的Python提示符。该工具努力捕捉ASN.1系统的所有方面,并在Python术语下表示它。

如何使用pyasn1

使用pyasn1,您可以从ASN.1数据结构构建Python对象。例如,以下ASN.1数据结构

Record ::= SEQUENCE {
  id        INTEGER,
  room  [0] INTEGER OPTIONAL,
  house [1] INTEGER DEFAULT 0
}

可以用pyasn1这样表示

class Record(Sequence):
    componentType = NamedTypes(
        NamedType('id', Integer()),
        OptionalNamedType(
            'room', Integer().subtype(
                implicitTag=Tag(tagClassContext, tagFormatSimple, 0)
            )
        ),
        DefaultedNamedType(
            'house', Integer(0).subtype(
                implicitTag=Tag(tagClassContext, tagFormatSimple, 1)
            )
        )
    )

ASN.1的精神是将抽象数据描述转换为特定编程语言的特定形式。一旦您的ASN.1数据结构以Python的形式表示,您就可以像处理类似的Python类型(例如,ASN.1 SET类似于Python dictSET OF类似于list)一样使用它。

>>> record = Record()
>>> record['id'] = 123
>>> record['room'] = 321
>>> str(record)
Record:
 id=123
 room=321
>>>

ASN.1的力量部分来自于其序列化功能。您可以将数据结构序列化并通过网络发送。

>>> from pyasn1.codec.der.encoder import encode
>>> substrate = encode(record)
>>> hexdump(substrate)
00000: 30 07 02 01 7B 80 02 01 41

相反,您可以将从网络接收或从文件中读取的序列化ASN.1内容转换为Python对象,您可以使用它进行内省、修改、编码并发送回。

>>> from pyasn1.codec.der.decoder import decode
>>> received_record, rest_of_substrate = decode(substrate, asn1Spec=Record())
>>>
>>> for field in received_record:
>>>    print('{} is {}'.format(field, received_record[field]))
id is 123
room is 321
house is 0
>>>
>>> record == received_record
True
>>> received_record.update(room=123)
>>> substrate = encode(received_record)
>>> hexdump(substrate)
00000: 30 06 02 01 7B 80 01 7B

pyasn1类努力模拟它们的Python原型(例如int、list、dict等)。但ASN.1类型表现出更复杂的行为。为了使Pythonista的生活更轻松,他们可以将他们的pyasn1类转换为Python内置类

>>> from pyasn1.codec.native.encoder import encode
>>> encode(record)
{'id': 123, 'room': 321, 'house': 0}

或反之亦然——您可以从Python对象的树形结构初始化ASN.1结构

>>> from pyasn1.codec.native.decoder import decode
>>> record = decode({'id': 123, 'room': 321, 'house': 0}, asn1Spec=Record())
>>> str(record)
Record:
 id=123
 room=321
>>>

在ASN.1设计中,序列化编解码器与数据对象解耦,因此您可以将每个ASN.1对象转换为多种不同的序列化形式。到目前为止,pyasn1支持BER、DER、CER和Python内置编解码器。预计在即将发布的pyasn1版本中引入极紧凑的PER编码。

有关pyasn1 API的更多信息,请参阅文档,不同协议和文件格式的编译ASN.1模块可以在pyasn1-modules 仓库中找到。

如何获取pyasn1

此项目是从pyasn1分叉的。pyasn1包根据2-clause BSD 许可协议进行分发。源代码以GitHub 仓库的形式免费提供。

您可以使用pip install pyasn1-lextudio或从PyPI下载它。

如果某些内容没有按预期工作,请在GitHub上打开一个问题在Stack Overflow上发帖,或者尝试浏览pyasn1。

版权(c)2005-2020,Ilya Etingof。版权(c)2022,LeXtudio Inc.。保留所有权利。版权(c)2021- [Splunk Inc.]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pyasn1_lextudio-1.1.2.tar.gz (128.3 kB 查看散列值)

上传时间 源代码

构建版本

pyasn1_lextudio-1.1.2-py3-none-any.whl (77.6 kB 查看散列值)

上传时间 Python 3

支持