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

Python加密解密库函数返回None及空格丢失问题求助

问题描述

我正在开发一款支持文本字符串加密与解密的Python库:加密逻辑为将字符替换为密钥中对应的字符串;解密逻辑为将特定字符串替换为密钥中对应的字符。但目前遇到两个问题:

  1. 调用库内除generate_random_key外的所有函数时,均返回None
  2. 加密函数会丢失输入字符串中的空格

以下是我的代码:

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"


问题原因
  1. 无显式返回值:encrypt和decrypt函数内部虽计算出结果,但外层函数未返回该值,Python默认返回None;且encrypt函数甚至未调用核心逻辑cycle(),直接返回空值。
  2. 递归逻辑缺陷:cycle用递归实现字符匹配,递归层级的结果无法传递回外层函数,导致最终无有效返回。
  3. 全局变量滥用:大量全局变量导致逻辑混乱,结果传递路径不清晰。
  4. 空格处理隐患:原逻辑中递归匹配空格时,结果未被正确传递,且全局变量的复用可能导致空格被覆盖。

修复方案

核心修改点

  • 移除递归,改用循环实现字符匹配,简化逻辑
  • 用字典映射替代循环匹配,提升效率
  • 确保所有函数显式返回处理结果
  • 优化类结构,使用静态方法规范调用方式
  • 提前初始化字符集和模块导入,避免重复计算

修复后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:24:52