使用pyasn1正确实现ASN1结构

2021-01-18 22:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是ASN1新手,希望使用pyasn1实现这个结构

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

这是我使用的代码

^{pr2}$

在使用这个序列进行编码时,我得到结果like,当我希望结构像this时。我错过了什么?提前谢谢你

1条回答
网友
1楼 ·

我想在您使用的ASN.1模块中,显式标记模式是默认的。因此,在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))

相关问题