Python和cryptopals,为什么会出现涉及int的错误,而我周围没有这样的整数?

2024-07-05 14:34:36 发布

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

我正在尝试解决密码分析的密码瘫痪练习。现在,我正在与第1组练习6作斗争check here for some context

到目前为止,我的代码如下所示:

with open("6.txt", 'r') as infile:
        b64_encoded = infile.readlines()


from base64 import b64encode, b64decode

import functools



ciphertext = b64decode('\n'.join([x.strip() for x in b64_encoded if x != ""]))

def hammingDistance(binary_seq_1, binary_seq_2): # calculating the hamming distances between to byte strings
   
    assert len(binary_seq_1) == len(binary_seq_2)
    dist = 0

    for bit1, bit2 in zip(binary_seq_1, binary_seq_2):
        diff = bit1 ^ bit2
        dist += sum([1 for bit in bin(diff) if bit == '1'])

    return dist

def xor(b1, b2): # SImply for XOR'ing
  b = bytearray(len(b1))
  for i in range(len(b1)):
    b[i] = b1[i] ^ b2[i]
  return b



def createChunks(ciphertext, k):
    res = []
    while len(ciphertext) >= k:
        res.append(ciphertext[:k])
        ciphertext = ciphertext[k:]
    return res

def sortByKeysizeAndProbability(c ):
    normalized_distances = []
    for KEYSIZE in range(2, 40):
        chunks = createChunks(c, KEYSIZE)


        score = 0 
        score = float(
            functools.reduce( lambda acc, tup : acc +  hammingDistance(tup[0],tup[1]), list(zip(chunks, chunks[1:])), 0)
        )

        score /= KEYSIZE
        score /= len(chunks) 

        normalized_distances.append(
            (KEYSIZE, score)
        )
    return  sorted(normalized_distances, key=lambda x: x[1])



print(sortByKeysizeAndProbability(ciphertext))

导致故障的函数是sortByKeysizeAndProbability(),因为它引发以下错误:

Traceback (most recent call last):
  File "dummy.py", line 74, in <module>
    print(sortByKeysizeAndProbability(ciphertext))
  File "dummy.py", line 49, in sortByKeysizeAndProbability
    functools.reduce( lambda acc, tup : acc +  hammingDistance(tup[0],tup[1]), list(zip(chunks, chunks[1:])), 0)
  File "dummy.py", line 49, in <lambda>
    functools.reduce( lambda acc, tup : acc +  hammingDistance(tup[0],tup[1]), list(zip(chunks, chunks[1:])), 0)
  File "dummy.py", line 21, in hammingDistance
    dist += sum([1 for bit in bin(diff) if bit == '1'])
TypeError: 'int' object is not callable

嗯,不知何故,我似乎在某种程度上试图对一个整数使用我的hammingDistance。这对我来说没有任何意义,所以我决定看看是否可以重现这个问题。 在放置了一些打印之后,我可以看出它已经在循环的第一次迭代中失败了,当时KEYSIZE = 2

所以我认为我可以重新创建导致错误的条件,如下所示:

chunked = createChunks(ciphertext, 2)

sum = functools.reduce( lambda acc, tup : acc +  hammingDistance(tup[0],tup[1]), list(zip(chunked, chunked[1:])), 0)

print(sum)

但奇怪的是,这并没有失败,它只是输出9342,这是它应该做的

但这对我来说真的很奇怪,因为我上面写的这个小实验与我调用sortByKeysizeAndProbability()时代码失败的地方完全相同。有人能告诉我为什么代码在一种情况下失败了,而在另一种情况下有效吗

更新

有人向我指出,我可能在某个地方有一个叫做“sum”的变量,这让人很困惑。事实证明这是正确的,但我不太明白怎么回事

现在,当我尝试加载密文,并测量密文块之间的汉明距离时,会发生什么:

def hammingDistance(binary_seq_1, binary_seq_2): # calculating the hamming distances between to byte strings
   
    assert len(binary_seq_1) == len(binary_seq_2)
    dist = 0

    for bit1, bit2 in zip(binary_seq_1, binary_seq_2):
        diff = bit1 ^ bit2
        dist += sum([1 for bit in bin(diff) if bit == '1'])

    return dist
with open("6.txt", 'r') as infile:
        b64_encoded = infile.readlines()


from base64 import b64encode, b64decode

import functools

ciphertext = b64decode('\n'.join([x.strip() for x in b64_encoded if x != ""]))

chunked = createChunks(ciphertext, 2)


sums = functools.reduce( lambda acc, tup : acc +  hammingDistance(tup[0],tup[1]), list(zip(chunked, chunked[1:])), 0)

print(sums)

这个错误被抛到了我的脸上:

  File "dummy.py", line 20, in hammingDistance
    diff = bit1 ^ bit2
TypeError: unsupported operand type(s) for ^: 'str' and 'str'

这也很奇怪,因为我的密文是bytes类型的。 如何使我的汉明距离函数工作


Tags: lambdainforlendistdiffzipseq