Python - 如何将单词分成64位块

时间:2015-09-21 01:08:12

标签: python

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

基本上我需要能够获取可变长度的密钥(最多2048位),将其分成64位字,并执行校验和。我不确定这究竟意味着什么。要使用Python将一个单词分成64位字,怎么会这样呢?我想一旦我这样做,我应该能够对单词执行XOR运算以获得64位输出。目前虽然我仍然坚持如何在Python中适当地分解64位块中的单词?

1 个答案:

答案 0 :(得分:3)

奇偶校验和校验和只是字中所有位的xor。执行此操作的最有效方法是使用log(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

纵向奇偶校验检查略有不同,因为当你达到给定的字大小时你会停止,此时你的奇偶校验应该全是零或全部,而不是一个一个或零。我不知道你是想要奇数还是奇偶校验,所以这更通用一点:

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)

因此,对于您的示例,第一个参数是2048位整数,total_bits是2048,word_bits是64,所需的奇偶校验是0或1。

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

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

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