Matasano 挑战 Python Set 1-> 3、代码中的未知错误



我正试图解决Matasano挑战集1->3,即单字节XOR密码并将其反转。我想我理解要解决的概念,但我的解决方案给出了一些错误:

 Traceback (most recent call last):
File "C:cryptopythonbreakXor.py", line 59, in <module>
 print(transforma(unhex))
File "C:cryptopythonbreakXor.py", line 51, in transforma
 if(scoreBoard(xored) > r):
File "C:cryptopythonbreakXor.py", line 40, in scoreBoard
 c=chr(i).lower()
TypeError: an integer is required

我得到了这些错误,我真的不明白为什么

import binascii
freqs = {
'a': 0.08167,
'b': 0.01492,
'c': 0.02782,
'd': 0.04253,
'e': 0.12702,
'f': 0.02228,
'g': 0.02015,
'h': 0.06094,
'i': 0.06966,
'j': 0.00153,
'k': 0.00772,
'l': 0.04025,
'm': 0.02406,
'n': 0.06749,
'o': 0.07507,
'p': 0.01929,
'q': 0.00095,
'r': 0.05987,
's': 0.06327,
't': 0.09056,
'u': 0.02758,
'v': 0.00978,
'w': 0.02361,
'x': 0.00150,
'y': 0.01974,
'z': 0.00074,
' ': 0.19281 
}
def xor(xs, ys):
    return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))

def scoreBoard(inp):
    r = 0
    for i in inp:
        c=chr(i).lower()
        if c in freqs :
            r += freqs[c]
    return r 

def transforma(inp):
    r = 0  
    for i in range(0,256):
        xored = xor(inp,list(str(i)))
        if(scoreBoard(xored) > r):
            resultado = scoreBoard(xored)
            indice = i 
    return (indice,resultado)
if __name__  ==  "__main__":
    inp = '1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'
    unhex = binascii.unhexlify(inp) 
    print(transforma(unhex))

任何对错误解释和如何修复的解决方案的改进都将是令人敬畏的

Ps:我是python和OOP中的一个noob,所以任何建议都欢迎

xor需要2个列表;您正在向它传递一个列表和一个整数。

您的算法错误,scoreBoard与此类似,参考github 的Matasano加密挑战

def scoreBoard(text):
    text = text.upper()
    frequencies = {}
    for letter in text:
        if letter in frequencies:
            frequencies[letter] += 1.
        else:
            frequencies[letter] = 1.
    total = sum(frequencies.values())
    for letter in frequencies.keys():
        frequencies[letter] /= total
    score = 0.0
    for l in freqs.keys():
        if l not in frequencies:
            frequencies[l] = 0.0
        score += math.sqrt(frequencies[l] * freqs[l])
    return score