Pregunta

Lo que estoy tratando de hacer es leer algunas claves públicas de PEM usando Python Gae.

El módulo Rsakey no analiza las claves públicas formateadas PEM, solo privadas.

Si puedo obtener el módulo y el exponente del PEM, puedo ir desde allí.

Explorando un PEM típico (del tipo que usaré) con OpenSSL asn1Parse puedo encontrar el BIT STRING donde viven.

Pero no puedo entender cómo encontrarlos usando el gdata asn1parser.

Por ejemplo, la salida 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

Y luego perforando puedo ver el módulo RSA y el exponente:

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

Si luego tomo este mismo pem y en python pégalo en bytes, ¿Cómo consigo el hijo correcto para obtener estos valores?

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

¿O que? No puedo entender qué nivel, etc. necesito mirar. Tampoco sé realmente lo que estoy haciendo ... usando hexlify puedo ver los valores allí, pero siempre (jugar con el niño y la profundidad) con cosas adicionales en el frente y/o no el número completo como se muestra En OpenSsl.

¿Fue útil?

Solución

Modifiqué tlslite para hacer lo que estás hablando ... aquí hay un fragmento que debería ayudarte. "Bytes" es la clave pública codificada DER.

Creo que el problema que está teniendo es que algunas claves pueden tener "relleno". La longitud del relleno es el primer byte de la carga útil. Luego necesitarás omitir los bytes de relleno y tantos bytes de relleno.

@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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top