我有一个复杂的嵌套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]:
答案 0 :(得分:1)
是BER,而不是DER?加密应用程序倾向于使用DER,因为它很稳定。如果它是DER,你应该能够安全地重新编码一次解码的项目并获得相同的结果。
pyasn1中没有内置功能,可以将基板片段与解码对象进行匹配。但是您可以通过覆盖Decoder.call()方法并注意其substrate
+ length
参数来模拟它,以查看正在解码的内容以及被覆盖的__call__()
方法的返回值是您观察到的基材产生的物体。
请记住,解码过程是递归的,所以你会看到终端(标量)和包含许多其他对象的容器对象。