2016-11-17 4 views
0

У меня есть ключ шифрования, который является 32-битным в шестнадцатеричном формате. Но мне дают только 22 бита. Я должен найти Plaintext. Мой мысленный процесс - это атака грубой силы и поиск других 10 бит. Мне также дается шифрованный текст. Используемое шифрование - AES в 128-битном режиме ECB. Я использую Python, но я только начал изучать его, поэтому я еще не эксперт.Python - Создание всех комбинаций шестнадцатеричных значений

Мой подход состоит в том, чтобы взять 22-битный ключ и объединить другие 10 бит, передать это в AES вместе с Ciphertext и Decrypt, чтобы проверить, соответствует ли одна из полученных фраз правильному предложению. Единственная часть, за которую я застрял, - это генерация десятичной шестнадцатеричной шестнадцатеричной строки.

Это выход, что я хочу:

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

Приложение: Я считал, что я делаю 'для i в диапазоне (16 ** 10):' вместо цикла while, но тогда он не совместим с кросс-версией. Вы получите 'OverflowError: range() результат имеет слишком много элементов в Python 2.7. – Kevin

+0

Это именно то, что я хотел сделать. Не могли бы вы объяснить, что делает «yield» {: 010x}?. Format (i) .upper()? Потому что я хочу понять, что делает код перед его использованием. – ss1111

+0

Хорошо. «{: 010x}» - это спецификатор формата. Когда вы вызываете 'format (i)' на нем, он создает строчную версию 'i' в соответствии с параметрами в спецификаторе. первый 0 означает «набивать строку нулями, если она не является максимальной шириной». 10 после этого означает, что «максимальная ширина равна 10». Х означает «преобразовать это число в шестнадцатеричное». Обратный «верхний» вызов преобразует число в верхний регистр. ['yield'] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do) принимает значение и передает его в' for s в gen_all_hex(): 'scope, поэтому мы можем распечатать его. – 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'] 
Смежные вопросы