Python中没有itertools的蛮力解决方案

时间:2019-06-03 03:39:31

标签: python python-3.x string brute-force

我是Python的新手。 我正在尝试计算3 ** 16 (¹[0-f], ²[0-f], ³[0-f]) 但它不能正常工作。 这是我的代码:

inp = str(input('value len 0-3 digit:'))
hexa = ('0123456789abcdef');
#len(hexa) = 16 digit
#pass = '36f'
pass = inp
for x in range(0, 3 ** len(hexa)):
#range = 0..(3 ^ 16)
    if(hexa[x] == pass):
        found = hexa[x]
#if result valid
        print("pos: %d, pass: %s" % (x, found))
#print position

我收到错误“索引超出范围”。 我需要这样的输出:

000 #first
001
002
...
...
36f #found then break
...
...
fff #last

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我相信您的IndexError: string index out of range错误来自以下逻辑:

for x in range(0, 3 ** len(hexa)):

可能应该是:

for x in range(len(hexa) ** len(inp)):

一个小得多的数字。输入超过一位的数字永远不会起作用:

if(hexa[x] == pass):

您需要重新考虑这一点。使用Python自己的hex()函数,我得出了我猜测您正在尝试做的事情的近似值:

hexadecimal = input('hex value of 1-3 digits: ').lower()

hex_digits = '0123456789abcdef'

for x in range(len(hex_digits) ** len(hexadecimal)):
    if hex(x) == "0x" + hexadecimal:
        print("pos: %d, pass: %s" % (x, hexadecimal))
        break

输出

> python3 test.py
hex value of 1-3 digits: 36f
pos: 879, pass: 36f
>

如果这不是您要尝试的操作,请在问题中进一步解释。

要考虑的其他问题:不要使用pass作为变量的名称,它是一个Python关键字; input()返回str,您无需在其上调用str;避免在Python中使用分号(;)。