超级简单加解密工具

2020-01-21 15:06:54 浏览数 (1)

方案:读取文件头,提取特定长度进行加密,加密后加这一部分写入源文件,解密可逆。

代码语言:javascript复制
#! /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 "rn" 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("rn")

    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 "rn" 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("rn")
    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("文件解密完毕^_^")

日志部分代码:

代码语言:javascript复制
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实现

代码语言:javascript复制
#! /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可执行文件,做好后界面如下图:

0 人点赞