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

 


推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
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社区 版权所有