2011-11-30 23 views
0

我想要做的是使用Python GAE读取一些PEM公钥。如何使用Python gdata.tlslite.utils.ASN1Parser获取指数和模数?

RSAKey模块不解析PEM格式的公钥,只是私有的。

如果我能从PEM中得到模量和指数,我可以从那里去。

探索一个典型的PEM(我将使用的)与openssl asn1parse我可以找到他们住的地方BIT STRING

但我不知道如何使用gdata ASN1Parser找到它们。

例如OpenSSL的输出:

openssl asn1parse -i -in test.pem 
0:d=0 hl=3 l= 159 cons: SEQUENCE   
3:d=1 hl=2 l= 13 cons: SEQUENCE   
5:d=2 hl=2 l= 9 prim: OBJECT   :rsaEncryption 
16:d=2 hl=2 l= 0 prim: NULL    
18:d=1 hl=3 l= 141 prim: BIT STRING 

然后深挖我可以看到RSA模数和指数:

openssl asn1parse -strparse 18 -i -in test.pem 
    0:d=0 hl=3 l= 137 cons: SEQUENCE   
    3:d=1 hl=3 l= 129 prim: INTEGER   :09C7A8007111B2B... 
135:d=1 hl=2 l= 3 prim: INTEGER   :010001 

如果我再取此相同的质子交换膜,并在Python它贴到bytes ,我如何获得正确的孩子来获得这些价值?

asn1 = ASN1Parser(bytes) 
modulus = asn1.getChild(1).getChild(0).value 
exponent = asn1.getChild(1).getChild(1).value 
binascii.hexlify(modulus) 

还是什么?我无法弄清楚我需要看什么水平等。我也不知道自己在做什么...使用hexlify,我可以看到那里的值,但总是(带着孩子和深度玩耍)前面有额外的东西,和/或不是如图所示的完整数字在openssl中。

回答

0

我修改tlslite来做你正在谈论的...这里有一个片段可以帮助你。 “字节”是DER编码的公钥。

我认为你遇到的问题是一些键可能有“填充”。填充长度是有效负载的第一个字节。然后您将需要跳过填充字节以及填充的许多字节。

@staticmethod 
def parseDERPublicKey(bytes): 
    a = ASN1Parser(bytes) 
    b = a.getChild(1) 
    padding = b.value[1] 
    # TODO: I am assuming padding is 0, this is wrong. 
    #  Skip the padding as well. 
    c = b.value[1:] # get the mod/exp portion after the padding 
    d = ASN1Parser(c) 

    modulus = bytesToNumber(d.getChild(0).value) 
    exponent = bytesToNumber(d.getChild(1).value)