Domanda

Quello che sto cercando di fare è leggere alcuni tasti PEM pubbliche utilizzando Python GAE.

il modulo RSAKey non lo fa parse PEM formattato chiavi pubbliche, proprio privato.

Se posso ottenere il modulo e l'esponente della PEM, posso passare da lì.

Alla scoperta di una PEM tipica (del genere Userò) con openssl asn1parse posso trovare il BIT STRING in cui vivono.

Ma io non riesco a capire come trovarli utilizzando l'ASN1Parser GData.

Per esempio di output 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

E poi il drill-down posso vedere la RSA modulo e Esponente:

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

Se dunque io prendo questa stessa PEM e in Python bastone in bytes, come faccio ad ottenere il bambino corretto per ottenere questi valori?

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

O che cosa? Io non riesco a capire che livello, ecc ho bisogno di guardare. Anche io non so davvero cosa sto facendo ... Utilizzando hexlify posso vedere i valori in là, ma sempre (gioca con il bambino, e profondità) con roba più nella parte anteriore, e / o non il numero completo come indicato in OpenSSL.

È stato utile?

Soluzione

I tlslite modificato per fare ciò che si sta parlando ... Ecco un frammento di codice che dovrebbe aiutarti. "Byte" è il DER codificato chiave pubblica.

Credo che il problema che si stanno avendo è che alcuni tasti possono avere "padding". La lunghezza di riempimento è il primo byte del payload. Avrete quindi bisogno di saltare i byte di riempimento e che molti byte di padding.

@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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top