教你用python实现一个加密的文字处理器

这是一个类似于记事本的文字处理器。与正常的记事本不同的是,它会将文本文档进行加密,确保无法被常规的程序打开。

由于本人是一位业余编程爱好者,对于“python之禅”之类的规则比较不以为然,因此本程序代码也许有些许凌乱(当然不利于后期修改)。

这篇文章我早已发布过,但当时只给出了代码,并加了一些注释。现在,我希望在这里详细解释这个程序。我会分一个月或更久更新这篇文章,请读者耐心等待。

首先,对于一个适合我们广大中华儿女使用的程序,我们不可避免地要使用中文。这就需要对编码进行声明:

# coding:utf-8

然后,就到了模块导入的环节了。我们这里需要tkinter,windnd,os和sys。windnd可以用pip安装,tkinter则需要在安装python时勾选:

from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import windnd
import os
import sys

接下来,我们会看到这样一段代码:

try:
    filename = sys.argv[1]
except:
    filename = ""

这是干什么的呢?我们知道,对于exe程序,有一个“Open with”功能,也就是可以将拖动到exe文件或其快捷方式的文件打开。事实上,py文件也有这个功能,但是多数情况下这样操作后只能使程序正常运行,而不能对文件进行任何操作。而“sys.argv[1]”的作用就是,读取这个文件的路径信息。这样,我们就可以用open或sys库里的一些指令进行对文件的操作了。

def encryption(c, d):
    c = list(c + d)
    g=list(d)
    d=0
    for i in g:
        d*=ord(i)
        d=round(abs(d)**0.5)
    f="0x"
    for i in c:
        e=str(ord(i)+d)
        d=round(300*(d**0.5))
        f=f+e+"a"
    f=eval(f[:-1])
    return (f)
def decrypt(c,d):
    c=hex(int(c))
    print(c)
    c=c[2:].split("a")
    z=d
    g = list(d)
    d = 0
    for i in g:
        d *= ord(i)
        d = round(abs(d) ** 0.5)
    f=""
    for i in c:
        e = chr(int(i)-d)
        d = round(300 * (d ** 0.5))
        f = f + e
    if f[-len(z):]==z:
        f=f[:-len(z)]
        return (f)
    else:
        c="bbc"+12

这一段就比较劲爆了。它定义了两个函数,一个用于加密,另外一个用于解密(顺便说一句,我英语不太好,有的函数或变量的名字可能比较古怪,请见谅)。

encryption是加密的函数(呃,这个应该叫做encrypt,我编这个程序时大脑有些短路,但既然已经这样了,也就不改了),它会将明文(输入的c)通过与密钥d有关的某些运算,得出一个十六进制数,然后将其转化为十进制。同时,为了确保解密结果唯一,将密钥一起连接在明文上,起校验作用。在这里,对于明文的每一个字符都会将加密过程中实际使用的密钥进行变动,因此基本是不可能通过字符出现频率的规律来破解的。由于密钥是字符,暴力拆解也基本不可能。

decrypt是解密,它大致就是encryption的逆操作,同时如果校验的结果有误,或是遇到其他解密失败的情况它会产生错误(因此使用时需要try-except,来确保程序不会退出,同时对解密失败的情况进行处理)。

接下来是基本的文件操作部分:

def mynew(aaa=1):
    global top, filename, textPad
    top.title("无标题 - 加密文本编辑器")
    filename = None
    textPad.delete(1.0, END)
    textPad.insert(1.0, "")
def myopen(aaa=1):
    global filename,kkk
    filename = askopenfilename()
    if filename == "":
        filename = None
    else:
        top.title(os.path.basename(filename)+" - 加密文本编辑器")
        format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:]
        textPad.delete(1.0, END)
        try:
            f = open(filename, 'rb')
            c = f.read()
            ccc = str(c)[2:-1]
            ccc.replace("\\","")
            textPad.insert(1.0,decrypt(ccc,format))
            kkk=1
        except:
            f.close()
            try:
                f = open(filename, 'r', encoding="gbk")
                try:
                    c = f.read()
                except:
                    f.close()
                    f = open(filename, 'r', encoding="utf-8")
                    c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
            except:
                f.close()
                f = open(filename, 'rb')
                c = f.read()
                textPad.insert(1.0, c)
                kkk=0
        f.close()
