此代码有什么问题?它没有给出输出而是给出错误 - “IndexError:string index out of range”
import hashlib
import struct
import re as sbc
xorer=[117, 5, 36, 94, 6, 23, 113, 44, 71, 105, 6, 125, 1, 6, 90, 31, 54, 57, 117, 118, 2, 123, 61, 112, 1, 74, 106, 98, 69, 2, 12, 93]
md5_final="8a0e2e33fc0ef5f4d1b9243139a2aa4f"
flag=''
for i in range(32):
flag+=str(chr(ord(md5_final[i])^xorer[i]))
print "answer{"+flag+"}"
exit()
答案 0 :(得分:3)
由于在IndexError
为7时md5_final[i]
访问权限,您的代码因i
而失败。因为len(md5_final) == 7
和md5_final[6]
是您可以访问的最后一个索引
我的盲目猜测是,要“修复”您的代码,您需要将range(32)
替换为range(len(md5_final))
。然后你会打印answer{8pC9jr}
。也就是说,你的“Muggles”字符串,按字节顺序与xorer
值进行异或运算。我想,在一个真实的例子中,你有32个字符的字符串 - 例如“8a0e2e33fc0ef5f4d1b9243139a2aa4f”而不是“Muggles”,所以range(32)
会起作用。
同样,如果i >= len(xorer)
,您的代码将会中断。典型的解决方案是xorer[i % len(xorer)]
或range(min(len(md5_final), len(xorer)))
,具体取决于您要实施的内容。或者声明两个len(md5_final) == len(xorer)
,并在不是这种情况下引发异常。
然而,这只是一个盲目的猜测。请考虑解释您在那里做了什么 - 您的输入是什么,您正在实施什么算法以及您希望实现什么。
另外,以防万一...请注意,简单的XOR密码和MD5哈希函数可能严重不足以实现真实的安全性。因此,如果这不是一个学习项目,而是可能具有实际应用的东西 - 最好与某人就你正在做的事情进行协商。
答案 1 :(得分:0)
您的md5_final
字符串只有7个字符,但您的for
循环正在使用i = 0..31
进行迭代。
当您md5_final[i]
>时访问i
时,这会导致问题6。
你可能想要这样的东西:
for i in range(len(md5_final)):
flag += str(chr(ord(md5_final[i]) ^ xorer[i]))
输出类似于:answer{8pC9jr}
。
答案 2 :(得分:0)
在您的代码中,您尝试从0循环到32,其中md5_final
字符串仅包含7个字符。您无法访问md5_final[7]
。试试这个:
for i in range(len(md5_final)):