asn.1 - 如何从 pyasn1 对象中恢复基板?
问题描述
我有一个复杂的嵌套 ASN.1 结构作为字节。我想在原始字节编码中找到该结构中的所有 T61Strings (比如说) 。这在pyasn1中可能吗?
到目前为止,我只知道如何在 BER 解码的 Python 对象中定位 T61Strings(或其他)。我可以重新编码每一个,但不能保证重新编码的值与原始值匹配。这里有一些加密货币在起作用,因此对这些字节值很挑剔。
如果我能做到decoded_object.get_substrate()
,或类似的,我会被分类。
想法?谢谢。
更新:Ilya Etingof 的回答似乎效果很好。
In [61]: class X(pyasn1.codec.ber.decoder.Decoder):
...: def __call__(self,*v,**kw):
...: parsed,remainder = pyasn1.codec.ber.decoder.Decoder.__call__(self,*v,**kw)
...: parsed._substrate = v[0][:len(v[0])-len(remainder)]
...: return parsed,remainder
...:
In [62]: decode = X(pyasn1.codec.ber.decoder.tagMap,pyasn1.codec.ber.decoder.typeMap)
In [63]: tmp = decode(b'\x30\x05\x02\x01\x7f\x05\x00')[0]
In [64]: tmp._substrate.encode('hex')
Out[64]: '300502017f0500'
In [65]: tmp[0]._substrate.encode('hex')
Out[65]: '02017f'
In [66]: tmp[1]._substrate.encode('hex')
Out[66]: '0500'
In [67]:
解决方案
是 BER,不是 DER?加密应用程序倾向于使用 DER,因为它很稳定。如果它是 DER,您应该能够安全地重新编码已解码的项目并获得相同的结果。
pyasn1 中没有内置功能可让您将基板片段与解码对象匹配。但是您可能可以通过覆盖解码器来模拟它。call ()方法并记下它的substrate
+length
参数以查看正在解码的内容以及覆盖__call__()
方法的返回值,该方法是您观察到的基板产生的对象。
请记住,解码过程是递归的,因此您将看到终端(标量)和包含许多其他对象的容器对象。
推荐阅读
- javascript - 悬停时动画进度条和退出时反向动画?
- bokeh - 散景不显示 x 轴上日期时间的小时数
- numpy - 将 3D numpy 数组合并为 2D 数组
- sonarqube - 我可以在模型类上添加 @SuppressWarnings("*") 吗?
- typescript - 扔进摩卡测试没有被捡起
- reactjs - Create-react-app 是否安装了内部损坏的依赖项?
- ruby-on-rails - 带有 RQRCode-Gem 的 Ruby on Rails QR-Code 不起作用
- regex - sed 替换删除文本块
- tensorflow - 使用 Keras 计算损失函数中的非均匀惩罚
- scala - 为什么在 Linux 上使用 SparkML 的 XGBoost 比在 Windows 上慢得多