Question

Ce que je suis en train de faire est de lire des clés publique PEM en utilisant Python GAE.

le module RSAKey ne parse au format PEM clés publiques, juste privé.

Si je peux obtenir le module et l'exposant à partir du PEM, je peux aller de là.

Exploration d'un PEM typique (du genre je vais utiliser) avec OpenSSL asn1parse je peux trouver le BIT STRING où ils vivent.

Mais je ne peux pas comprendre comment les trouver en utilisant la ASN1Parser gdata.

Par exemple, la sortie de 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

Et le forage puis vers le bas, je peux voir le RSA et Modulus Exponent:

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 je prends alors ce même PEM et en Python coller dans bytes, comment puis-je obtenir l'enfant correct pour obtenir ces valeurs?

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

Ou quoi? Je ne peux pas comprendre à quel niveau, etc. Je besoin de regarder. Je aussi ne sais pas vraiment ce que je fais ... En utilisant hexlify je peux voir les valeurs là-dedans, mais toujours (jouer avec l'enfant et la profondeur) avec des choses supplémentaires à l'avant, et / ou non le numéro complet comme indiqué dans OpenSSL.

Était-ce utile?

La solution

Je tlslite modifié pour faire ce que vous parlez ... Voici un extrait qui devrait vous aider. « Octets » est le DER codé clé publique.

Je pense que le problème que vous rencontrez est que certaines touches peuvent avoir « padding ». La longueur de rembourrage est le premier octet de la charge utile. Vous devrez ensuite sauter les octets de remplissage et que le nombre d'octets de remplissage.

@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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top