我正在尝试解决密码分析的密码瘫痪练习。现在,我正在与第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
类型的。
如何使我的汉明距离函数工作
目前没有回答
相关问题 更多 >
编程相关推荐