一. 小工具功能
- 数据加解密(blowfish)
- json格式化
- 获取字符串md5
- base64解码
- url解码
- 获取文件md5
二.小工具的实现
def makeico():
# 窗口左上角图标
src = "ico图标的base编码"
data = src.split(',')[1]
image_data = base64.b64decode(data)
base_dir = os.getenv('APPDATA')
path = os.path.join(base_dir, 'tool.ico')
with open(path, 'wb') as f:
f.write(image_data)
def gui_start():
makeico() #窗口左上角icon
init_window = Tk() # 实例化出一个父窗口
ZMJ_PORTAL = MY_GUI(init_window)
init_window.resizable(False, False) # 禁止窗口改变大小
ZMJ_PORTAL.set_init_window() #窗口ui界面函数
init_window.mainloop() # 父窗口进入事件循环,保持窗口运行,否则界面不展示
class MY_GUI():
def __init__(self, init_window_name):
self.init_window_name = init_window_name
# 设置窗口
def set_init_window(self):
self.init_window_name.title("TOOL") # 窗口名
# self.init_window_name.geometry('320x160+10+10') #290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置
self.init_window_name.geometry('1068x681+10+10')
# 窗口右上角图标
base_dir = os.getenv('APPDATA')
path = os.path.join(base_dir, 'tool.ico')
self.init_window_name.iconbitmap(path)
# 窗口居中
screenwidth = self.init_window_name.winfo_screenwidth()
screenheight = self.init_window_name.winfo_screenheight()
# 设定窗口的大小(长 * 宽)
width = self.init_window_name.winfo_width()
height = self.init_window_name.winfo_height()
# 设置窗口在屏幕居中
size = "%dx%d+%d+%d" % (width, height, (screenwidth -
width) / 2, (screenheight - height) / 2)
self.init_window_name.geometry(size)
# 标签
self.init_data_label = Label(self.init_window_name, text="待处理数据")
self.init_data_label.grid(row=1, column=0)
self.result_data_label = Label(self.init_window_name, text="输出结果")
self.result_data_label.grid(row=1, column=12)
self.key_label = Label(self.init_window_name,
text=" key :")
self.key_label.grid(row=0, column=0)
# 文本框
self.init_data_Text = Text(
self.init_window_name, width=65, height=49) # 原始数据录入框
self.init_data_Text.grid(row=2, column=0, rowspan=10, columnspan=10)
self.result_data_Text = Text(
self.init_window_name, width=75, height=49) # 处理结果展示
self.result_data_Text.grid(row=2, column=12, rowspan=15, columnspan=10)
# self.key_data_Text = Text(self.init_window_name, width=45, height=1) # key录入框
# self.key_data_Text.grid(row=0, column=0, columnspan=10)
# key值下拉选择框
self.key_data_Text = ttk.Combobox(
self.init_window_name, width=45, height=10)
self.key_data_Text.grid(row=0, column=1, columnspan=10)
# 设置下拉菜单中的值
self.key_data_Text['value'] = self.get_key_data()
self.key_data_Text.current(0)
# 解密按钮
self.str_trans_to_decrypt_button = Button(
self.init_window_name, text="数 据 解 密", bg="darkgoldenrod", width=10, command=self.str_trans_to_decrypt) # 调用内部解密方法
self.str_trans_to_decrypt_button.grid(row=3, column=11)
# 加密按钮
self.str_trans_to_encrypt_button = Button(
self.init_window_name, text="数 据 加 密", bg="darkkhaki", width=10, command=self.str_trans_to_encrypt) # 调用内部加密方法
self.str_trans_to_encrypt_button.grid(row=4, column=11)
# json按钮
self.str_trans_to_json_button = Button(
self.init_window_name, text="json格式化", bg="darkseagreen", width=10, command=self.str_trans_to_json) # 调用内部json格式化方法
self.str_trans_to_json_button.grid(row=5, column=11)
# md5按钮
self.str_trans_to_md5_button = Button(
self.init_window_name, text="字符串转MD5", bg="darkseagreen", width=10, command=self.str_trans_to_md5) # 调用内部方法md5计算方法
self.str_trans_to_md5_button.grid(row=6, column=11)
# base64解码按钮
self.str_trans_to_json_button = Button(self.init_window_name, text="base64 解 码",
bg="darkseagreen", width=10, command=self.str_trans_to_base64decode) # 调用内部base64解码方法
self.str_trans_to_json_button.grid(row=7, column=11)
# url解码按钮
self.str_trans_to_url_button = Button(
self.init_window_name, text="url 解 码", bg="darkseagreen", width=10, command=self.str_trans_to_urldecode) # 调用内部url解码方法
self.str_trans_to_url_button.grid(row=8, column=11)
# url解码按钮
self.str_trans_to_file_button = Button(
self.init_window_name, text="文 件 md5", bg="darkseagreen", width=10, command=self.str_trans_to_filemd) # 调用内部文件md5加密方法
self.str_trans_to_file_button.grid(row=9, column=11)
windnd.hook_dropfiles(
self.init_data_Text.winfo_id(), self.func) # 拖拽文件获取路径
- 数据加密
def str_trans_to_encrypt(self):
data_3 = self.init_data_Text.get(1.0, END)
key_ = self.key_data_Text.get()
key = key_.split(':')[-1] # 取:后面的内容
#print("data_3 =",data_3)
#print("key =",key)
if isinstance(data_3, str):
try:
bs = Blowfish.block_size # Blowfish.block_size 默认是8 # 得到需要补位的个数
# 文本长度%8 --得到当前的文本长度除去整数8的倍数以后的数据
# bs - len(plaintext) % bs 得到需要添加的位数
plen = (bs - len(data_3.encode("utf-8")) %
bs) % bs # 如果data_3有中文,所以这儿需要encode
# print("plen",plen)
padding = [0]*plen # 得到补零的总个数
# 补位的需要将格式转化为二进制
padding = pack('b'*plen, *padding)
# print("padding",padding)
# print(base64.b64encode(padding))
newcipher = Blowfish.new(key.encode(
"utf-8"), Blowfish.MODE_ECB) # 加密对象
# print("data3=",data_3.encode("utf-8"))
en = newcipher.encrypt(data_3.encode(
"utf-8") + padding) # 加密plaintext
# print("en",en)
en_data = base64.b64encode(en).replace(b'\n', b'') # base64编码
# print("en_data",en_data)
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, en_data)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "字符串加密失败")
else:
self.result_data_Text.insert(1.0, "字符串加密失败")
- 数据解密
def str_trans_to_decrypt(self):
data_2 = self.init_data_Text.get(1.0, END).strip().replace("\n", "")
key_ = self.key_data_Text.get()
key = key_.split(':')[-1] # 取:后面的内容
#print("key =",key)
# print("data_2",data_2)
if isinstance(data_2, str):
try:
detext = base64.b64decode(data_2) # base64解码
#print("detext= ",detext)
newcipher = Blowfish.new(key.encode(
"utf-8"), Blowfish.MODE_ECB) # 解密对象
detext = newcipher.decrypt(detext) # 解密
de_data = detext.decode() # 解码
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, de_data)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "字符串解密失败")
else:
self.result_data_Text.insert(1.0, "字符串解密失败")
- json格式化
def str_trans_to_json(self):
data_1 = self.init_data_Text.get(1.0, END).strip().replace("\n", "")
#print("src =",src)
if isinstance(data_1, str):
try:
# print(data_1)
data_2 = demjson.decode(data_1)
json_data = json.dumps(data_2, sort_keys=True, indent=4, separators=(
',', ':'), ensure_ascii=False) # json.dumps()是把python对象转换成json对象的一个过程,生成的是字符串
# print(json_data)
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, json_data)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "字符串json失败")
else:
self.result_data_Text.insert(1.0, "字符串json失败")
- 字符串md5
def str_trans_to_md5(self):
data = self.init_data_Text.get(
1.0, END).strip().replace("\n", "").encode()
#print("src =",src)
if data:
try:
myMd5 = hashlib.md5()
myMd5.update(data)
myMd5_Digest = myMd5.hexdigest()
# print(myMd5_Digest)
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, myMd5_Digest)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "字符串转MD5失败")
else:
self.result_data_Text.insert(1.0, "字符串转MD5失败")
- base64解码
def str_trans_to_base64decode(self):
data_4 = self.init_data_Text.get(1.0, END).strip().replace("\n", "")
if isinstance(data_4, str):
try:
dedata_4 = base64.b64decode(data_4)
data_64 = dedata_4.decode() # 中文解码
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, data_64)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "base64解码失败")
else:
self.result_data_Text.insert(1.0, "base64解码失败")
- url解码
def str_trans_to_urldecode(self):
data_5 = self.init_data_Text.get(1.0, END).strip().replace("\n", "")
if isinstance(data_5, str):
try:
dedata_5 = parse.unquote(data_5)
# 输出到界面
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, dedata_5)
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "url解码失败")
else:
self.result_data_Text.insert(1.0, "url解码失败")
- 文件md5
def str_trans_to_filemd(self):
file_path_str = self.init_data_Text.get(1.0, END).strip().encode()
file_path_list = file_path_str.splitlines()
#print("file_path =", file_path)
self.result_data_Text.delete(1.0,END) #清楚拖拽之前的内容
for i, file_path in enumerate(file_path_list):
#print("file_path =", file_path)
if file_path:
try:
with open(file_path, 'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
_hash = md5obj.hexdigest()
# print(str(_hash).upper())
file_md5 = str(_hash).upper()
#print(file_md5)
self.result_data_Text.insert("end", file_md5 + "\n")
except:
self.result_data_Text.insert("end", "文件MD5失败"+ "\n")
else:
self.result_data_Text.insert("end", "文件MD5失败"+ "\n")
# 文件拖拽
def func(self, files):
self.init_data_Text.delete(1.0,END) #清楚拖拽之前的内容
for i in files:
self.init_data_Text.insert("end", i.decode("gbk")+'\n')