Python-如何将单词分解为64位块

Python-如何将单词分解为64位块,python,Python,我正在做一项任务,我必须进行Diffie-Helman密钥交换。为了加快速度,我在Python中使用位运算符,从编程角度来看,一切都很好,但我必须执行奇偶校验和,我认为我对这是什么或它是如何工作的没有正确的理解 基本上,我需要能够获取可变长度的键(最多2048位),将其分解为64位字,并执行校验和。我不确定这到底意味着什么。要使用Python将一个单词分解为64位单词,我们将如何处理?我想一旦我这样做了,我应该能够对字执行XOR操作,以获得64位的输出。目前,我一直在思考如何在Python中将一

我正在做一项任务,我必须进行Diffie-Helman密钥交换。为了加快速度,我在Python中使用位运算符,从编程角度来看,一切都很好,但我必须执行奇偶校验和,我认为我对这是什么或它是如何工作的没有正确的理解


基本上,我需要能够获取可变长度的键(最多2048位),将其分解为64位字,并执行校验和。我不确定这到底意味着什么。要使用Python将一个单词分解为64位单词,我们将如何处理?我想一旦我这样做了,我应该能够对字执行XOR操作,以获得64位的输出。目前,我一直在思考如何在Python中将一个单词正确地分解成64位的块

奇偶校验和就是字中所有位的异或。最有效的方法是使用日志(nbits)操作,因为您可以将每次迭代处理的位数减半。例如:

def parity(word, nbits):
    if nbits & (nbits - 1):
        raise ValueError("nbits must be power of two")

    while nbits > 1:
        nbits >>= 1
        word ^= (word >> nbits)
    return word & 1
纵向奇偶校验有点不同,因为当达到给定的字长时停止,此时奇偶校验应为全零或全1,而不是单个的1或0。我不知道您想要奇偶校验,所以这是更一般的:

def longitudinal_parity(data, total_bits, word_bits, expected_parity=1):
    """
    Performs longitudinal parity check
    """
    for nbits in (total_bits, word_bits):
        if nbits & (nbits - 1):
            raise ValueError("bit size must be power of two")

    mask = (1 << total_bits) - 1

    while total_bits > word_bits:
        total_bits >>= 1
        data ^= (data >> total_bits)
        mask >>= total_bits
        data &= mask
    return data == (mask if expected_parity else 0)
def纵向校验(数据、总校验位、字校验位、预期校验位=1):
"""
执行纵向奇偶校验
"""
对于N位输入(总位、字位):
如果nbits和(nbits-1):
raise VALUETERROR(“位大小必须是二的幂”)
掩码=(1个字\u位:
总位>>=1
数据^=(数据>>总位)
掩码>>=总\u位
数据&=掩码
返回数据==(如果需要屏蔽\u奇偶校验,否则为0)
因此,对于您的示例,第一个参数将是2048位整数,总_位将是2048位,字_位将是64位,所需奇偶校验将是0或1

我对Diffie Hellman的奇偶校验一无所知,但如果您的奇偶校验是单独提供的(似乎很可能),那么您将与一个单独的奇偶校验字进行比较,而不是与所有1或所有0进行比较。这是一个小小的调整:

def longitudinal_parity(data, total_bits, word_bits, expected_parity):
    """
    Performs longitudinal parity check
    """
    for nbits in (total_bits, word_bits):
        if nbits & (nbits - 1):
            raise ValueError("bit size must be power of two")

    mask = (1 << total_bits) - 1

    while total_bits > word_bits:
        total_bits >>= 1
        data ^= (data >> total_bits)
        mask >>= total_bits
        data &= mask
    return data == expected_parity
def纵向校验(数据、总校验位、字校验位、预期校验位):
"""
执行纵向奇偶校验
"""
对于N位输入(总位、字位):
如果nbits和(nbits-1):
raise VALUETERROR(“位大小必须是二的幂”)
掩码=(1个字\u位:
总位>>=1
数据^=(数据>>总位)
掩码>>=总\u位
数据&=掩码
返回数据==预期的\u奇偶校验

这里有很多可能的优化,例如预先计算掩码,以较小的数字开始掩码,等等。希望代码是可读的。

无关:这听起来不对:“为了加快速度,我在Python中使用位运算符”--位运算不是加快Python代码速度的方法(您需要).您的输入类型是什么?
int
字节
,还有其他吗?J.F,是的,您可能是对的,但我们不允许使用pow()函数,在python中执行类似于2**256的操作与使用逐位运算符相比需要很长的时间。输入类型为int。这是一个相反的任务:。它应该让您了解如何从64位整数键切掉32位整数块,然后从那里继续(从2048位整数键切掉64位整数块)。我认为将某些东西分解为位的最佳方法就是简单地将整数转换为二进制,然后我就直接将它分解为64个长度的块吗?这很简单还是我遗漏了什么?你可以显式地检查2的幂并提高
ValueError
是2的幂吗=λn:(n>0)和(n&(n-1))==0
(注意:不包括零)。我考虑过这一点,也考虑过通过查找下一个较低的二次幂并从较少的位开始(例如使用log函数)来允许非二次幂。根据需要,将其中一个添加到生产代码中是一件好事,但我想我会添加您的建议,以便他们知道如果出现异常,他们需要执行另一个:-)谢谢,伙计,还没有实现,但是你的解释和细节太棒了。在我做其他事情之前,我还要多读一些书,但是真的很感谢你所做的!