【问题标题】:How to recover the substrate from a pyasn1 object?如何从 pyasn1 对象中恢复基板?
【发布时间】:2018-05-11 19:27:02
【问题描述】:

我有一个复杂的嵌套 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]: 

【问题讨论】:

  • 你已经可以用 pyasn1 读取你的结构了吗?换句话说,您是否有用于特定格式的结构定义的 python-pyasn1 或 ASN1 模式,或者您是否需要读取任意格式?
  • @battlmonstr,我有一个架构。

标签: asn.1 pyasn1


【解决方案1】:

是 BER,而不是 DER?加密应用程序倾向于使用 DER,因为它很稳定。如果它是 DER,您应该能够安全地重新编码已解码的项目并获得相同的结果。

pyasn1 中没有内置功能可让您将底物片段与解码的对象进行匹配。但是您可以通过覆盖Decoder.call() 方法并记下它的substrate + length 参数来模拟它,以查看正在解码的内容以及覆盖的__call__() 方法的返回值,该方法是从您的基板生成的对象观察。

请记住,解码过程是递归的,因此您将看到终端(标量)和包含许多其他对象的容器对象。

【讨论】:

  • 谢谢,这似乎有效。请参阅我的第一篇文章(现已更新)...这是您的想法吗?
  • @PythonAteMyHamster 没错,虽然我可能会通过kwargs 传递一个可变对象以将底层传递出调用(而不是将其分配给解码器对象的属性)。或者可以将基板附加到解码的 asn.1 对象...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多