Question

ce serait une bonne façon d'extraire les valeurs spécifiques de l'algorithme à partir d'une clé pgp? J'ai un problème bizarre où tous mais les dernières valeurs de DSA et ElGamal peuvent être extraits correctement, ce qui salit alors le reste de mon programme

def algorithm(data, pka):
    #data is a large binary string with the algorithm specific values, 
    #along with the rest of the data

    # MPI is defined as: 2 byte showing how many bits the value is + the value
    if pka in [pub[1], pub[2], pub[3]]:  # the 3 different RSA values/types
        '''MPI of RSA public modulus n'''
        # I havent actually used this part of the code yet
        length = int(data[:16], 2)       # get the length of the value in bits 
        n = int(data[16:16 + length], 2) # get the value
        data = data[16 + length:]        # remove the MPI from the data

            '''MPI of RSA public modulus e'''
        length = int(data[:16], 2)
        e = int(data[16:16 + length], 2)
        data = data[16 + length:]

            temp = [n, e]
    elif pka == 'DSA':
        '''MPI of DSA prime p'''
        length = int(data[:16], 2)
        p = int(data[16:16 + length], 2)
        data = data[16 + length:]

        '''MPI of DSA group order q (q is a prime divisor of p-1)'''
        length = int(data[:16], 2)
        q = int(data[16:16 + length], 2)
        data = data[16 + length:]

        '''MPI of DSA group generator g'''
        length = int(data[:16], 2)
        g = int(data[16:16 + length], 2)
        data = data[16 + length:]

        '''MPI of DSA public-key value y (= g**x mod p where x is secret)'''
        length = int(data[:16], 2)
        y = int(data[16:16 + length], 2)
        data = data[16 + length:]

            temp = [p, q, g, y]
    elif pka == 'Elgamal (Encrypt-Only)':
        '''MPI of Elgamal prime p'''
        length = int(data[:16], 2)
        p = int(data[16:16 + length], 2)
        data = data[16 + length:]

        '''MPI of Elgamal group generator g'''
        length = int(data[:16], 2)
        g = int(data[16:16 + length], 2)
        data = data[16 + length:]

        '''MPI of Elgamal public key value y (= g**x mod p where x
            is secret)'''
        length = int(data[:16], 2)
        y = int(data[16:16 + length], 2)
        data = data[16 + length:]

            temp = [p, g, y]

    return data, temp

par exemple: j'ai une clé que je suis arrivé de quelque part en ligne avec les données (sous-évaluées de pgpdump.net) étant:

Old: Public Subkey Packet(tag 14)(525 bytes) 
  Ver 4 - new Public key creation time - Sat Oct 24 20:28:43 UTC 1998 
  Pub alg - ElGamal Encrypt-Only(pub 16) 
  ElGamal p(2048 bits) - ... 
  ElGamal g(2 bits) - ... 
  ElGamal y(2044 bits) - ...

i obtiendrait tout sauf y, qui salit le reste de mon programme. la longueur que je reçois pour y est 2079, ce qui n'a pas de sens, car tout le reste est correct, mais quand je regarde les données binaires, le programme ne lit pas mal, donc je ne reçois où ma programmation va mal.

idées?

Était-ce utile?

La solution

Je ne suis pas familier avec Python, mais il semble que les données = données [16 + longueur:] skips 16 + longueur: bits de données, mais dans le corps des entiers OpenPGP multiprécision est matelassée pour limite d'octet, à savoir que vous devriez écrire quelque chose comme données = données [16 + (((longueur + 7) / 8) * 8):]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top