2016-09-25 201 views
0

我是新來ASN1並希望實現使用pyasn1實現正確使用pyasn1

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

這裏這種結構ASN1結構是我使用

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) 
    ))) 

一旦使用該序列我得到的編碼代碼結果like,當我想要的結構是像this。我錯過了什麼?預先感謝您

+0

你的第二個鏈接斷開所以不可能找到你想要達到什麼樣的編碼。 –

+0

@IlyaEtingof我編輯了我的問題 – abhi

回答

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)) 
相關問題