def mysave(aaa=1):
    global filename,kkk
    try:
        msg = textPad.get(1.0, 'end')[0:-1]
        if kkk==0:
            f = open(filename, 'w', encoding="utf-8")
            f.write(msg)
        else:
            f = open(filename, 'wb')
            fffff = str(encryption(msg, format))
            fffff = eval("b'{}'".format(fffff))
            print(fffff)
            f.write(fffff)
        f.close()
    except:
        mysaveas()

def mysaveas(aaa=1):
    global filename
    f = asksaveasfilename(initialfile="无标题.txt")
    filename = f
    format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:]
    msg = textPad.get(1.0, 'end')[0:-1]
    if not format == "py" and not format=="bat" and not format == "pyw"and not format == "cmd":
        fh = open(filename, 'wb')
        fffff = str(encryption(msg, format))
        fffff = eval("b'{}'".format(fffff))
        print(fffff)
        fh.write(fffff)
    else:
        fh = open(filename, 'w', encoding="utf-8")
        fh.write(msg)
    fh.close()
    top.title(os.path.basename(f)+" - 加密文本编辑器")
def opened(files):
    global filename,kkk
    ff = '\n'.join((item.decode('gbk') for item in files))
    filename = ff
    if filename == "":
        filename = None
    else:
        top.title(os.path.basename(filename) + " - 加密文本编辑器")
        format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:]
        textPad.delete(1.0, END)
        try:
            f = open(filename, 'rb')
            c = f.read()
            ccc = str(c)[2:-1]
            ccc.replace("\\", "")
            textPad.insert(1.0, decrypt(ccc, format))
            kkk = 1
        except:
            f.close()
            try:
                f = open(filename, 'r', encoding="gbk")
                try:
                    c = f.read()
                except:
                    f.close()
                    f = open(filename, 'r', encoding="utf-8")
                    c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
            except:
                f.close()
                f = open(filename, 'rb')
                c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
        f.close()
def mynew(aaa=1):
    global top, filename, textPad
    top.title("无标题 - 加密文本编辑器")
    filename = None
    textPad.delete(1.0, END)
    textPad.insert(1.0, "")

首先说mynew。这里有一个可选参数a,这是因为通过bind激活函数会输入一个参数(这点我非常反感),为了不让程序运行出错,就添加了一个可选参数。这个其实没啥好说。global后面是所需的全局变量,然后就是设置窗口名称、文件名称,并清空输入框,很简单,很明了。

def myopen(aaa=1):
    global filename,kkk
    filename = askopenfilename()
    if filename == "":
        filename = None
    else:
        top.title(os.path.basename(filename)+" - 加密文本编辑器")
        format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:]
        textPad.delete(1.0, END)
        try:
            f = open(filename, 'rb')
            c = f.read()
            ccc = str(c)[2:-1]
            ccc.replace("\\","")
            textPad.insert(1.0,decrypt(ccc,format))
            kkk=1
        except:
            f.close()
            try:
                f = open(filename, 'r', encoding="gbk")
                try:
                    c = f.read()
                except:
                    f.close()
                    f = open(filename, 'r', encoding="utf-8")
                    c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
            except:
                f.close()
                f = open(filename, 'rb')
                c = f.read()
                textPad.insert(1.0, c)
                kkk=0
        f.close()

然后就是myopen。“filename=askopenfilename()”就是,弹出一个选择打开的文件的窗口,并将结果存入filename。然后我们获取文件的后缀信息,作为解密所需的密钥。接下来,我们先尝试解密文件。如果执行中有错误,也就是无法解密,则用gbk编码正常打开,仍然打开失败,则使用utf-8。当然,如果都失败了,就用rb模式,也就是字节流的形式打开。

啊,越讲越上头,超过了我预期的篇幅……好了,现在先讲到这里,等待下一次更新吧(本人初二,因此接触电脑机会不多,更新嘛,自然是比较慢的。耐心等待!耐心等待!!!)!

完整的代码:

# coding:utf-8

from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import windnd
import os
import sys

kkk=1
try:
    filename = sys.argv[1]
except:
    filename = ""

def encryption(c, d):
    c = list(c + d)
    g=list(d)
    d=0
    for i in g:
        d*=ord(i)
        d=round(abs(d)**0.5)
    f="0x"
    for i in c:
        e=str(ord(i)+d)
        d=round(300*(d**0.5))
        f=f+e+"a"
    f=eval(f[:-1])
    return (f)
