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