如何使用Python gdata.tlslite.utils.ASN1Parser获取指数和模数



我想做的是使用Python GAE读取一些PEM公钥。

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

如果我能从PEM中得到模量和指数,我就能从那里开始。

使用openssl asn1parse探索一个典型的PEM(我将使用的那种),我可以找到它们所在的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

如果我然后采取相同的PEM并在Python中将其插入bytes,我如何获得正确的子节点来获得这些值?

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

还是别的什么?我不知道我需要看哪一层。我也不知道自己在做什么……使用hexlify,我可以看到那里的值,但总是(与child和depth一起玩)前面有额外的东西,和/或不是完整的数字,如openssl.

所示。

我修改了tlslite来做你所说的…这里有一个片段可以帮助你。"bytes"为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)

最新更新