Как использовать python gdata.tlslite.utils.asn1parser для получения экспонента и модуля?

StackOverflow https://stackoverflow.com/questions/8327315

Вопрос

То, что я пытаюсь сделать, это прочитать некоторые общественные ключи PEM, используя Python Gae.

Модуль 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

Если я тогда возьму ту же PEM и в Python вставьте его в bytes, как мне заставить правильного ребенка получить эти значения?

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

Или что? Я не могу понять, какой уровень и т. Д. Мне нужно посмотреть. Я также действительно не знаю, что я делаю ... используя hexlify, я вижу там значения, но всегда (игра с ребенком и глубиной) с дополнительными вещами впереди, и/или не полное число, как показано на рисунке в OpenSsl.

Это было полезно?

Решение

Я изменил 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top