方案:读取文件头,提取特定长度进行加密,加密后加这一部分写入源文件,解密可逆。
#! /usr/bin/env python
#coding=utf-8
#Edit:Sandy
#时间:2019年1月27日13:57:04
#功能:文件的加密和解密
import os
from LogUtility import Log,CreateLoggerFile
def readheader(path):
f = open(path,"rb")
Log("读取源文件")
for now in f:
if len(now)>= 20:
Log("返回文件头字符串")
return now[0:18]
break
elif len(now)>= 3:
#print("返回少量文件头字符")
Log("返回少量文件头字符")
return now[0:(len(now)-2)]
break
else:
Log("文件内容太少")
return "FFFFFFFFFF"
break
#加密
def encrypt(path,message,key1):
f = open(path,"rb+")
Log("打开需要加密的文件")
Log("使用内置密码,错位循环加密")
kl = len(key1)
result1= []
if "\r\n" in message:
ml = len(message)-2
key = ml // kl * key1 + key1[:ml % kl]
for i in range(len(message)-2):
newByte = chr(ord(message[i]) ^ ord(key[i]))
result1.append(newByte)
result1.append("\r\n")
else:
ml = len(message)
key = ml // kl * key1 + key1[:ml % kl]
for i in range(len(message)):
newByte = chr(ord(message[i]) ^ ord(key[i]))
result1.append(newByte)
result2 = "".join(result1)
#print result2
f.write(result2)
Log("将密文合入文件")
f.close()
Log("关闭文件")
print("文件加密完毕^_^")
Log("文件加密完毕^_^")
def decrypt(path, message,key1):
f = open(path, "rb+")
Log("打开需要解密的文件")
Log("使用内置密码,错位循环解密")
kl = len(key1)
result1= []
if "\r\n" in message:
ml = len(message)-2
key = ml // kl * key1 + key1[:ml % kl]
for i in range(len(message)-2):
newByte = chr(ord(message[i]) ^ ord(key[i]))
result1.append(newByte)
result1.append("\r\n")
else:
ml = len(message)
key = ml // kl * key1 + key1[:ml % kl]
for i in range(len(message)):
newByte = chr(ord(message[i]) ^ ord(key[i]))
result1.append(newByte)
result2 = "".join(result1)
#print "解密后的字符串"
#print result2
f.write(result2)
Log("解除密文")
f.close()
Log("关闭文件")
#print("文件解密完毕^_^")
Log("文件解密完毕^_^")
日志部分代码:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def CreateLoggerFile(filename):
try:
fulllogname = filename
fh = logging.FileHandler(fulllogname)
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s [line:%(lineno)d] %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
except Exception as err:
logger.debug("Error when creating log file, error message: {}".format(str(err)))
def Log(message):
logger.debug(message)
因为作为工具来使用,我们做一个简单的GUI,用Tkinter实现
#! /usr/bin/env python
#coding=utf-8
#Edit:Sandy
#date:2019/1/28
import os
import Tkinter
from Tkinter import *
import tkMessageBox as messagebox
import tkFileDialog,Tkconstants
import ttk
from LogUtility import Log,CreateLoggerFile
from Lock import encrypt,decrypt,readheader
def commodata(jiamiflag):
if jiamiflag:
logadd = jiamilog_t.get('0.0', END).split()[0]
Log("LOG地址获取完成")
CreateLoggerFile(logadd)
Log("创建日志文件")
flag = 0
try:
filename0 = jiamifname_t.get('0.0',END).split("\n")[0]
Log("从GUI上拿到完整路径+文件名")
except Exception as e:
Log("filename获取出错或直接点击了加密按钮,程序自动跳转到选择文件")
Log(str(e))
flag = 1
if flag == 1:
Log("调用浏览app")
filename1 = selectfilejiami()
else:
filename1 = filename0
Log("成功获取文件绝对路径+文件名")
return filename1
else:
logadd = jiemilog_t.get('0.0', END).split()[0]
Log("LOG地址获取完成")
CreateLoggerFile(logadd)
Log("创建日志文件")
flag = 0
try:
filename0 = jiemifname_t.get('0.0', END).split("\n")[0]
Log("从GUI上拿到完整路径+文件名")
except Exception as e:
Log("filename获取出错或直接点击了解密按钮,程序自动跳转到选择文件")
Log(str(e))
flag = 1
if flag == 1:
Log("调用浏览app")
filename1 = selectfilejiemi()
else:
filename1 = filename0
Log("成功获取文件绝对路径+文加名")
#print filename1
return filename1
def qidongjiamiapp():
jiamiflag = 1
Log("文件名获取中")
jiamifilename =commodata(jiamiflag)
if jiamifilename !=1:
message = readheader(jiamifilename)
#print message
if message == "FFFFFFFFFF":
messagebox.showwarning("警告","文件内容太少或者这不是一个正确文件")
elif(message is None):
messagebox.showwarning("警告", "空文件")
else:
Log("获取message完成")
Log("调用加密app")
encrypt(jiamifilename,message,"zhengjing1128")
Log("加密完成")
messagebox.showinfo("提示","加密成功")
else:
#messagebox.showwarning("提示","请选择正确的文件")
pass
def qidongjiemiapp():
jiamiflag = 0
Log("文件名获取中")
jiemifilename = commodata(jiamiflag)
if jiemifilename != 1:
message = readheader(jiemifilename)
if message == "FFFFFFFFFF":
messagebox.showwarning("警告","文件内容太少或者这不是一个正确文件")
elif (message is None):
messagebox.showwarning("警告", "空文件")
else:
Log("获取message完成")
Log("调用加密app")
decrypt(jiemifilename,message,"zhengjing1128")
Log("解密完成")
messagebox.showinfo("提示","解密成功")
else:
#messagebox.showwarning("提示","请选择正确的文件")
pass
def selectfilejiami():
Log("获取选择的文件完整路径和名称")
s = tkFileDialog.askopenfilename()
Log(s)
if s == "":
messagebox.showerror("Error","未选择文件")
return 1
else:
jiemifname_t.delete('1.0', 'end')
jiamifname_t.delete('1.0','end')
jiamifname_t.insert(Tkinter.END, s)
jiamifname_t.see(END)
Log("已将加密文件路径输出到GUI")
return s
def selectfilejiemi():
Log("获取选择的文件完整路径和名称")
s = tkFileDialog.askopenfilename()
Log(s)
if s == "":
messagebox.showerror("Error","未选择文件")
return 1
else:
jiamifname_t.delete('1.0', 'end')
jiemifname_t.delete('1.0','end')
jiemifname_t.insert(Tkinter.END, s)
jiemifname_t.see(END)
Log("已将解密文件路径输出到GUI")
return s
if __name__ == "__main__":
try:
root = Tkinter.Tk()
root.title("加解密工具")
root.geometry("800x450")
print "debug1"
root.resizable(width=False, height=False)
Tkinter.Label(root, text='加密区域', fg='blue', font=("黑体", 20, "bold")).grid(row=0, column=2)
Tkinter.Label(root, text='*Version: v0.1-20190128*', fg='blue', font=("黑体", 10)).grid(row=11, column=4)
Tkinter.Label(root, text='*Design : Sandy Zheng*', fg='blue', font=("黑体", 10)).grid(row=12, column=4)
Tkinter.Label(root,text='日志地址:',font=("黑体", 10)).grid(row=1,column=1)
jiamilog_t=Tkinter.Text(root,height=3,width=60)
jiamilog_t.grid(row=1,column=2)
jiamilog_t.insert('0.0','E:/jiami-Log.txt')
Tkinter.Label(root, text='加密文件完整路径:',font=("黑体", 10)).grid(row=2, column=1)
jiamifname_t = Tkinter.Text(root, height=3, width=60)
jiamifname_t.grid(row=2, column=2)
jiamiinputfile =Tkinter.Button(root, text='浏览',activeforeground = "red",fg='blue',font=("黑体", 12, "bold"), height =2,command= selectfilejiami)
jiamiinputfile.grid(row = 2,column = 3)
btn_jiami=Tkinter.Button(root,text='开始加密',activeforeground = "red",fg='black',font=("黑体", 12, "bold"),height = 2,command=qidongjiamiapp)
btn_jiami.grid(row=5,column=3)
Tkinter.Label(root,text = "").grid(row=6,column=1)
#Tkinter.Label(root, text="").grid(row=7, column=1)
Tkinter.Label(root, text='解密区域', fg='blue', font=("黑体", 20, "bold")).grid(row=7, column=2)
Tkinter.Label(root,text='日志地址:',font=("黑体", 10)).grid(row=8,column=1)
jiemilog_t=Tkinter.Text(root,height=3,width=60)
jiemilog_t.grid(row=8,column=2)
jiemilog_t.insert('0.0','E:/jiemi-Log.txt')
Tkinter.Label(root, text='解密文件完整路径:',font=("黑体", 10)).grid(row=9, column=1)
jiemifname_t = Tkinter.Text(root, height=3, width=60)
jiemifname_t.grid(row=9, column=2)
jiemiinputfile =Tkinter.Button(root, text='浏览',activeforeground = "red",fg='blue',font=("黑体", 12, "bold"), height =2,command= selectfilejiemi)
jiemiinputfile.grid(row = 9,column = 3)
btn_jiemi = Tkinter.Button(root, text='开始解密', activeforeground="red", fg='black', font=("黑体", 12, "bold"),
height=2, command=qidongjiemiapp)
btn_jiemi.grid(row=10, column=3)
root.mainloop()
except Exception as e:
pass
完成后,我们可以用py2exe模块直接生成exe可执行文件,做好后界面如下图: