一个没啥用的小工具=>加解密工具
用Python+Qt6写了一个不是很有用的小工具
主要功能是对几种加密算法使用GUI进行显示,包含base64、md5、凯撒、AES。此处不分析算法原理。
编程逻辑使用面向对象方式
使用库
PyQt6、Crypto、base64、hashlib
GUI实现
使用PyQt6作为GUI库,进行UI显示
显示框架为左侧列表+右侧容器操作框
左侧列表实现
# 创建左侧导航栏
nav_list = QListWidget() # list组件
nav_list.addItem(QListWidgetItem(QIcon(), 'bse64'))
nav_list.addItem(QListWidgetItem(QIcon(), 'md5'))
nav_list.addItem(QListWidgetItem(QIcon(), '凯撒'))
nav_list.addItem(QListWidgetItem(QIcon(), 'AES'))
nav_list.setFixedWidth(100)
# 事件关联
nav_list.currentItemChanged.connect(self.switchPage)
# 页面选择方法
def switchPage(self, current):
if current:
selected_index = self.centralWidget().layout().itemAt(0).widget().currentRow()
self.centralWidget().layout().itemAt(1).widget().setCurrentIndex(selected_index)
右侧容器实现
# 创建右侧多页面容器
page_container = QStackedWidget()
# 页面示例化
page1 = base64Tool()
page2 = md5Tool()
page3 = kaisaTool()
page4 = aesTool()
# 添加组件
page_container.addWidget(page1)
page_container.addWidget(page2)
page_container.addWidget(page3)
page_container.addWidget(page4)
加解密
加解密使用Python库实现,此工具不手搓加解密算法
右侧容器GUI实现,使用Python面向对象的编程方法,编写QWidget窗口
base64
UI实现
def initUI(self):
self.setGeometry(0, 0, 600, 500)
# 大标题
lab_title = QLabel('Base64 加密/解密', self) # 实例化标签
lab_title.resize(100, 50) # 设置标签大小
lab_title.setFont(QFont('Arial', 60, QFont.Weight.Bold)) # 设置字体字号
lab_title.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本在标签内居中
# 按钮
self.btn_en = QPushButton('加密')
self.btn_de = QPushButton('解密')
# 编辑框
self.text_en = QLineEdit() # 单行文本编辑框
self.text_de = QLineEdit()
self.text_en.setText('')
self.text_de.setText('')
# 显示框
self.showtext_en = QTextEdit()
self.showtext_en.setFixedHeight(120)
self.showtext_en.setPlainText('')
self.showtext_en.setReadOnly(True)
self.showtext_de = QTextEdit()
self.showtext_de.setFixedHeight(120)
self.showtext_de.setPlainText('')
self.showtext_de.setReadOnly(True)
# 水平布局加密编辑框和btn
henbox = QHBoxLayout()
henbox.addWidget(self.text_en)
henbox.addWidget(self.btn_en)
# 水平布局解密编辑框和btn
hdebox = QHBoxLayout()
hdebox.addWidget(self.text_de)
hdebox.addWidget(self.btn_de)
# 垂直布局
vbox = QVBoxLayout()
vbox.addSpacing(10)
vbox.addWidget(lab_title)
vbox.addLayout(henbox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_en)
vbox.addSpacing(5)
vbox.addLayout(hdebox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_de)
vbox.addStretch(1)
vbox.addSpacing(10)
self.setLayout(vbox)
# 事件关联
self.btn_en.clicked.connect(self.base64encode)
self.btn_de.clicked.connect(self.base64decode)
算法实现
使用base64库的b64encode、b64decode进行字节的加解密
def base64encode(self):
# 从UI获取字符
string = self.text_en.text()
# 字符编码转译
transfer = string.encode("utf-8")
en = base64.b64encode(transfer).decode()
# 显示字符
self.showtext_en.setPlainText(en)
def base64decode(self):
# 从UI获取字符
string = self.text_de.text()
transfer = string.encode()
# 字符编码转译
de = base64.b64decode(transfer).decode("utf-8")
# 显示字符
self.showtext_de.setPlainText(de)
MD5
GUI实现方法与base64相识不在赘述
算法实现
借助hashlib库实现MD5加密,解密需要密文字典,小作者没这能力,也不知道有没有share的佬?
def md5encode(self):
string = self.text_en.text()
transfer = string.encode("utf-8")
# hexdigest 16进制表示
en = hashlib.md5(transfer).hexdigest()
self.showtext_en.setPlainText(en)
凯撒
算法实现
凯撒没找着现成库,手搓吧 凯撒的加解密思想很简单,就是利用字符表,然后进行位数偏移(左/右),偏移量就是加解密的key,有能者还可以自己写一个字符字典或是长字符串用来作为字符表,此处直接使用ASCII作为字符表。
def kaisa_encode(self):
# 获取key
key = self.key
# 获取加密文本
text = self.text_en.text()
# 字符串作为加密后的新变量
string = ''
for item in text:
# 字符转ASCII进行右偏移加密
asc = ord(item) + key % 128
# 字符码超出范围时进行回环计算
if asc > 128:
asc = asc - 128
# 转译并拼接密文
string += chr(asc)
self.showtext_en.setPlainText(string)
# 凯撒解密
def kaisa_decode(self):
# 获取key
key = self.key
# 获取解密文本
text = self.text_de.text()
# 字符串作为加密后的新变量
string = ''
for item in text:
# 字符转ASCII进行左偏移解密
asc = ord(item) - key % 128
# 字符码超出范围时进行回环计算
if asc < 0:
asc = asc + 128
# 转译并拼接密文
string += chr(asc)
self.showtext_de.setPlainText(string)
凯撒的加密思想可以进行拓展,凯撒的加密思想是在一维的基础上进行偏移加密,咱可以手搓或是通过程序搓一个二维的数据参考基础,形成二维的偏移密钥进行加解密,实现复杂一丢丢的偏移加密。
AES
AES作为盛行的对称加密算法,数据加密常用
算法实现
AES两种加密模式,ECB、CBC
ECB模式加密,不需要IV
CBC模式需要IV
def aes_encode(self):
# 获取key
key = self.key.encode()
# 判断有无IV选择加密方式
if self.IV == '' or self.IV == None:
# 生成AES对象,ECB类型加密
aes_text = AES.new(key, AES.MODE_ECB)
# 转码加密
encode = aes_text.encrypt(self.text_en.text().encode())
# 使用base64转码
en = base64.b64encode(encode).decode()
# UI显示
self.showtext_en.setText(en)
else:
IV = self.IV.encode()
# 生成AES对象,CBC类型加密,含有IV
aes_text = AES.new(key, AES.MODE_CBC, IV)
# 转码加密
encode = aes_text.encrypt(self.text_en.text().encode())
# 使用base64转码
en = base64.b64encode(encode).decode()
# UI显示
self.showtext_en.setText(en)
# AES解密 实现逻辑与加密相似
def aes_decode(self):
# 获取key
key = self.key.encode()
if self.IV == '' or self.IV == None:
aes_text = AES.new(key, AES.MODE_ECB)
# 使用base64转码
transfer = base64.b64decode(self.text_de.text().encode())
# 解密解码
de = aes_text.decrypt(transfer).decode()
self.showtext_de.setText(de)
else:
IV = self.IV.encode()
aes_text = AES.new(key, AES.MODE_CBC, IV)
# 使用base64转码
transfer = base64.b64decode(self.text_de.text().encode())
# 解密解码
de = aes_text.decrypt(transfer).decode()
self.showtext_de.setText(de)
完整代码
import base64
import hashlib
from Crypto.Cipher import AES
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QListWidget, QWidget, QStackedWidget, QLabel, \
QListWidgetItem, QPushButton, QVBoxLayout, QTextEdit, QLineEdit
from PyQt6.QtGui import QIcon, QFont, QIntValidator
from PyQt6.QtCore import Qt
class codeTools(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
self.center()
def initUI(self):
self.setGeometry(0, 0, 800, 600)
self.setWindowTitle('codeTools')
# 创建一个主窗口部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 创建左侧导航栏
nav_list = QListWidget() # list组件
nav_list.addItem(QListWidgetItem(QIcon(), 'bse64'))
nav_list.addItem(QListWidgetItem(QIcon(), 'md5'))
nav_list.addItem(QListWidgetItem(QIcon(), '凯撒'))
nav_list.addItem(QListWidgetItem(QIcon(), 'AES'))
nav_list.setFixedWidth(100)
# 事件关联
nav_list.currentItemChanged.connect(self.switchPage)
# 创建右侧多页面容器
page_container = QStackedWidget()
# 页面示例化
page1 = base64Tool()
page2 = md5Tool()
page3 = kaisaTool()
page4 = aesTool()
# 添加组件
page_container.addWidget(page1)
page_container.addWidget(page2)
page_container.addWidget(page3)
page_container.addWidget(page4)
# 创建布局管理器
layout = QHBoxLayout()
layout.addWidget(nav_list)
layout.addWidget(page_container)
central_widget.setLayout(layout)
# 窗口居中
def center(self):
win_rect = self.frameGeometry() # 窗口矩形(QRect类)
scr_center = self.screen().availableGeometry().center() # 屏幕中心
win_rect.moveCenter(scr_center) # 窗口矩形中心移动到屏幕中心
self.move(win_rect.topLeft()) # 移动窗口和窗口矩形重合
# 页面选择方法
def switchPage(self, current):
if current:
selected_index = self.centralWidget().layout().itemAt(0).widget().currentRow()
self.centralWidget().layout().itemAt(1).widget().setCurrentIndex(selected_index)
class base64Tool(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(0, 0, 600, 500)
# 大标题
lab_title = QLabel('Base64 加密/解密', self) # 实例化标签
lab_title.resize(100, 50) # 设置标签大小
lab_title.setFont(QFont('Arial', 60, QFont.Weight.Bold)) # 设置字体字号
lab_title.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本在标签内居中
# 按钮
self.btn_en = QPushButton('加密')
self.btn_de = QPushButton('解密')
# 编辑框
self.text_en = QLineEdit() # 单行文本编辑框
self.text_de = QLineEdit()
self.text_en.setText('')
self.text_de.setText('')
# 显示框
self.showtext_en = QTextEdit()
self.showtext_en.setFixedHeight(120)
self.showtext_en.setPlainText('')
self.showtext_en.setReadOnly(True)
self.showtext_de = QTextEdit()
self.showtext_de.setFixedHeight(120)
self.showtext_de.setPlainText('')
self.showtext_de.setReadOnly(True)
# 水平布局加密编辑框和btn
henbox = QHBoxLayout()
henbox.addWidget(self.text_en)
henbox.addWidget(self.btn_en)
# 水平布局解密编辑框和btn
hdebox = QHBoxLayout()
hdebox.addWidget(self.text_de)
hdebox.addWidget(self.btn_de)
# 垂直布局
vbox = QVBoxLayout()
vbox.addSpacing(10)
vbox.addWidget(lab_title)
vbox.addLayout(henbox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_en)
vbox.addSpacing(5)
vbox.addLayout(hdebox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_de)
vbox.addStretch(1)
vbox.addSpacing(10)
self.setLayout(vbox)
# 事件关联
self.btn_en.clicked.connect(self.base64encode)
self.btn_de.clicked.connect(self.base64decode)
def base64encode(self):
# 从UI获取字符
string = self.text_en.text()
# 字符编码转译
transfer = string.encode("utf-8")
en = base64.b64encode(transfer).decode()
# 显示字符
self.showtext_en.setPlainText(en)
def base64decode(self):
# 从UI获取字符
string = self.text_de.text()
transfer = string.encode()
# 字符编码转译
de = base64.b64decode(transfer).decode("utf-8")
# 显示字符
self.showtext_de.setPlainText(de)
class md5Tool(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(0, 0, 600, 500)
# 大标题
lab_title = QLabel('MD5 加密', self) # 实例化标签
lab_title.resize(100, 50) # 设置标签大小
lab_title.setFont(QFont('Arial', 60, QFont.Weight.Bold)) # 设置字体字号
lab_title.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本在标签内居中
# 按钮
self.btn_en = QPushButton('加密')
# 编辑框
self.text_en = QLineEdit() # 单行文本编辑框
self.text_en.setText('')
# 显示框
self.showtext_en = QTextEdit()
self.showtext_en.setFixedHeight(120)
self.showtext_en.setPlainText('')
self.showtext_en.setReadOnly(True)
# 水平布局加密编辑框和btn
henbox = QHBoxLayout()
henbox.addWidget(self.text_en)
henbox.addWidget(self.btn_en)
# 垂直布局
vbox = QVBoxLayout()
vbox.addSpacing(10)
vbox.addWidget(lab_title)
vbox.addLayout(henbox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_en)
vbox.addStretch(1)
vbox.addSpacing(10)
self.setLayout(vbox)
self.btn_en.clicked.connect(self.md5encode)
def md5encode(self):
string = self.text_en.text()
transfer = string.encode("utf-8")
# hexdigest 16进制表示
en = hashlib.md5(transfer).hexdigest()
self.showtext_en.setPlainText(en)
class kaisaTool(QWidget):
key = 8
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(0, 0, 600, 500)
# self.setWindowTitle('base64')
# 大标题
lab_title = QLabel('凯撒 加密/解密', self) # 实例化标签
lab_title.resize(100, 50) # 设置标签大小
lab_title.setFont(QFont('Arial', 60, QFont.Weight.Bold)) # 设置字体字号
lab_title.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本在标签内居中
lab_currentkey = QLabel('当前偏移密钥', self)
lab_editkey = QLabel('修改偏移密钥', self)
# 按钮
self.btn_key = QPushButton('确认偏移密钥')
self.btn_en = QPushButton('加密')
self.btn_de = QPushButton('解密')
# 编辑框
self.text_key = QLineEdit() # 单行文本编辑框
# 创建一个整数验证器
int_validator = QIntValidator()
self.text_key.setValidator(int_validator)
self.text_en = QLineEdit()
self.text_de = QLineEdit()
self.text_en.setText('')
self.text_de.setText('')
# 显示框
self.showtext_key = QLineEdit()
self.showtext_key.setText(str(self.key))
self.showtext_key.setReadOnly(True)
self.showtext_en = QTextEdit()
self.showtext_en.setFixedHeight(120)
self.showtext_en.setPlainText('')
self.showtext_en.setReadOnly(True)
self.showtext_de = QTextEdit()
self.showtext_de.setFixedHeight(120)
self.showtext_de.setPlainText('')
self.showtext_de.setReadOnly(True)
# 水平布局偏移密钥编辑框、显示框和btn
hkeybox = QHBoxLayout()
hkeybox.addWidget(lab_currentkey)
hkeybox.addSpacing(1)
hkeybox.addWidget(self.showtext_key)
hkeybox.addSpacing(1)
hkeybox.addWidget(lab_editkey)
hkeybox.addSpacing(1)
hkeybox.addWidget(self.text_key)
hkeybox.addWidget(self.btn_key)
# 水平布局加密编辑框和btn
henbox = QHBoxLayout()
henbox.addWidget(self.text_en)
henbox.addWidget(self.btn_en)
# 水平布局解密编辑框和btn
hdebox = QHBoxLayout()
hdebox.addWidget(self.text_de)
hdebox.addWidget(self.btn_de)
# 垂直布局
vbox = QVBoxLayout()
vbox.addSpacing(10)
vbox.addWidget(lab_title)
vbox.addSpacing(5)
vbox.addLayout(hkeybox)
vbox.addSpacing(5)
vbox.addLayout(henbox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_en)
vbox.addSpacing(5)
vbox.addLayout(hdebox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_de)
vbox.addStretch(1)
vbox.addSpacing(10)
self.setLayout(vbox)
self.btn_en.clicked.connect(self.kaisa_encode)
self.btn_de.clicked.connect(self.kaisa_decode)
self.btn_key.clicked.connect(self.setkey)
# 设置密钥
def setkey(self):
self.key = int(self.text_key.text())
self.showtext_key.setText(self.text_key.text())
# 凯撒加密
def kaisa_encode(self):
# 获取key
key = self.key
# 获取加密文本
text = self.text_en.text()
# 字符串作为加密后的新变量
string = ''
for item in text:
# 字符转ASCII进行右偏移加密
asc = ord(item) + key % 128
# 字符码超出范围时进行回环计算
if asc > 128:
asc = asc - 128
# 转译并拼接密文
string += chr(asc)
self.showtext_en.setPlainText(string)
# 凯撒解密
def kaisa_decode(self):
# 获取key
key = self.key
# 获取解密文本
text = self.text_de.text()
# 字符串作为加密后的新变量
string = ''
for item in text:
# 字符转ASCII进行左偏移解密
asc = ord(item) - key % 128
# 字符码超出范围时进行回环计算
if asc < 0:
asc = asc + 128
# 转译并拼接密文
string += chr(asc)
self.showtext_de.setPlainText(string)
class aesTool(QWidget):
key = ''
IV = ''
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(0, 0, 600, 500)
# self.setWindowTitle('base64')
# 大标题
lab_title = QLabel('AES 加密/解密', self) # 实例化标签
lab_title.resize(100, 50) # 设置标签大小
lab_title.setFont(QFont('Arial', 60, QFont.Weight.Bold)) # 设置字体字号
lab_title.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本在标签内居中
lab_currentkey = QLabel('当前密钥', self)
lab_editkey = QLabel('修改密钥(字符16的倍数)', self)
lab_IV = QLabel('当前IV')
lab_editIV = QLabel('修改IV(字符8的倍数)')
# 按钮
self.btn_key = QPushButton('确认密钥')
self.btn_IV = QPushButton('确认IV')
self.btn_en = QPushButton('加密')
self.btn_de = QPushButton('解密')
# 编辑框
self.text_key = QLineEdit() # 单行文本编辑框
self.text_IV = QLineEdit()
self.text_en = QLineEdit()
self.text_de = QLineEdit()
self.text_en.setText('')
self.text_de.setText('')
# 显示框
self.showtext_key = QLineEdit()
self.showtext_IV = QLineEdit()
self.showtext_key.setText(str(self.key))
self.showtext_key.setText(None)
self.showtext_IV.setText(None)
self.showtext_key.setReadOnly(True)
self.showtext_IV.setReadOnly(True)
self.showtext_en = QTextEdit()
self.showtext_en.setFixedHeight(120)
self.showtext_en.setPlainText('')
self.showtext_en.setReadOnly(True)
self.showtext_de = QTextEdit()
self.showtext_de.setFixedHeight(120)
self.showtext_de.setPlainText('')
self.showtext_de.setReadOnly(True)
# 水平布局key\IV显示
hshow = QHBoxLayout()
hshow.addWidget(lab_currentkey)
hshow.addWidget(self.showtext_key)
hshow.addWidget(lab_IV)
hshow.addWidget(self.showtext_IV)
# 水平布局key\IV编辑框和btn
heditbox = QHBoxLayout()
heditbox.addWidget(lab_editkey)
heditbox.addSpacing(1)
heditbox.addWidget(self.text_key)
heditbox.addWidget(self.btn_key)
heditbox.addSpacing(1)
heditbox.addWidget(lab_editIV)
heditbox.addWidget(self.text_IV)
heditbox.addSpacing(1)
heditbox.addWidget(self.btn_IV)
# 水平布局加密编辑框和btn
henbox = QHBoxLayout()
henbox.addWidget(self.text_en)
henbox.addWidget(self.btn_en)
# 水平布局解密编辑框和btn
hdebox = QHBoxLayout()
hdebox.addWidget(self.text_de)
hdebox.addWidget(self.btn_de)
# 垂直布局
vbox = QVBoxLayout()
vbox.addSpacing(10)
vbox.addWidget(lab_title)
vbox.addSpacing(5)
vbox.addLayout(hshow)
vbox.addSpacing(5)
vbox.addLayout(heditbox)
vbox.addSpacing(5)
vbox.addLayout(henbox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_en)
vbox.addSpacing(5)
vbox.addLayout(hdebox)
vbox.addSpacing(5)
vbox.addWidget(self.showtext_de)
vbox.addStretch(1)
vbox.addSpacing(10)
self.setLayout(vbox)
self.btn_en.clicked.connect(self.aes_encode)
self.btn_de.clicked.connect(self.aes_decode)
self.btn_key.clicked.connect(self.setkey)
self.btn_IV.clicked.connect(self.setIV)
# 设置密钥
def setkey(self):
self.key = self.text_key.text()
self.showtext_key.setText(self.key)
self.text_key.setText('')
# 设置IV
def setIV(self):
self.IV = self.text_IV.text()
self.showtext_IV.setText(self.IV)
self.text_IV.setText('')
# AES加密
def aes_encode(self):
# 获取key
key = self.key.encode()
# 判断有无IV选择加密方式
if self.IV == '' or self.IV == None:
# 生成AES对象,ECB类型加密
aes_text = AES.new(key, AES.MODE_ECB)
# 转码加密
encode = aes_text.encrypt(self.text_en.text().encode())
# 使用base64转码
en = base64.b64encode(encode).decode()
# UI显示
self.showtext_en.setText(en)
else:
IV = self.IV.encode()
# 生成AES对象,CBC类型加密,含有IV
aes_text = AES.new(key, AES.MODE_CBC, IV)
# 转码加密
encode = aes_text.encrypt(self.text_en.text().encode())
# 使用base64转码
en = base64.b64encode(encode).decode()
# UI显示
self.showtext_en.setText(en)
# AES解密
def aes_decode(self):
# 获取key
key = self.key.encode()
if self.IV == '' or self.IV == None:
aes_text = AES.new(key, AES.MODE_ECB)
# 使用base64转码
transfer = base64.b64decode(self.text_de.text().encode())
# 解密解码
de = aes_text.decrypt(transfer).decode()
self.showtext_de.setText(de)
else:
IV = self.IV.encode()
aes_text = AES.new(key, AES.MODE_CBC, IV)
# 使用base64转码
transfer = base64.b64decode(self.text_de.text().encode())
# 解密解码
de = aes_text.decrypt(transfer).decode()
self.showtext_de.setText(de)
if __name__ == '__main__':
app = QApplication([])
ex = codeTools()
ex.show()
app.exec()
新人作者,首次发帖,不足之处,请多指正,能改则改,不能当没看见。^▽^