def decrypt(c,d):
    c=hex(int(c))
    print(c)
    c=c[2:].split("a")
    z=d
    g = list(d)
    d = 0
    for i in g:
        d *= ord(i)
        d = round(abs(d) ** 0.5)
    f=""
    for i in c:
        e = chr(int(i)-d)
        d = round(300 * (d ** 0.5))
        f = f + e
    if f[-len(z):]==z:
        f=f[:-len(z)]
        return (f)
    else:
        c="bbc"+12
def mynew(aaa=1):
    global top, filename, textPad
    top.title("无标题 - 加密文本编辑器")
    filename = None
    textPad.delete(1.0, END)
    textPad.insert(1.0, "")
def myopen(aaa=1):
    global filename,kkk
    filename = askopenfilename()
    if filename == "":
        filename = None
    else:
        top.title(os.path.basename(filename)+" - 加密文本编辑器")
        format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:]
        textPad.delete(1.0, END)
        try:
            f = open(filename, 'rb')
            c = f.read()
            ccc = str(c)[2:-1]
            ccc.replace("\\","")
            textPad.insert(1.0,decrypt(ccc,format))
            kkk=1
        except:
            f.close()
            try:
                f = open(filename, 'r', encoding="gbk")
                try:
                    c = f.read()
                except:
                    f.close()
                    f = open(filename, 'r', encoding="utf-8")
                    c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
            except:
                f.close()
                f = open(filename, 'rb')
                c = f.read()
                textPad.insert(1.0, c)
                kkk=0
        f.close()
def mysave(aaa=1):
    global filename,kkk
    try:
        msg = textPad.get(1.0, 'end')[0:-1]
        if kkk==0:
            f = open(filename, 'w', encoding="utf-8")
            f.write(msg)
        else:
            f = open(filename, 'wb')
            fffff = str(encryption(msg, format))
            fffff = eval("b'{}'".format(fffff))
            print(fffff)
            f.write(fffff)
        f.close()
    except:
        mysaveas()

def mysaveas(aaa=1):
    global filename
    f = asksaveasfilename(initialfile="无标题.txt")
    filename = f
    format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:]
    msg = textPad.get(1.0, 'end')[0:-1]
    if not format == "py" and not format=="bat" and not format == "pyw"and not format == "cmd":
        fh = open(filename, 'wb')
        fffff = str(encryption(msg, format))
        fffff = eval("b'{}'".format(fffff))
        print(fffff)
        fh.write(fffff)
    else:
        fh = open(filename, 'w', encoding="utf-8")
        fh.write(msg)
    fh.close()
    top.title(os.path.basename(f)+" - 加密文本编辑器")
def opened(files):
    global filename,kkk
    ff = '\n'.join((item.decode('gbk') for item in files))
    filename = ff
    if filename == "":
        filename = None
    else:
        top.title(os.path.basename(filename) + " - 加密文本编辑器")
        format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:]
        textPad.delete(1.0, END)
        try:
            f = open(filename, 'rb')
            c = f.read()
            ccc = str(c)[2:-1]
            ccc.replace("\\", "")
            textPad.insert(1.0, decrypt(ccc, format))
            kkk = 1
        except:
            f.close()
            try:
                f = open(filename, 'r', encoding="gbk")
                try:
                    c = f.read()
                except:
                    f.close()
                    f = open(filename, 'r', encoding="utf-8")
                    c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
            except:
                f.close()
                f = open(filename, 'rb')
                c = f.read()
                textPad.insert(1.0, c)
                kkk = 0
        f.close()

top = Tk()
top.title("无标题 - 加密文本编辑器")
top.geometry("1000x600+100+50")
menubar = Menu(top)
menubar.add_command(label="新建", command=mynew)
menubar.add_command(label="打开", command=myopen)
menubar.add_command(label="保存",  command=mysave)
menubar.add_command(label="另存为", command=mysaveas)
menu = Menu(top, tearoff=False)
menu.add_command(label="新建", accelerator="Ctrl+N", command=mynew)
menu.add_command(label="打开", accelerator="Ctrl+O", command=myopen)
menu.add_command(label="保存", accelerator="Ctrl+S",  command=mysave)
menu.add_command(label="另存为", accelerator="Ctrl+Shift+S", command=mysaveas)
def command(event):
    menu.post(event.x_root, event.y_root)
top['menu'] = menubar
all=Frame(top)
all.pack(expand=YES, fill=BOTH)
textPad = Text(all,font=('宋体', 14), undo=True)
if filename == "":
    filename = None
    textPad.insert(1.0, "")
