0

我是 ASN1 的新手,想使用 pyasn1 实现这个结构

   ECPrivateKey ::= SEQUENCE {
   version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
   privateKey     OCTET STRING,
   parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
   publicKey  [1] BIT STRING OPTIONAL
   }

这是我正在使用的代码

from pyasn1.type import univ, namedtype, tag
class ZKey(univ.Sequence):
   componentType = namedtype.NamedTypes(
   namedtype.NamedType('id', univ.Integer()),
   namedtype.NamedType('priv', univ.OctetString()),
   namedtype.OptionalNamedType(
   'ECParam',
   univ.ObjectIdentifier().subtype(
     implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
      )
    ),
    namedtype.OptionalNamedType(
   'pub', 
   univ.BitString().subtype(
     implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
   )))

在使用此序列进行编码时,我得到的结果类似于,当我希望结构是这样的时候。我错过了什么?先感谢您

4

1 回答 1

0

我猜在您正在使用的 ASN.1 模块中,默认标记模式是 EXPLICIT 标记模式。因此,在您的 pyasn1 代码中,您也应该使用显式标记。

这是稍微固定的代码,应该可以按您的意愿工作:

from pyasn1.type import univ, namedtype, tag
from pyasn1.codec.der.encoder import encode
import base64

class ZKey(univ.Sequence):
   componentType = namedtype.NamedTypes(
       namedtype.NamedType('id', univ.Integer()),
       namedtype.NamedType('priv', univ.OctetString()),
       namedtype.OptionalNamedType(
           'ECParam',
           univ.ObjectIdentifier().subtype(
               explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
           )
       ),
       namedtype.OptionalNamedType(
           'pub', 
           univ.BitString().subtype(
               explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
           )
       )
   )

zKey = ZKey()
zKey['id'] = 123
zKey['priv'] = 'foo bar'
zKey['ECParam'] = '1.3.6.1'
zKey['pub'] = [1,0,1,1]

substrate = encode(zKey)

print(base64.encodebytes(substrate))
于 2016-10-09T15:22:06.693 回答