如何通过Python将用户输入文件加密为随机ASCII密钥?
问题与解决方案
现存问题
- 无法通过用户输入的文件路径正确读取文件内容
- 已生成随机ASCII映射密钥,但不知道如何利用该密钥完成文件加密
原代码核心问题
- 密钥生成逻辑错误:
if candidate not in numbersran:未缩进在while循环内部,导致永远无法向numbersran添加元素,最终生成空字典 - 文件读取重复无效:既用
open(filename)读取文件,又用固定字符串路径重复执行with open,且后者未使用用户输入路径 - 加密逻辑缺失:仅完成字符转ASCII值的步骤,未实现密钥映射加密的核心操作
修正后的完整代码
import random # 生成1-127 ASCII字符的随机映射密钥(可打印ASCII范围) lst = list(range(1, 128)) numbersran = [] while len(numbersran) < 127: candidate = random.randint(1, 127) if candidate not in numbersran: numbersran.append(candidate) # 构建加密映射:原ASCII值 → 随机替换的ASCII值 encrypt_dict = dict(zip(lst, numbersran)) # 生成解密字典(可选,用于后续还原文件) decrypt_dict = {v: k for k, v in encrypt_dict.items()} print("加密密钥(原ASCII: 替换后ASCII)=", encrypt_dict) print() # 读取用户输入的文件 filename = input("输入文件路径: ") try: with open(filename, 'r', encoding='utf-8') as f: file_content = f.read() except FileNotFoundError: print(f"错误:找不到文件 {filename}") exit() # 执行加密操作 encrypted_content = [] for char in file_content: original_ascii = ord(char) # 仅处理可打印ASCII字符,其他字符保持原样 if 1 <= original_ascii <= 127: encrypted_ascii = encrypt_dict[original_ascii] encrypted_content.append(chr(encrypted_ascii)) else: encrypted_content.append(char) # 保存加密后的文件(避免覆盖原文件) output_filename = f"encrypted_{filename}" with open(output_filename, 'w', encoding='utf-8') as f: f.write(''.join(encrypted_content)) print(f"加密完成,已保存到文件: {output_filename}")
关键改动说明
- 修复密钥生成:将
if语句缩进至while循环内部,确保生成1-127的随机全排列映射 - 统一文件读取:用
with open结合用户输入路径读取文件,添加异常处理避免文件不存在报错 - 实现加密逻辑:遍历文件每个字符,通过密钥字典将原ASCII值替换为随机生成的对应值,再转回字符
- 优化文件保存:生成带前缀的输出文件名,避免覆盖原文件
- 指定编码格式:打开文件时指定
encoding='utf-8',兼容中文等非ASCII字符的读写
内容的提问来源于stack exchange,提问作者Addapp
相关产品推荐
相关产品推荐

