热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

超级简单加解密工具的方案和功能

本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。

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

#! /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(加密区域', 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,,'E:/jiami-Log.txt')
Tkinter.Label(root, text='加密文件完整路径:',fOnt=("黑体", 10)).grid(row=2, column=1)
jiamifname_t = Tkinter.Text(root, ,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,,'E:/jiemi-Log.txt')
Tkinter.Label(root, text='解密文件完整路径:',fOnt=("黑体", 10)).grid(row=9, column=1)
jiemifname_t = Tkinter.Text(root, ,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"),
https://img.php1.cn/3cd4a/1eebe/cd5/2d903861d5ad779c.png" src="https://img.php1.cn/3cd4a/1eebe/cd5/2d903861d5ad779c.png" alt="《超级简单加解密工具》" />

 


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
author-avatar
林小琳LLL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有