else:
    top.title(os.path.basename(filename) + " - 加密文本编辑器")
    format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:]
    textPad.delete(1.0, END)
    try:
        f = open(filename, 'rb')
        c = f.read()
        ccc = str(c)[2:-1]
        ccc.replace("\\", "")
        textPad.insert(1.0, decrypt(ccc, format))
        kkk = 1
    except:
        f.close()
        try:
            f = open(filename, 'r', encoding="gbk")
            try:
                c = f.read()
            except:
                f.close()
                f = open(filename, 'r', encoding="utf-8")
                c = f.read()
            textPad.insert(1.0, c)
            kkk = 0
        except:
            f.close()
            f = open(filename, 'rb')
            c = f.read()
            textPad.insert(1.0, c)
            kkk = 0
    f.close()
scroll = Scrollbar(all)
textPad.config(yscrollcommand=scroll.set)
scroll.config(command=textPad.yview)
scroll.pack(side=RIGHT, fill=Y)
textPad.pack(expand=YES,side=RIGHT,fill=BOTH)
top.bind("<Control-N>", mynew)
top.bind("<Control-n>", mynew)
top.bind("<Control-O>", myopen)
top.bind("<Control-o>", myopen)
top.bind("<Control-S>", mysave)
top.bind("<Control-s>", mysave)
top.bind("<Control-Shift-S>", mysaveas)
top.bind("<Control-Shift-s>", mysaveas)
top.bind("<Button-3>", command)
windnd.hook_dropfiles(top,func=opened)
top.mainloop()

总结

