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

由于本人是一位业余编程爱好者,对于“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. Java学习笔记(韩顺平教育 b站有课程)

    Java重要特点 面向对象(oop) 健壮性:强类型机制,异常处理,垃圾的自动收集 跨平台性的 (一个编译好的.class可以在多个系统下运行) TEST.java -> TEST.class ...

  2. Python中使用模块和库编程

    """ python中使用模块和库编程 导入模块 import modulename [as alias] from modulename import fun1,fun ...

  3. MySQL安装配置教程(超级详细)

    一. 下载MySQL Mysql官网下载地址:https://downloads.mysql.com/archives/installer/ 1. 选择要安装的版本,本篇文章选择的是5.7.31版本, ...

  4. spring-注入list集合对象(值是对象)

    1.创建stu类 public class Stu { // //1.数组类型 // private String[] courses; // // //2.list集合属性 // private L ...

  5. PHP的Laravel与Composer部署项目时常见问题

    我们在部署PHP项目时,其实大部分的PHP项目会创建环境检测与一键**Install**页面. 但是,有许多的项目还采用了Composer部署. 什么是Composer 至于什么是Composer,我 ...

  6. 2. flddler响应显示乱码问题解决方案

    Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP请求. Fiddler启动的时候,默认IE的代理设为了127.0.0.1:8888,而其他浏览器是需要手动设置.但是一开始使 ...

  7. 让交互更加生动!有意思的鼠标跟随 3D 旋转动效

    今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现: 简单分析一下,这个交互效果主要有两个核心: 借助了 CSS 3D 的能力 元素的旋转需要和鼠标的移动相结合 本文,就将讲述如何使用纯 ...

  8. 攻防世界-MISC:Erik-Baleog-and-Olaf

    这是攻防世界MISC高手进阶区的题目,题目如下 点击下载附件一,解压后得到一个文件,不知道是什么格式,用010editor打开,发现其为png文件,就把它的后缀改为png,然后用stegslove打开 ...

  9. 如何突破Jenkins瓶颈,实现集中管理、灵活高效的CI/CD

    在过去的几年间,随着DevOps的兴起,持续集成(Continuous Integration)与持续交付(Continuous Delivery)的热度也水涨船高.在本文中,我们将首先带您了解热门的 ...

  10. 双列集合Map接口 & Collections工具类

    HashMap 常用方法 遍历方式 iterator迭代器  ITIT HashTable 继承字典 Hashtable--Properties 文件读写 总结 Collections工具类