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

由于本人是一位业余编程爱好者,对于“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实现一个加密的文字处理器的更多相关文章

  1. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  2. Word文字处理器发展演变

    随着信息技术的不断发展,以前书面化的信笺,笔记,书籍以及作业演变成现在不断更新的电子化Word文档. Word是目前世界上最流行.最常用的文字编辑,排版软件,使用它不仅可以提高文档的编辑效率,在修改时 ...

  3. Python的RSA加密和PBE加密

    最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现. 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是P ...

  4. 用python做一个搜索引擎(Pylucene)

    什么是搜索引擎? 搜索引擎是“对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分”.如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般 ...

  5. 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)

    打开图形界面  18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...

  6. vi文字处理器

    http://blog.csdn.net/wangloveall/article/details/22649331 摘要:vi是类UNIX命令行接口的标准文字处理软件,也是进行shell脚本程序编写与 ...

  7. python下RSA加密解密以及跨平台问题

    Reference:  http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...

  8. Python 约束 , 自定义异常 , 加密 , 日志

    约束 约束 , 约束其派生类:  保证派生类中必须编写send方法 , 不然执行可能就会报错 Python中  语法: class BaseMessage(object): def send(self ...

  9. python常见的加密方式

    1.前言 我们所说的加密方式都是对二进制编码的格式进行加密,对应到python中,则是我妈们的bytes. 所以当我们在Python中进行加密操作的时候,要确保我们的操作是bytes,否则就会报错. ...

随机推荐

  1. php实验一 html网页设计

    页面展示: 源码demo: 等我传到github

  2. java中请给一个Abstract类实现接口的实例!

    2.Abstract类实现接口 马克-to-win:如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法.但其非abstract的子类中必须拥有所有抽象方法的实在的方法体:(当然它a ...

  3. 如何写好一份晋升PPT(附PPT模板)

    又到了每年晋升述职的时间,在过去的5.6年里,我以评委身份参与了大量的晋升述职(主要是前端,也包括客户端和测试),也辅导了许多(100+)组内外的同学,指导他们书写和完善PPT.过程中我发现大家有许多 ...

  4. InnoDB两次写

    partial page write问题: 默认情况下,innodb的一个页面时16k大小,其数据校验也是针对这16k来校验的,将数据写入磁盘是以页面为单位的.文件系统是以4k为单位写入的,机械磁盘是 ...

  5. UnrealEngine创建自定义资产类型

    导语 这篇文章记录了将UObject实例保存在Asset文件的方法,用这个方法可以将自定义的UObject数据序列化保存到文件,可以用于自定义UE资源类型. 创建UObject类 这一步比较简单,按照 ...

  6. python基础练习题(题目 斐波那契数列II)

    day16 --------------------------------------------------------------- 实例024:斐波那契数列II 题目 有一分数序列:2/1,3 ...

  7. JavaWeb和WebGIS学习笔记(四)——使用uDig美化地图,并叠加显示多个图层

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  8. TF-IDF笔记(直接调用函数、手写)

    首先TF-IDF 全称:term frequency–inverse document frequency,是一种用于信息检索与数据挖掘的常用加权技术. TF是词频(Term Frequency),I ...

  9. Oracle 定时任务增删改查

    创建 -- 创建定时任务 DECLARE jobno NUMBER; BEGIN dbms_job.submit ( jobno, -- 定时器ID,系统自动获得 'PRC_INSERT;', -- ...

  10. LintCode-165 · 合并两个排序链表-题解

    描述:将两个排序(升序)链表合并为一个新的升序排序链表样例 1:输入: list1 = null, list2 = 0->3->3->null输出: 0->3->3-&g ...