1

如何使用 pyasn1 解析 ec public?

    from pyasn1.codec.der import decoder
    import base64
    raw2='''
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/FU6/Om2m5EnxDwGSVO+YNXorpDtzutLtCAMTZR5
    NIs6pfKx9oyjpS5aURx4BinuW8dr8K7N2oafY1TNvc41oQ==
    '''
    der = decoder.decode(base64.b64decode(raw2))
    print der
    '''
     der:
    (Sequence().setComponentByPosition(0, Sequence().setComponentByPosition(0, ObjectIdentifier(1.2.840.10045.2.1)).setComponentByPosition(1, ObjectIdentifier(1.2.840.10045.3.1.7))).setComponentByPosition(1, BitString("'0000010011111100010101010011101011111100111010011011011010011011100100010010011111000100001111000000011001001001010100111011111001100000110101011110100010101110100100001110110111001110111010110100101110110100001000000000110001001101100101000111100100110100100010110011101010100101111100101011000111110110100011001010001110100101001011100101101001010001000111000111100000000110001010011110111001011011110001110110101111110000101011101100110111011010100001101001111101100011010101001100110110111101110011100011010110100001'B")), '')
'''

有没有可能,用 pyasn1得到这样的东西。

编辑:以此为基础获得以下内容:

class curve(univ.Sequence):

    componentType = namedtype.NamedTypes(
     namedtype.NamedType('public KeyType',univ.ObjectIdentifier()),
     namedtype.NamedType('curveName',univ.ObjectIdentifier())
    )

class EcPublicKey(univ.Sequence):
  componentType = namedtype.NamedTypes(
    namedtype.NamedType('curve', curve()),
    namedtype.NamedType('publicKeyValue', univ.BitString())
    )

pubKey,rest = decoder.decode(base64.b64decode(raw2), asn1Spec = EcPublicKey())

print(pubKey.prettyPrint())
'''
EcPublicKey:
 curve=curve:
  public KeyType=1.2.840.10045.2.1
  curveName=1.2.840.10045.3.1.7

 publicKeyValue="'0000010011111100010101010011101011111100111010011011011010011011100100010010011111000100001111000000011001001001010100111011111001100000110101011110100010101110100100001110110111001110111010110100101110110100001000000000110001001101100101000111100100110100100010110011101010100101111100101011000111110110100011001010001110100101001011100101101001010001000111000111100000000110001010011110111001011011110001110110101111110000101011101100110111011010100001101001111101100011010101001100110110111101110011100011010110100001'B"

'''
4

3 回答 3

2

repr() 为您提供 Python 代码,该代码一旦评估就会产生相同的对象。对于面向人类的表示,使用 .prettyPrint() 方法(任何 pyasn1 对象):

publicKey, restOfInput = decoder.decode(base64.b64decode(raw2))
print publicKey.prettyPrint()

序列:
<no-name>=序列:
<no-name>=1.2.840.10045.2.1
<no-name>=1.2.840.10045.3.1.7

<no-name>="'0000010011111100010101010011101011111100111010011011011010011011100100010010011111000100001111000000011001001001010100111011111001100000110101011110100010101110100100001110110111001110111010110100101110110100001000000000110001001101100101000111100100110100100010110011101010100101111100101011000111110110100011001010001110100101001011100101101001010001000111000111100000000110001010011110111001011011110001110110101111110000101011101100110111011010100001101001111101100011010101001100110110111101110011100011010110100001'B"

于 2014-02-22T21:05:39.393 回答
0

似乎 pyasn1 没有提供更好的格式,所以你必须按照方法中的模式自己实现它(__repr__参见http://pyasn1.cvs.sourceforge.net/viewvc/pyasn1/pyasn1/pyasn1/type /base.py?revision=1.35&view=markup )AbstractSimpleAsn1ItemAbstractConstructedAsn1Item

于 2014-02-22T20:34:31.443 回答
0

如果您想访问公钥本身的值,可以使用pycryptodome库。只需在文件 public.pem 中格式化您的数据:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/FU6/Om2m5EnxDwGSVO+YNXorpDtzutLtCAMTZR5
NIs6pfKx9oyjpS5aURx4BinuW8dr8K7N2oafY1TNvc41oQ==
-----END PUBLIC KEY-----

然后在 Python 中:

from Crypto.PublicKey import ECC
print(ECC.import_key(open('public.pem').read()))

EccKey(curve='P-256', x=114133426963296850915436792023241197556938624347236768937730916445384676553867, y=26527350004009046719864726291814153938182054558131723928772218772465776473505)

于 2017-04-20T16:03:08.797 回答