到此这篇关于用python实现一个加密文字处理器的文章就介绍到这了,更多相关python加密文字处理器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python文字和unicode/ascll相互转换函数及简单加密解密实现代码

    这篇文章主要介绍了python文字和unicode/ascll相互转换函数及简单加密解密实现代码,下面我们来了解一下. import re import random # ord() 它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值 # chr() 是见数字变成汉字 #函数功能:将输入的字符串加密 #加密方式,将字变成Unicode 数值,然后加上一个随机数,然后再变成汉字,再在汉字后面加上这个数字,组成加密后的密文 #返回值:加密后的密文 #

  • 基于python实现文件加密功能

    这篇文章主要介绍了基于python实现文件加密功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力. 基础知识 在 Python 中异或操作符为:^,也可以记作 XOR.按位异或的意思是:相同值异或为 0,不同值异或为 1.具体来

  • 如何用Python 加密文件

    生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力. 基础知识 在 Python 中异或操作符为:^,也可以记作 XOR.按位异或的意思是:相同值异或为 0,不同值异或为 1.具体来讲,有四种可能:0 ^ 0 = 0,0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0.我们还可总结出规律(A 为 0 或 1):0 和

  • python实现对输入的密文加密

    本文实例为大家分享了python实现对输入的密文加密的具体代码,供大家参考,具体内容如下 遇到这样一道题目,是要求把输入的明文进行加密,加密的方法是按照一定的转换规则进行相应的替换得到最终的密文 转换规则为: 把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换 密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,就是y了 下面是具体实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城

  • 教你用python实现一个加密的文字处理器

    这是一个类似于记事本的文字处理器.与正常的记事本不同的是,它会将文本文档进行加密,确保无法被常规的程序打开. 由于本人是一位业余编程爱好者,对于“python之禅”之类的规则比较不以为然,因此本程序代码也许有些许凌乱(当然不利于后期修改). 这篇文章我早已发布过,但当时只给出了代码,并加了一些注释.现在,我希望在这里详细解释这个程序.我会分一个月或更久更新这篇文章,请读者耐心等待. 首先,对于一个适合我们广大中华儿女使用的程序,我们不可避免地要使用中文.这就需要对编码进行声明: # coding

  • 教你使用Python实现一个简易版Web服务器

    目录 一.简介 二.Web服务器基础概念 三.Python网络编程库 四.实现简易Web服务器 1.使用socket库创建服务器套接字. 2.绑定服务器IP地址和端口. 3.监听客户端连接. 4.接受客户端连接并处理请求. 五.处理HTTP请求 六.返回静态文件 1.根据请求URL读取文件内容. 2.根据文件内容构建HTTP响应. 七.测试与优化 八.总结及拓展 九.补充:多线程处理客户端请求 一.修改处理客户端请求的函数 二.使用多线程处理客户端请求 三.完整的多线程Web服务器代码 一.简介

  • 教你用Python写一个植物大战僵尸小游戏

    一.前言 上次写了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧 二.引入模块 import pygame import random 三.完整代码 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_height = 560 创建控制游戏结束的状态 GAMEOVER = False 图片加载报错处理 LOG = '文件:{}中的方法:{}出错'.format(__file__, __name__) 创建地图类

  • 教你用Python实现一个轮盘抽奖小游戏

    一.Python GUI 编程简介 Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里.Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中. wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的.功能健全的 GUI 用户界面. pyq

  • 教你用python实现一个无界面的小型图书管理系统

    一.需求了解 功能模块 图书信息 二.环境准备 安装mysql数据库 参考文章: MySQL数据库压缩版本安装与配置 MySQL msi版本下载安装图文教程 创建数据库表 创建数据库 CREATE DATABASE bookmanage; 使用数据库 use bookmanage; 创建表 create table books( id int unsigned primary key auto_increment not null, name varchar(20) default ""

  • 教你使用python搭建一个QQ机器人实现叫起床服务

    目录 前言 具体实现 1.定时发送信息 2.让机器人陪女朋友聊天 3.调用一些有趣的接口 前言 上一篇文章介绍了怎么配置机器人框架,并且实现了一些简单的功能. (发送私聊或者群聊信息.接收上报的事件.简单的自动回复等等) 这次为了让QQ机器人更加智能,调用了一些实用的接口. 通过自己搭建的机器人实现定时叫女朋友起床.和女朋友聊天等功能. 如上图所示,我的机器人每天都会准时叫女朋友起床:并且在我忙的时候然而女朋友无聊的时候可以陪她聊一会天. 具体实现 以下实现的功能都需要机器人已经配置完成,并且已

  • 教你用Python写一个水果忍者小游戏

    目录 引言 一.需要导入的包 二.窗口界面设置 三.随机生成水果位置 四.绘制字体 五.玩家生命的提示 六.游戏开始与结束的画面 七.游戏主循环 总结 引言 水果忍者的玩法很简单,尽可能的切开抛出的水果就行. 今天小五就用python简单的模拟一下这个游戏.在这个简单的项目中,我们用鼠标选择水果来切割,同时炸弹也会隐藏在水果中,如果切开了三次炸弹,玩家就会失败. 一.需要导入的包 import pygame, sys import os import random 二.窗口界面设置 # 游戏窗口

  • 教你使用python做一个“罚点球”小游戏

    在学习了一点 Python 基础之后,我们可以做一个罚点球的小游戏,大概流程是这样: 每一轮,你先输入一个方向射门,然后电脑随机判断一个方向扑救.方向不同则算进球得分,方向相同算扑救成功,不得分. 之后攻守轮换,你选择一个方向扑救,电脑随机方向射门. 第5轮结束之后,如果得分不同,比赛结束. 5轮之内,如果一方即使踢进剩下所有球,也无法达到另一方当前得分,比赛结束. 5论之后平分,比赛继续进行,直到某一轮分出胜负. 实现方法有很多种,我这里提供的只是一种参考.你可以按照自己喜欢的方式去做,那样才

  • 手把手教你利用Python创建一个游戏窗口

    目录 前言 安装Pyagme 检查是否安装Pygame:  一 (检查python是否配置环境变量) 检查是否安装Pygame:  二 (检查pygame是否安装) 未安装Pygame : 一 (检查是否安装pip) 未安装Pygame : 二 (利用pip安装Pygame) 步入正题: 利用Pygame制作一个简单的游戏窗口 总结: 前言 想要利用Python创建一个游戏窗口就需要用到一个强大的第三方功能库: Pygame 那么既然需要用到Pygame这个第三方库 所以在写程序之前需要做一个准

  • 一篇文章教你用Python实现一个学生管理系统

    目录 片头 源码: 总结 片头 Python看了差不多三四天吧,基本上给基础看差不多了.写个管理系统吧,后续不出意外SQL.文件存储版本都会更. 学习Python感想: 人生苦短,我用Python 人生苦短,我用Python 人生苦短,我用Python 人生苦短,我用Python Python实在太爽了 源码: 使用Python3 ''' 学生成绩管理系统 时间:2021.9.9 作者:sunbeam ''' import time import os student_list = [] #定义

随机推荐