2016-11-17 64 views
0

我有一個加密密鑰,它是十六進制格式的32位。但我只給了22位。我必須找到明文。我的思考過程是做一個暴力攻擊,並找到其他10位。我也給了Ciphertext。使用的加密是128位ECB模式下的AES。我正在使用Python,但我剛開始學習它,所以我不是專家。Python - 生成十六進制值的所有組合

我的方法是採用22位密鑰並連接其他10位,將其與AES密文和解密一起送入AES,以檢查結果短語是否類似於正確的句子。唯一卡住的部分是生成10位十六進制字符串。

這是我想要的輸出:

0000000000 
0000000001 
0000000002 
... 
000000000F 
... 
FFFFFFFFFF 

什麼是方法,我可以用它來做到這一點?我試着製作一個字典併爲所有十六進制值分配數值,但是我堅持寫如何編寫一個循環來給出我想要的輸出序列。

+1

所以,你想一個方法來生成所有可能的十六進制數的長度爲10的字符串? – James

回答

3
def gen_all_hex(): 
    i = 0 
    while i < 16**10: 
     yield "{:010X}".format(i) 
     i += 1 

for s in gen_all_hex(): 
    print(s) 

結果:

0000000000 
0000000001 
0000000002 
0000000003 
0000000004 
0000000005 
0000000006 
0000000007 
0000000008 
0000000009 
000000000A 
000000000B 
000000000C 
000000000D 
000000000E 
000000000F 
0000000010 
0000000011 
0000000012 
0000000013 
0000000014 
0000000015 
0000000016 
0000000017 
0000000018 
0000000019 
000000001A 
... 

注意,這將需要很長的時間通過所有1,099,511,627,776值進行迭代。

+2

附錄:我認爲我在範圍內(16 ** 10):'而不是while循環,但它不是跨版本兼容的。你會在Python 2.7中得到'OverflowError:range()結果有太多項目。 – Kevin

+0

這正是我想要做的。你能解釋一下「yield」{:010x}「.format(i).upper()」是做什麼的嗎?因爲我想在使用它之前瞭解代碼的功能。 – ss1111

+0

好的。 「{:010x}」是格式說明符。當你調用'format(i)'時,它會根據說明符中的參數產生一個字符串版本'i'。前0表示「如果不是最大寬度,則用零填充字符串」。之後的10表示「最大寬度爲10」。 x表示「將此號碼轉換爲十六進制」。尾部'upper'調用將數字轉換爲大寫。 ['yield'](http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do)將值傳遞給gen_all_hex()中的's:'範圍我們可以打印它。 – Kevin

1
from itertools import product 

print(map(''.join, product('ABCDEF', repeat=2))) 

repeat=2是用於演示目的,顯然增加至10

對於Python 3,如果你真的想看到的東西打印,使用list(map(...))

輸出:

['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0A', '0B', '0C', '0D', '0E', '0F', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1A', '1B', '1C', '1D', '1E', '1F', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2A', '2B', '2C', '2D', '2E', '2F', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3A', '3B', '3C', '3D', '3E', '3F', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5A', '5B', '5C', '5D', '5E', '5F', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6A', '6B', '6C', '6D', '6E', '6F', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7A', '7B', '7C', '7D', '7E', '7F', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8A', '8B', '8C', '8D', '8E', '8F', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9A', '9B', '9C', '9D', '9E', '9F', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'EA', 'EB', 'EC', 'ED', 'EE', 'EF', 'F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF']