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

 


推荐阅读
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • AI炼金术:KNN分类器的构建与应用
    本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文详细介绍了在 Python 中如何有效去除浮点数末尾的无意义零及不必要的点,提供多种实现方法,并深入探讨了浮点数在计算机中的表示方式及其可能带来的精度问题。 ... [详细]
  • PHP混淆代码的破解与理解
    本文探讨了PHP中常见的代码混淆技术及其破解方法,包括简单的变量名混淆和更复杂的加密技术。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
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社区 版权所有