Asn.1 如何从pyasn1对象中恢复基板?

Asn.1 如何从pyasn1对象中恢复基板?,asn.1,pyasn1,Asn.1,Pyasn1,我有一个复杂的嵌套ASN.1结构作为字节。我想找到该结构中的所有T61字符串,即原始字节编码中的。这在pyasn1中可能吗 到目前为止,我只知道如何在BER解码的Python对象中定位T61字符串(或任何东西)。我可以对每一个进行重新编码,但不能保证重新编码的值与原始值匹配。这里有一些加密操作,因此对这些字节值很挑剔 如果我能做解码对象。获取底层(),或者类似的事情,我会被排序 想法?谢谢 更新:Ilya Etingof的答案似乎很有效 In [61]: class X(pyasn1.code

我有一个复杂的嵌套ASN.1结构作为字节。我想找到该结构中的所有T61字符串,即原始字节编码中的。这在pyasn1中可能吗

到目前为止,我只知道如何在BER解码的Python对象中定位T61字符串(或任何东西)。我可以对每一个进行重新编码,但不能保证重新编码的值与原始值匹配。这里有一些加密操作,因此对这些字节值很挑剔

如果我能做
解码对象。获取底层()
,或者类似的事情,我会被排序

想法?谢谢


更新: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]: 

是伯尔,不是德?加密应用程序倾向于使用DER,因为它是稳定的。如果它是一个命令,你应该能够安全地重新编码一次解码的项目,并得到相同的结果

pyasn1中没有内置功能,允许您将基板碎片与解码对象进行匹配。但您可能可以通过重写方法并注意其
基板
+
长度
参数来模拟这一点,以查看正在解码的内容以及重写的
\uuu调用
方法的返回值,该方法是从您观察的基板生成的对象


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

您已经能够用pyasn1读取您的结构了吗?换句话说,对于特定格式的结构定义,您是否有python-pyasn1或ASN1模式,或者您是否需要读取任意格式?@battlmonstr,我有一个模式。谢谢,这似乎很有效。请参阅我的第一篇帖子(现已更新)。。。这就是你的想法吗?@PythonAteMyHamster确实如此,不过我可能会通过
kwargs
传递一个可变对象,以将底层从调用中传递出去(而不是将其分配给解码器对象的属性)。或者可以将基板连接到解码的asn.1对象。。。?