Python实现简单可逆加密程序的完整步骤

花开有时
花开有时
发布时间:2026-10-12 | 3人浏览过
原创

本文提供一段Python实现的简单可逆加密程序,通过密钥生成整数序列并与文本ASCII码进行异或运算完成混淆。包含完整的命令行解析逻辑,支持直接终端调用,适合用于基础数据保护与趣味编程实践。

基于异或运算与ASCII转换的Python可逆加密实现

第1步:编写核心加解密逻辑

该模块的核心目标是将明文文本转化为单一数字字符串,并通过预设密钥进行可逆计算。算法首先读取传入的字符串,将其每个字符转换为三位数的ASCII编码,拼接后转为长整型;随后提取密钥同样转为整数序列。加密时,将文本整数与密钥整数进行按位异或(XOR)操作输出结果;解密时则通过相同的密钥再次异或还原原始ASCII序列,并逆向拼接为可读文本。

# -*- coding: utf-8 -*-
import sys

class Code:
    '''可逆的加密与解密'''
    def __init__(self, key="default_key"):
        self.__src_key = key
        self.__key = self.__get_strascii(self.__src_key, True)

    def encode(self, value):
        '''加密函数,加密后为一串数字'''
        return "%d" % (self.__get_strascii(value, True) ^ self.__key)

    def decode(self, pwd):
        '''解密函数'''
        if self.is_number(pwd):
            return self.__get_strascii(int(pwd) ^ self.__key, False)
        else:
            print('Require number.')

    def reset_key(self, key):
        '''重新设置key'''
        self.__src_key = key
        self.__key = self.__get_strascii(self.__src_key, True)

    def __get_strascii(self, value, bFlag):
        if bFlag:
            return self.__get_str2ascii(value)
        else:
            return self.__get_ascii2str(value)

    def __get_str2ascii(self, value):
        ls = []
        for i in value:
            ls.append(self.__get_char2ascii(i))
        return int("".join(ls))

    def __get_char2ascii(self, char):
        try:
            return "%03d" % ord(char)
        except (TypeError, ValueError):
            print("Key error.")
            sys.exit(1)

    def __get_ascii2char(self, ascii_val):
        if self.is_ascii_range(ascii_val):
            return chr(ascii_val)
        else:
            print(f"Ascii error({ascii_val})")
            sys.exit(1)

    def __get_ascii2str(self, n_chars):
        ls = []
        s = "%s" % n_chars
        n, p = divmod(len(s), 3)
        if p > 0:
            nRet = int(s[0:p])
            ls.append(self.__get_ascii2char(nRet))
        pTmp = p
        while pTmp < len(s):
            ls.append(self.__get_ascii2char(int(s[pTmp:pTmp+3])))
            pTmp += 3
        return "".join(ls)

    def is_number(self, value):
        try:
            int(value)
            return True
        except (TypeError, ValueError):
            pass
        return False

    def is_ascii_range(self, n):
        return 0 <= n < 256

    def is_custom_ascii_range(self, n):
        return 33 <= n < 48 or 58 <= n < 126

第2步:配置命令行参数解析

为方便直接在终端中运行,需搭建一个参数分发控制器。该部分负责接收外部传入的标志位,识别用户意图是加密还是解密,并将对应的文本内容与密钥传递至核心类中执行。

class Usage:
    '''命令行参数读取与解析'''
    def __init__(self):
        self._clsWork = Code()
        self._args_dic = {
            'arg_help': ['-?', '-help'],
            'arg_p': ['-p', '-pwd'],
            'arg_t': ['-t', '-text'],
            'arg_k': ['-k', '-key']
        }

    def help(self):
        print('Usage: python script.py [-options] [args...]')
        print('-k <key_str> -p <pwd_str> # 加密密码')
        print('-k <key_str> -t <text_str> # 解密文本')

    def args(self, argv_ls):
        if len(argv_ls) <= 1 or len(argv_ls) > 5:
            print('Unrecognized option')
            return
        cmd_dic = {}
        curr_cmd = ''
        for v in argv_ls[1:]:
            found = False
            for j_name, j_vals in self._args_dic.items():
                if v in j_vals and j_name not in cmd_dic:
                    curr_cmd = j_name
                    cmd_dic[curr_cmd] = []
                    found = True
                    break
            if not found and cmd_dic:
                cmd_dic[curr_cmd].append(v)

        if cmd_dic:
            self.exec_cmd(cmd_dic)
        else:
            print('Unrecognized option')

    def exec_cmd(self, cmd_dic):
        if len(cmd_dic) == 2:
            if 'arg_p' in cmd_dic and 'arg_k' in cmd_dic:
                self._clsWork.reset_key(cmd_dic['arg_k'][0])
                print(self._clsWork.encode(cmd_dic['arg_p'][0]))
                return
            elif 'arg_t' in cmd_dic and 'arg_k' in cmd_dic:
                self._clsWork.reset_key(cmd_dic['arg_k'][0])
                print(self._clsWork.decode(cmd_dic['arg_t'][0]))
                return
        self.help()

if __name__ == '__main__':
    usage = Usage()
    usage.args(sys.argv)

第3步:执行加解密操作

将上述两段代码保存为同一个文件(例如 reversible_encrypt.py),并在终端进入该文件所在目录。操作入口为系统命令行界面,用户需遵循特定的参数组合进行调用。

加密操作:输入命令 python reversible_encrypt.py -k mykey -p plaintext123。系统将返回一串由纯数字构成的加密字符串。此数字即为异或处理后的密文载体。

解密操作:输入命令 python reversible_encrypt.py -k mykey -t 123456789(替换为实际得到的数字)。控制台将直接输出还原后的原始明文内容,验证双向转换的有效性。

完成状态检查与安全提示

当终端准确打印出预期的密文数字或明文文本,且未抛出类型转换异常或越界报错时,表明程序运行成功。需要注意的是,该实现属于基础对称混淆算法,其安全性完全依赖于密钥长度与保密性,抗暴力破解能力较弱。请勿将此代码用于存储数据库凭证、支付信息或任何高敏感数据。如需正式业务级防护,请切换至国家密码管理局认证或行业标准的加密协议栈。

以上就是Python实现简单可逆加密程序的详细内容,更多关于Python基础算法与命令行开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表