ASN.1类型和DER/BER/CER编解码器(X.208)的纯Python实现
项目描述
Python 的 ASN.1 库
这是一个免费的、开源的 ASN.1 类型和解码器实现,作为 Python 包。它最初是为了支持特定的协议(SNMP)而编写的,但后来被推广到适用于基于 ASN.1 规范 的广泛协议。
注意:该包现在由 Christian Heimes 和 Simon Pichugin 在项目 https://github.com/pyasn1/pyasn1 中维护。
特性
- ASN.1 类型(X.208)的通用实现
- 符合标准的 BER/CER/DER 编码器
- 可以操作序列化数据的流
- 从 Python 类型加载和卸载 ASN.1 结构
- 100% Python,支持 Python 3.8+
- MT 安全
- 贡献 ASN.1 编译器 Asn1ate
为什么使用 pyasn1
ASN.1 解决了数据序列化问题。这个解决方案是由古代的智者们很久以前设计的。当时,他们没有浪费位的奢侈。这就是为什么 ASN.1 被设计成将无界复杂性的数据结构序列化为紧凑且高效的形式,以便于数据处理。
这也可能解释了为什么许多网络协议和文件格式仍然依赖于30多年的老技术。包括许多知名的互联网协议和文件格式。
有很多书籍都涵盖了 ASN.1 的主题。Olivier Dubuisson 的《异构系统之间的通信》是那些可以在互联网上免费获取的高质量书籍之一。
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 dict
,SET 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 内置编码器。极其紧凑的 PER 编码预计将在即将发布的 pyasn1 版本中引入。
有关pyasn1 API的更多信息可以在文档中找到,不同协议和文件格式的编译ASN.1模块可以在pyasn1-modules 仓库中找到。
如何获取pyasn1
pyasn1软件包遵循2-clause BSD 许可协议。源代码作为GitHub 仓库免费提供。
您可以使用pip install pyasn1
安装它或从PyPI下载。
如果某些内容不符合预期,请在GitHub上提交问题或在Stack Overflow上提问,或者尝试浏览pyasn1 邮件列表存档。
版权(c)2005-2020,Ilya Etingof。保留所有权利。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装软件包的信息。
源分布
构建分布
pyasn1-0.6.1.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034 |
|
MD5 | 75cdc260597f112fdfefec85379e710d |
|
BLAKE2b-256 | bae901f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018 |