1

pyasn1を使用して RSA 署名をエンコードしようとしていますが、SEQUENCE. 2 つの AlgorithmIdentifier タイプを定義します。1 つは「アルゴリズム」コンポーネントがデフォルト設定されている場所で、もう 1 つは新しく作成されたオブジェクトに手動で設定されている場所です。各オブジェクトの 1 つをインスタンス化してから 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

私は何を間違っていますか?

4

1 に答える 1

1

あなたのコードは良いです。setDefaultComponents() 呼び出しは省略できますが。

エンコーディングにデフォルト値が表示されない理由は、送信アプリケーションがこのコンポーネントにデフォルト値と同じ値を提供したとしても、DEFAULT とマークされたコンポーネントが必ずしもエンコードされない可能性があるためです (これは X. 208)。

実際には、エンコーディングにデフォルト値を含めても省略しても、受信側に違いはありません。後者の場合、受信側はデフォルトをプラグインします。明るい面では、トラフィック量が減少します。

于 2013-08-03T18:19:55.957 に答える