You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨版本加密解密: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:06