创建迭代器以进行暴力破解
Creating an iterator to brute force
你好,所以我正在尝试编写一个函数 hack(),它不带任何参数,return 是所有可能密码的迭代器。
基本上,我必须使用迭代器来暴力破解密码。我从这个问题中知道的是:
- 密码由三段组成。
- 密码的第一段是以下单词列表中两个单词的串联:["hello"、"BEGONE"、"dog"、"MrCool"]
- 中段是"Donkey20"
- 最后一段由两个数字组成(即 1 和 7 = 17),不大于 38。(并且至少为 0)
我的思路是这样的:
- 使用 permutations() 找到 POSSIBLE_WORDS 的所有可能组合。 (找到第 1 段的所有可能性)
对于新列表中的每个组合,将 "Donkey20" 添加到末尾。 (例如:helloBEGONEDonkey20)
找到该列表中的元素与 POSSIBLE_NUMBERS 之间的所有可能组合。
创建一个遍历所有这些可能的密码的迭代器,然后return它
我当前的代码只能执行第 2 步,但 Donkey20 不是在每个组合的末尾,而是在开头。 (例如 Donkey20helloBEGONE 而不是 helloBEGONEDonkey20)
POSSIBLE_WORDS = ["hello", "BEGONE", "dog", "MrCool"]
MIDDLE = "Donkey20"
possible_numbers1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
possible_numbers2 = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
possible_numbers3 = [29, 30, 31, 32, 33, 34, 35, 36, 37, 38]
POSSIBLE_NUMBERS = possible_numbers1 + possible_numbers2 + possible_numbers3
from itertools import permutations, combinations
def hack():
first_words = [''.join(word) for word in permutations(POSSIBLE_WORDS, 2)]
first_words.append(MIDDLE)
first_half = [''.join(word) for word in permutations(first_words, 2)]
有什么办法可以解决这个问题?我如何完成剩余的步骤?我可以使用不同的方法来编写此程序吗?
非常感谢任何帮助!
首先,没有理由建立POSSIBLE_NUMBERS
那样。只需使用 range(39)
或 list(range(39))
即可。
你的意图
first_words.append(MIDDLE)
几乎可以肯定不会将单个单词"Donkey20"附加到所有可能的第一部分的列表的末尾而是将其附加到 each 第一个单词的末尾。我认为你在这部分代码中的意图可以通过删除该行以及以下行并仅使用单行来更好地表达
first_half = [word + MIDDLE for word in first_words]
当您将最终可能的密码放在一起时,您将需要将数字转换为字符串。毫无疑问,您已经知道 str()
,但该函数的缺点是 str(1)
是 '1'
,而您可能想要 '01'
。在这种情况下,您可能想使用 format()
因为 format(1,'02')
returns '01'
.
这应该足以让您继续前进。既然是作业就不想多说了
你好,所以我正在尝试编写一个函数 hack(),它不带任何参数,return 是所有可能密码的迭代器。
基本上,我必须使用迭代器来暴力破解密码。我从这个问题中知道的是:
- 密码由三段组成。
- 密码的第一段是以下单词列表中两个单词的串联:["hello"、"BEGONE"、"dog"、"MrCool"]
- 中段是"Donkey20"
- 最后一段由两个数字组成(即 1 和 7 = 17),不大于 38。(并且至少为 0)
我的思路是这样的:
- 使用 permutations() 找到 POSSIBLE_WORDS 的所有可能组合。 (找到第 1 段的所有可能性)
对于新列表中的每个组合,将 "Donkey20" 添加到末尾。 (例如:helloBEGONEDonkey20)
找到该列表中的元素与 POSSIBLE_NUMBERS 之间的所有可能组合。
创建一个遍历所有这些可能的密码的迭代器,然后return它
我当前的代码只能执行第 2 步,但 Donkey20 不是在每个组合的末尾,而是在开头。 (例如 Donkey20helloBEGONE 而不是 helloBEGONEDonkey20)
POSSIBLE_WORDS = ["hello", "BEGONE", "dog", "MrCool"]
MIDDLE = "Donkey20"
possible_numbers1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
possible_numbers2 = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
possible_numbers3 = [29, 30, 31, 32, 33, 34, 35, 36, 37, 38]
POSSIBLE_NUMBERS = possible_numbers1 + possible_numbers2 + possible_numbers3
from itertools import permutations, combinations
def hack():
first_words = [''.join(word) for word in permutations(POSSIBLE_WORDS, 2)]
first_words.append(MIDDLE)
first_half = [''.join(word) for word in permutations(first_words, 2)]
有什么办法可以解决这个问题?我如何完成剩余的步骤?我可以使用不同的方法来编写此程序吗?
非常感谢任何帮助!
首先,没有理由建立POSSIBLE_NUMBERS
那样。只需使用 range(39)
或 list(range(39))
即可。
你的意图
first_words.append(MIDDLE)
几乎可以肯定不会将单个单词"Donkey20"附加到所有可能的第一部分的列表的末尾而是将其附加到 each 第一个单词的末尾。我认为你在这部分代码中的意图可以通过删除该行以及以下行并仅使用单行来更好地表达
first_half = [word + MIDDLE for word in first_words]
当您将最终可能的密码放在一起时,您将需要将数字转换为字符串。毫无疑问,您已经知道 str()
,但该函数的缺点是 str(1)
是 '1'
,而您可能想要 '01'
。在这种情况下,您可能想使用 format()
因为 format(1,'02')
returns '01'
.
这应该足以让您继续前进。既然是作业就不想多说了