【问题标题】:Python - Generating all combinations of Hexadecimal valuesPython - 生成十六进制值的所有组合
【发布时间】:2017-04-01 10:03:56
【问题描述】:

我有一个 32 位十六进制格式的加密密钥。但我只得到 22 位。我必须找到明文。我的想法是进行蛮力攻击并找到其他 10 位。我也得到了密文。使用的加密是 128 位 ECB 模式下的 AES。我正在使用 Python,但我刚开始学习它,所以我还不是专家。

我的方法是获取 22 位密钥并连接其他 10 位,将其与密文和解密一起输入 AES,以检查生成的短语是否类似于正确的句子。我唯一坚持的部分是生成 10 位十六进制字符串。

这是我想要的输出:

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

我可以使用什么方法来做到这一点?我尝试制作一个字典并将数值分配给所有十六进制值,但我被困在如何编写一个可以将我想要的序列作为输出的循环。

【问题讨论】:

  • 那么您想要一种方法来生成所有可能的十六进制数字的长度为 10 的字符串?

标签: python string for-loop hex


【解决方案1】:
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 个值需要很长时间。

【讨论】:

  • 附录:我考虑过使用 for i in range(16**10): 而不是 while 循环,但它不兼容跨版本。在 Python 2.7 中你会得到 OverflowError: range() result has too many items
  • 这正是我想做的。你能解释一下“yield”{:010x}“.format(i).upper()”的作用吗?因为我想在使用它之前了解代码在做什么。
  • 好的。 "{:010x}" 是格式说明符。当您在其上调用format(i) 时,它会根据说明符中的参数生成i 的字符串版本。第一个 0 表示“如果字符串不是最大宽度,则用零填充字符串”。后面的 10 表示“最大宽度为 10”。 x 表示“将此数字转换为十六进制”。结尾的 upper 调用将数字转换为大写。 yield 获取值并将其传递到 for s in gen_all_hex(): 范围,以便我们可以打印它。
  • 事后看来,如果您使用X 而不是x,则upper 调用并不是绝对必要的...我总是忘记这两个选项都存在。
【解决方案2】:
from itertools import product

print(map(''.join, product('0123456789ABCDEF', 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']

【讨论】:

  • 非常优雅的解决方案
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 2011-01-01
  • 2016-04-22
  • 2022-12-09
  • 2016-07-25
相关资源
最近更新 更多