特定于pgp算法的数据提取

2024-06-01 07:17:53 发布

您现在位置:Python中文网/ 问答频道 /正文

这是从pgp密钥中提取特定于算法的值的正确方法吗?我有一个奇怪的问题,除了DSA和ElGamal的最后一个值都可以正确地提取,这会使我的程序的其余部分混乱

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

例如:我有一个从网上某个地方得到的钥匙,里面有数据(从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以外的一切,这会扰乱我的程序。我得到的y的长度是2079,这是没有意义的,因为其他的都是正确的,但是当我看二进制数据时,程序没有读错,所以我不知道我的程序出了什么问题。在

有什么想法吗?在


Tags: ofthe程序dataisvaluepubliclength
1条回答
网友
1楼 · 发布于 2024-06-01 07:17:53

我不熟悉Python,但看起来data=data[16+length:]跳过16+length:bits in data,但在OpenPGP multiprecision integers中,body被填充到字节边界,也就是说,您应该编写类似data=data[16+(((length+7)/8)*8:]

相关问题 更多 >