2010-12-26 8 views
1

これは、正しい方法でpgpキーからアルゴリズム固有の値を抽出するでしょうか?私はその後、例えば私のプログラムpgpアルゴリズム固有のデータ抽出

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 

の残りの部分を台無しにDSAとElGamalのためのすべてが、最後の値を適切に抽出することができる奇妙な問題を、持っている:私は、データをどこかにオンラインからもらった鍵を持っています(pgpdump.netからダンプ)ビーイング:

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) - ... 

私は私のプログラムの残りの部分を台無しY、以外のすべてを得るでしょう。私はバイナリデータを見ると、プログラムが間違ってそれを読んでいないので、私はどこにプログラミングがうまくいかないのか分からない。

答えて

1

私はPythonに慣れていませんが、data = data [16 + length:]はデータ内の16 + length:ビットをスキップしますが、OpenPGP多重精度整数ボディはバイト境界にパディングされます。 data = data [16 +((length + 7)/ 8)*])]