我正试图解决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