我正在做一项任务,我必须进行Diffie-Helman密钥交换。为了加快速度,我在Python中使用位运算符,并且所有内容都运行良好的编程,但我必须执行奇偶校验和,我认为我没有正确理解这是什么或如何的工作原理。
基本上我需要能够获取可变长度的密钥(最多2048位),将其分成64位字,并执行校验和。我不确定这究竟意味着什么。要使用Python将一个单词分成64位字,怎么会这样呢?我想一旦我这样做,我应该能够对单词执行XOR运算以获得64位输出。目前虽然我仍然坚持如何在Python中适当地分解64位块中的单词?
答案 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
这里有很多可能的优化,例如预先计算掩码,以较小的数字启动掩码等。希望代码是可读的。