【问题标题】:How to increment a python "bytes" object如何增加python“字节”对象
【发布时间】:2019-11-21 02:34:25
【问题描述】:

在 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 不变。我想将 plaintext 从 '0000000000000000000000000000000' 到 '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')

【问题讨论】:

  • 为什么要这样做?您的问题的最佳解决方案可能比这更高。
  • 谢谢,我在编辑中添加了上下文
  • 几年是严重低估。如果你在宇宙之初就开始了这个计算,那么它仍然不会是现在完成的方式的百分之一百分之一。
  • :) 我仍然很想看到它的实际效果

标签: python hex byte increment


【解决方案1】:

我也很好奇。请在程序完成运行后发布程序的完整输出。哈哈……

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

因此,引入您想要的数据,然后通过将其解释为“大端”数字表示形式将其转换为数字:

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')

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

【讨论】:

  • @rusty-lemur - 如果此解决方案回答了您的问题,请将答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2018-01-08
  • 2021-07-22
  • 1970-01-01
  • 2020-04-18
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多