如何递增 python "bytes" 对象

How to increment a python "bytes" object

在 Python3.7 中递增字节对象的最快方法是什么?考虑以下因素:

>>> foo = '00000000000000000000000000000000'
>>> bar = binascii.unhexlify(foo)
>>> bar
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

我想将 bar 递增 1,结果是 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'

如果我尝试 bar + 1,我得到:

>>> bar + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat int to bytes

如果我尝试 bar + b'1',我得到:

>>> bar + b'1'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001'

我知道必须有一种比返回 foo(字符串)、将其转换为 int、递增它、转换回字符串,然后再转换回字符串更快的循环十六进制值的方法在上面做 binascii.unhexlify。但是我不熟悉这些字节对象。

编辑

我的最终目标是循环遍历下面 plaintext 的许多值,同时保持 KEY 不变。我想从 '0000000000000000000000000000000' 取 plaintext 到 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 并计算每个值。我想这将需要几年时间才能完成,但我很好奇它会进行多快。

from Crypto.Cipher import AES
import binascii
KEY = binascii.unhexlify('AAAABBBBCCCCDDDDEEEEFFFF00001111')
plaintext = binascii.unhexlify('11112222333344445555666677778888')
rijn = AES.new(KEY, AES.MODE_ECB)
ciphertext = rijn.encrypt(plaintext)
binascii.hexlify(ciphertext).decode('utf-8')

我也很好奇。请 post 程序完成后 运行 的完整输出。大声笑...

您可以在 Python 3.2 中使用函数 to_bytes 和 from_bytes 从整数移动到字节数组。我认为这是你的小计划中缺失的部分。

因此,引入您想要的数据,然后通过将其解释为 'big-endian' 数字表示将其转换为数字:

plaintext = binascii.unhexlify('11112222333344445555666677778888')
# also, we'll want to know our length later on
plaintext_length = len(plaintext)
plaintext_number = int.from_bytes(plaintext, 'big')

现在您可以继续递增该数字,然后根据需要进行处理。例如,将其转换回字节数组和/或将其打印为十六进制:

plaintext_number += 1
new_plaintext = plaintext_number.to_bytes(plaintext_length, 'big')
new_hex = binascii.hexlify(new_plaintext)

print(f'Testing new string. This shouldnt take too long, almost done! {new_hex}')

new_ciphertext = rijn.encrypt(new_plaintext)
new_cipherhex = binascii.hexlify(new_ciphertext).decode('utf-8')

总而言之:您不能递增字节数组。您必须首先将字节解释为某种东西。我们将其解释为大端整数。坚持那个整数并不断增加它。在每一步,您都可以将该整数转换回字节数组,如果您愿意,甚至可以转换回十六进制字符串。