Python智能十六进制数生成器

时间:2018-07-13 15:59:01

标签: python hex rainbowtable

我希望能够生成12个字符的十六进制长链,但BUT中链中重复的相同数字不超过2个:00而不是000 因为,我知道如何生成所有可能性,包括从00000000000到FFFFFFFFFFF,但是我知道我不会使用所有这些值,并且由于使用ALL可能性生成的文件的大小很多GB,因此我想减小大小通过避免生成没有用的链。

所以我的目标是获得类似00A300BF8911的结果,而不是获得000300BF8911

能请你帮我吗? 提前非常感谢!

6 个答案:

答案 0 :(得分:1)

我将这个问题解释为:“我想通过遍历具有以下品质的所有字符串来构造彩虹表。该字符串的长度为12,仅包含字符0-9和AF,而从不包含同一字符连续出现三遍。”

def iter_all_strings_without_triplicates(size, last_two_digits = (None, None)):
    a,b = last_two_digits
    if size == 0:
        yield ""
    else:
        for c in "0123456789ABCDEF":
            if a == b == c:
                continue
            else:
                for rest in iter_all_strings_without_triplicates(size-1, (b,c)):
                    yield c + rest

for s in iter_all_strings_without_triplicates(12):
    print(s)

结果:

001001001001
001001001002
001001001003
001001001004
001001001005
001001001006
001001001007
001001001008
001001001009
00100100100A
00100100100B
00100100100C
00100100100D
00100100100E
00100100100F
001001001010
001001001011
...

请注意,将输出价值数百TB的值,因此与仅保存每个字符串(是否重复)相比,您没有节省太多空间。

答案 1 :(得分:0)

您可以从每个十六进制数字两次的列表中提取随机序列:

digits = list('1234567890ABCDEF') * 2
random.shuffle(digits)
hex_number = ''.join(digits[:12])

如果您想允许较短的序列,也可以将其随机化,并用零填充空白。

import random

digits = list('1234567890ABCDEF') * 2
random.shuffle(digits)
num_digits = random.randrange(3, 13)
hex_number = ''.join(['0'] * (12-num_digits)) + ''.join(digits[:num_digits])

print(hex_number)

答案 2 :(得分:0)

import string, random

source = string.hexdigits[:16]
result = ''
while len(result) < 12 :
    idx = random.randint(0,len(source))
    if len(result) < 3 or result[-1] != result[-2] or result[-1] != source[idx] :
        result += source[idx]

答案 3 :(得分:0)

如果您两次选择相同的一个,请将其从回合的选择中删除:

import random
hex_digits = set('0123456789ABCDEF')

result = ""
pick_from = hex_digits
for digit in range(12):
    cur_digit = random.sample(hex_digits, 1)[0]
    result += cur_digit
    if result[-1] == cur_digit:
        pick_from = hex_digits - set(cur_digit)
    else:
        pick_from = hex_digits

print(result)

因为标题提到了生成器。以上是生成器:

import random
hex_digits = set('0123456789ABCDEF')

def hexGen():
    while True:
        result = ""
        pick_from = hex_digits
        for digit in range(12):
            cur_digit = random.sample(hex_digits, 1)[0]
            result += cur_digit
            if result[-1] == cur_digit:
                pick_from = hex_digits - set(cur_digit)
            else:
                pick_from = hex_digits
        yield result

my_hex_gen = hexGen()
counter = 0

for result in my_hex_gen:
    print(result)
    counter += 1
    if counter > 10:
        break

结果:

1ECC6A83EB14
D0897DE15E81
9C3E9028B0DE
CE74A2674AF0
9ECBD32C003D
0DF2E5DAC0FB
31C48E691C96
F33AAC2C2052
CD4CEDADD54D
40A329FF6E25
5F5D71F823A4 

您还可以更改while true循环,以根据传递给函数的数字仅产生一定数量的循环。

答案 4 :(得分:0)

您可以使用生成器在当前实现产生的字符串上迭代窗口。某事像(hex_str[i:i + 3] for i in range(len(hex_str) - window_size + 1))一样使用lenset,您可以计算切片中不同字符的数量。尽管在您的示例中,比较所有3个字符可能会更容易。

答案 5 :(得分:-1)

您可以创建一个介于0到255之间的数组,并将random.sample与列表一起使用以获取列表