一. 小工具功能
- 数据加解密(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() #窗口左上角iconinit_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')
- 打包成exe文件