2017-10-16 89 views
0

我有一個20字節的字符串,我從中取出5個四字節的數組(前四個字節=數組1等)。如何跳過組合以猜測字符串(python)?

我必須通過一個特定的函數將每個數組轉換爲小數。

這樣,我將以5個整數結束。

我必須添加這5個整數並達到一個特定的數字(4863101420)。

你有什麼想法如何猜測20個原始字符的一個可能的組合 - 經歷分解成數組和解碼爲整數的過程 - 將加起來4863101420,而不經過類似itertools.combinations_with_replacement ?

因爲我有20個字符可能每一個出來的94個字符可能(可打印asciis),這可能需要一段時間來計算的字符串加起來4863101420.

任何見解?

我使用的字符轉換成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) 
+0

有很多,很多,很多,加起來就是你的號碼組合。只需選擇一個並對其進行逆向工程?你的「散列」功能是否可逆?例如,你的數字除以5是972620284;假設所有陣列都是相同的。那對應的字符串是什麼? –

+0

通過20字節的字符串,你的意思是20個字符長的字符串? – MohitC

+0

好吧,加上前四個(來自他們來源),第五個將是'4863101420 - your_sum'。 –

回答

0

做一些數學,你會發現,最終的整數等於A ×16 +甲×16 4 + A ×16 + A ,其中A = sum([ord(the_whole_string[i + j]) for j in range(0, 20, 4)])。它是5個字節的總和,因此32×5≤A i≤126×5。

因此,您可以先嚐試A i的值,然後爲每個人嘗試5個字節的組合。這應該大大減少計算時間。

只有當format(ord(charInput[i]), "x")爲任何i返回一個長度爲2的字符串時,這纔有效。


編輯:這是數學。

例子: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 + 3cA1 = 5d + 5e + 5f + 60 + 61

+0

格式(ord(charInput [i]),「x」)在94個不同的i(ascii 32到126)的宇宙中爲任何i返回一個長度爲2的字符串。 我實際上添加了5個字節,它們是從4個字節的字符數組轉換而來的,而不是相反的。 不知道你的解決方案如何工作,雖然.. – zfg

+0

charInput [i]剛剛從陣列中獲取字符,根據其位置。這樣,數組'3ab4'的charInput [0]值爲'3'。 – zfg

相關問題