Python实现二进制文件XOR的OTP密码代码调试与在线运行咨询
问题背景
你在安卓端开发OTP实现的二进制文件XOR运算引擎,规则为按两个文件中较短的长度做截断运算,因常用在线编译器不支持文件操作无法自测,需要代码校验及可测试方案。
原代码存在的问题
你的代码目前无法正常运行,存在以下几个核心错误:
- 核心运算逻辑错误:代码中使用的是
|(按位或)运算符,并非OTP要求的^(异或/XOR)运算,不符合功能需求。 - 语法报错点:
s.split("")为非法写法,Python不支持传入空字符串作为split方法的分隔符,运行到该行会直接抛出ValueError异常中断。 - 结果写入逻辑错误:将二进制字符串(如
"0b01100001")直接传入bytearray()的写法,会把字符串的每个字符('0'、'b'、'0'、'1'...)转为对应ASCII值的字节,最终写入的文件完全不是预期的单字节XOR结果,内容完全错误。 - 冗余逻辑:生成
output2.ttt的代码仅实现了key文件前min_size字节的复制,和XOR核心功能无关,可根据需求决定是否保留。 - 性能缺陷:逐字节读取文件、将字节转为二进制字符串逐位运算的写法效率极低,处理稍大的文件时会出现明显卡顿。
修正后可正常运行的代码
import os PLAINTEXT_FILE = "file.ttt" KEY_FILE = "key.ttt" CIPHER_FILE = "output1.ttt" KEY_COPY_FILE = "output2.ttt" # 前置校验输入文件 if not os.path.exists(PLAINTEXT_FILE) or not os.path.exists(KEY_FILE): print("运行错误:请确保file.ttt、key.ttt与脚本处于同一目录") exit(1) min_size = min(os.path.getsize(PLAINTEXT_FILE), os.path.getsize(KEY_FILE)) # 用上下文管理器自动处理文件关闭,避免资源泄漏 with open(PLAINTEXT_FILE, "rb") as f1, open(KEY_FILE, "rb") as f2, open(CIPHER_FILE, "wb") as f_out: # 直接读取对应长度字节,逐字节异或,无需转字符串,逻辑简洁效率高 plain_data = f1.read(min_size) key_data = f2.read(min_size) xor_res = bytes(b1 ^ b2 for b1, b2 in zip(plain_data, key_data)) f_out.write(xor_res) # 若不需要复制key文件可删除以下代码段 with open(KEY_FILE, "rb") as f_key, open(KEY_COPY_FILE, "wb") as f_copy: f_copy.write(f_key.read(min_size)) print(f"运算完成,已生成{CIPHER_FILE}与{KEY_COPY_FILE},运算长度为{min_size}字节")
测试方案
- 在线测试可选择带虚拟文件系统功能的在线Python运行环境,这类环境一般提供可视化的文件上传、下载面板,运行脚本前先在文件区上传你准备好的
file.ttt和key.ttt测试文件,脚本运行完成后直接下载生成的输出文件校验即可。 - 安卓本地测试更推荐直接安装本地Python运行环境类APP,授予存储权限后将脚本和测试文件放在同一目录下即可本地运行,不需要依赖网络,也没有在线环境的文件大小限制。
正确性校验方法
XOR运算满足可逆性:将生成的output1.ttt作为第一个输入文件,原key.ttt作为第二个输入文件重新运行脚本,得到的输出如果和原file.ttt的前min_size字节内容完全一致,就说明XOR引擎逻辑正确。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

