gpt4 book ai didi

python - 如何使用 pyasn1 使用默认类型对 ASN.1 对象进行编码?

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:28 25 4
gpt4 key购买 nike

我正在尝试使用pyasn1对RSA签名进行编码,但我在SEQUENCE中的默认类型上遇到问题。我定义了两种 AlgorithmIdentifier 类型,一次是默认“算法”组件,一次是在新创建的对象上手动设置它。如果我实例化每个对象之一,然后调用 PrettyPrint(),则输出看起来相同。但是,如果 I BER 编码(或 DER 编码),则具有默认类型的对象似乎缺少算法组件。

一个例子:

from pyasn1.type import univ, namedval, namedtype, tag
from pyasn1.codec.ber import encoder

pkcs1 = univ.ObjectIdentifier('1.2.840.113549.1.1')
md5WithRSAEncryption_id = pkcs1 + univ.ObjectIdentifier((4,))

class AlgorithmIdentifier(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('algorithm', univ.ObjectIdentifier()),
namedtype.OptionalNamedType('params', univ.Any()))

class AlgorithmIdentifier2(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.DefaultedNamedType('algorithm', md5WithRSAEncryption_id),
namedtype.OptionalNamedType('params', univ.Any()))

a = AlgorithmIdentifier()
a.setComponentByName('algorithm', md5WithRSAEncryption_id)
print a.prettyPrint()
print "Encoded: %s" % encoder.encode(a).encode('hex')

a2 = AlgorithmIdentifier2()
a2.setDefaultComponents()
print a2.prettyPrint()
print "Encoded: %s" % encoder.encode(a2).encode('hex')

输出:

$ ./testasn1.py
AlgorithmIdentifier:
algorithm=1.2.840.113549.1.1.4

Encoded: 300b06092a864886f70d010104

AlgorithmIdentifier2:
algorithm=1.2.840.113549.1.1.4

Encoded: 3000

我做错了什么?

最佳答案

你的代码很好。尽管可以省略 setDefaultComponents() 调用。

您在编码中看不到默认值的原因是,标记为 DEFAULT 的组件可能不一定经过编码,即使发送应用程序为此组件提供了与默认值相同的值: (根据 X.208,这是发送者的选项)。

实际上,无论您在编码中包含默认值还是省略默认值,在接收端都没有区别。在后一种情况下,接收端将插入其默认值。好的一面是,流量减少了。

关于python - 如何使用 pyasn1 使用默认类型对 ASN.1 对象进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18025512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com