我的代码中有以下声明:
plain_text = 0x3243f6a8885a308d313198a2e03707343243f6a8885a308d313198a2e037073454a2e
我想分成相同大小的块,比如每个32个长度,这样我就有以下三个部分:
part1 = 0x3243f6a8885a308d313198a2e0370734
part2 = 0x3243f6a8885a308d313198a2e0370734
part3 = 0x54a2e
请注意,我的输入和输出都不是字符串。此外,如果明文的总长度不是所需的大小,最后一部分不会被丢弃,而是按原样复制(到某些partn
)。
实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
显而易见的事情是转移和掩盖。
如果你想要最低的16个字节,然后是下一个最低的等等,顶部不完整,那就更容易了,所以让我们先做:
bits = []
while plain_text:
bits.append(plain_text & ((1 << 128) - 1))
plain_text >>= 128
bits.reverse()
相反,看起来你想要最高16字节等,让最小部分不完整而不是最大。但这不是什么大不了的事。唯一棘手的部分是知道开始使用什么掩码,你可以用plain_text.bit_length()
得到它(或者,如果你使用旧版本的Python,通过使用显示的等效代码手动执行相同的操作文档)。此外,看起来你想要分割半字节而不是字节,但这也不是太难:
bits = []
shift = (math.ceil(plain_text.bit_length() / 4) % 32) * 4
while plain_text:
bits.append(plain_text & (1 << shift) - 1)
plain_text >>= shift
shift = 128
bits.reverse()
有效吗?
>>> part1, part2, part3 = bits
>>> hex(part1), hex(part2), hex(part3)
('0x3243f6a8885a308d313198a2e0370734',
'0x3243f6a8885a308d313198a2e0370734',
'0x54a2e')
作为旁注,我有点担心您要将其存储在名为part1
,part2
和part3
的变量中,而不仅仅是名为{{1 (或parts
)。如果bits
稍微大一点并且不适合3个部分,你打算做什么?
答案 1 :(得分:0)
您可以使用textwrap.wrap
:
>>> import textwrap
>>> plain_text = 0x3243f6a8885a308d313198a2e03707343243f6a8885a308d313198a2e037073454a2e
>>> output = [int(x, 16) for x in textwrap.wrap(format(plain_text, 'x'), 32)]
>>> output
[66814286504060421741230023322616923956L, 66814286504060421741230023322616923956L, 346670]
>>> for x in output:
... print format(x, 'x')
...
3243f6a8885a308d313198a2e0370734
3243f6a8885a308d313198a2e0370734
54a2e