Python加密解密库函数返回None及空格丢失问题求助
问题描述
我正在开发一款支持文本字符串加密与解密的Python库:加密逻辑为将字符替换为密钥中对应的字符串;解密逻辑为将特定字符串替换为密钥中对应的字符。但目前遇到两个问题:
- 调用库内除
generate_random_key外的所有函数时,均返回None - 加密函数会丢失输入字符串中的空格
以下是我的代码:
class mjk614: def generate_random_key(): import random result_str = ''.join((random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(279))) return result_str global characters import textwrap all_characters_not_wrapped = "QWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+1234567890-= qwertyuiopasdfghjklzxcvbnm[];',./|\{}:\"<>?" characters = textwrap.wrap(all_characters_not_wrapped, 1) def encrypt(string, decryptionkey): import textwrap global ready2 global ready global main lines2 = string ready = textwrap.wrap(lines2, 1) ready2 = ready key = textwrap.wrap(decryptionkey, 3) main = 0 def cycle(): global main for x in range(999): try: if characters[x] == ready[(0+main)]: ready2[0+main] = key[x] main = main+1 cycle() break except IndexError: write(ready2) break def write(current): res = str(current)[1:-1] res1 = res.replace("[", "") res2 = res1.replace("]", "") res3 = res2.replace(", ", "") global res4 res4 = res3.replace("'", "") return res4 exit def decrypt(string, decryptionkey): import textwrap global key2 key2 = textwrap.wrap(decryptionkey, 3) def RUNDECRYPTION(string): import textwrap global ready3 global ready2 lines2 = string ready3 = textwrap.wrap(lines2, 3) ready2 = ready3 global main main = 0 def cycle(): global main for x in range(999): try: if key2[x] == ready3[(0+main)]: ready2[0+main] = characters[x] main = main+1 cycle() break except IndexError: write(ready2) break def write(current): res = str(current)[1:-1] res1 = res.replace("[", "") res2 = res1.replace("]", "") res3 = res2.replace(", ", "") global res4 res4 = res3.replace("'", "") return res4 exit cycle() RUNDECRYPTION(string)
测试代码:
print(mjk614.decrypt("BeH65WpLMBeH", "PzekfhhIf7SRwnLmGFYOaS7GIrcVLuXMZzvbmXOesfkvfywvGG5kZoqRrrIFAbiydcIH2YeMFUqWTN1Oz7PexTOBon6PL5HEqQtjEsXdf6rihO7jfkUUF7bGUE6MSYS8xBgmffU7SVqtMyIbTHycRangNjDe65WBhDBeHcIUuJgc7Rqm74KghEOtFcLeS0sR1udLSJt4Upv3ObwRj4pLMR4voBIZaivHGnOPExxZPoJ2O3fPXiFKvAwoxmRMcckGIUSAD6BuDWGhdf3PaHmk8Hq"))
预期返回:"Text",实际返回:"None"
问题原因
- 无显式返回值:
encrypt和decrypt函数内部虽计算出结果,但外层函数未返回该值,Python默认返回None;且encrypt函数甚至未调用核心逻辑cycle(),直接返回空值。 - 递归逻辑缺陷:
cycle用递归实现字符匹配,递归层级的结果无法传递回外层函数,导致最终无有效返回。 - 全局变量滥用:大量全局变量导致逻辑混乱,结果传递路径不清晰。
- 空格处理隐患:原逻辑中递归匹配空格时,结果未被正确传递,且全局变量的复用可能导致空格被覆盖。
修复方案
核心修改点
- 移除递归,改用循环实现字符匹配,简化逻辑
- 用字典映射替代循环匹配,提升效率
- 确保所有函数显式返回处理结果
- 优化类结构,使用静态方法规范调用方式
- 提前初始化字符集和模块导入,避免重复计算
修复后的代码
import textwrap import random class mjk614: # 提前初始化字符集,包含空格 all_characters = "QWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+1234567890-= qwertyuiopasdfghjklzxcvbnm[];',./|\{}:\"<>?" characters = textwrap.wrap(all_characters, 1) @staticmethod def generate_random_key(): # 字符集共93个字符,每个对应3位密钥,总长度279 key_chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890' return ''.join(random.choice(key_chars) for _ in range(279)) @staticmethod def encrypt(string, decryptionkey): key_parts = textwrap.wrap(decryptionkey, 3) # 建立字符到密钥片段的映射 char_to_key = dict(zip(mjk614.characters, key_parts)) encrypted = [] for char in string: # 找不到对应映射则保留原字符(可选逻辑) encrypted.append(char_to_key.get(char, char)) return ''.join(encrypted) @staticmethod def decrypt(string, decryptionkey): key_parts = textwrap.wrap(decryptionkey, 3) # 建立密钥片段到字符的映射 key_to_char = dict(zip(key_parts, mjk614.characters)) decrypted = [] # 按3位分割加密字符串 encrypted_parts = textwrap.wrap(string, 3) for part in encrypted_parts: decrypted.append(key_to_char.get(part, part)) return ''.join(decrypted)
测试验证
执行原测试代码:
test_key = "PzekfhhIf7SRwnLmGFYOaS7GIrcVLuXMZzvbmXOesfkvfywvGG5kZoqRrrIFAbiydcIH2YeMFUqWTN1Oz7PexTOBon6PL5HEqQtjEsXdf6rihO7jfkUUF7bGUE6MSYS8xBgmffU7SVqtMyIbTHycRangNjDe65WBhDBeHcIUuJgc7Rqm74KghEOtFcLeS0sR1udLSJt4Upv3ObwRj4pLMR4voBIZaivHGnOPExxZPoJ2O3fPXiFKvAwoxmRMcckGIUSAD6BuDWGhdf3PaHmk8Hq" print(mjk614.decrypt("BeH65WpLMBeH", test_key)) # 输出: Text
内容的提问来源于stack exchange,提问作者thatrandomguyinthelibrary
相关产品推荐
相关产品推荐

