如何跳过组合猜猜字符串(python)?

时间:2017-10-16 13:08:05

标签: python combinations itertools

我有一个20字节的字符串,从中我取5个4字节的数组(前4个字节=数组1等)。

我必须通过特定的函数将每个数组转换为小数。

这样,我最终会得到5个整数。

我必须添加这5个整数并达到一个特定的数字(4863101420)。

你是否知道如何猜测20个原始字符的一个可能组合 - 通过分成数组和解码为整数的过程 - 将加起来为4863101420,而不需要像itertools.combinations_with_replacement这样的东西?

由于我有20个可能的字符,每个字符是94个可能的字符中的一个(可打印的asciis),因此计算一个最多可达4863101420的字符串可能需要一段时间。

任何见解?

我用来将char转换为int的函数是:

def convertCharToDec(charInput):
    firstByte = format(ord(charInput[0]), "x")
    secondByte = format(ord(charInput[1]), "x")
    thirdByte = format(ord(charInput[2]), "x")
    fourthByte = format(ord(charInput[3]), "x")
    convertedHex = firstByte + secondByte + thirdByte + fourthByte
    return int(convertedHex, 16)

1 个答案:

答案 0 :(得分:0)

做一些数学,你会发现最后的整数等于A 0 ×16 6 + A 1 ×16 < sup> 4 + A 2 ×16 2 + A 3 ,其中A i = { {1}}。它是5个字节的总和,因此32×5≤A i ≤126×5。

因此,您可以先尝试A i 的值,然后为每个值尝试5个字节的组合。这应该大大减少计算时间。

仅当sum([ord(the_whole_string[i + j]) for j in range(0, 20, 4)])为任何i返回长度为2的字符串时,此方法才有效。

编辑:这是数学。​​

示例:format(ord(charInput[i]), "x")(这是解决方案之一)

7]f`8^ga:_hb;`id<aje

7]f` -> int(375d6660, 16) = 37*16^6 + 5d*16^4 + 66*16^2 + 60 8^ga -> int(385e6761, 16) = 38*16^6 + 5e*16^4 + 67*16^2 + 61 :_hb -> int(3a5f6862, 16) = 3a*16^6 + 5f*16^4 + 68*16^2 + 62 ;`id -> int(3b606964, 16) = 3b*16^6 + 60*16^4 + 69*16^2 + 63 <aje -> int(3c616a65, 16) = 3c*16^6 + 61*16^4 + 6a*16^2 + 64 ___________________________________________________________________ A0*16^6 + A1*16^4 + A2*16^2 + A3 A0 = 37 + 38 + 3a + 3b + 3c