跨版本加密解密:Python3与Python2字节对象长度异常求助
跨Python2/Python3的字节异或兼容解决方案
问题核心是Python2和Python3对bytes的实现完全不同:
- Python3里,
bytes(可迭代整数序列)会把每个0-255的整数转换成对应字节,生成指定长度的字节串。 - Python2里,
bytes是str的别名,传入生成器对象时,它会直接把生成器转成字符串(比如<generator object <genexpr> at 0x...>),这就是你得到长度46结果的原因。
解决办法:
针对Python2环境,把生成字节串的代码改成字符串拼接的方式:
from Crypto.Random import get_random_bytes a = get_random_bytes(16) b = get_random_bytes(16) # Python2中用chr把整数转成字符,再拼接成等价于Python3 bytes的字符串 k = ''.join(chr(a_byte ^ b_byte) for a_byte, b_byte in zip(a, b)) print(len(a)) print(len(b)) print(len(k)) # 现在输出16
如果需要写兼容两个版本的代码,可以加版本判断:
import sys from Crypto.Random import get_random_bytes a = get_random_bytes(16) b = get_random_bytes(16) if sys.version_info >= (3, 0): k = bytes(a_byte ^ b_byte for a_byte, b_byte in zip(a, b)) else: # Python2中get_random_bytes返回str,迭代得到字符,需用ord转成整数再异或 k = ''.join(chr(ord(a_byte) ^ ord(b_byte)) for a_byte, b_byte in zip(a, b)) print(len(a), len(b), len(k))
这样无论在Python3还是Python2中,k的长度都会是16,符合预期。
内容的提问来源于stack exchange,提问作者lavida
相关产品推荐
相关产品推荐

