前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >超级简单加解密工具

超级简单加解密工具

作者头像
py3study
发布2020-01-21 15:06:54
1.2K0
发布2020-01-21 15:06:54
举报
文章被收录于专栏:python3python3

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

代码语言: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 "\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("文件解密完毕^_^")

日志部分代码:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档