热门标签 | 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="《超级简单加解密工具》" />

 


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
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社区 版权所有