开发简单界面解决方案ctf加解密。
环境:python3.10.5 PYQT5
1.PYQT5安装
pip install PYQT5
2.总结小知识
2.1 绑定按钮信号
self.pushbutton1.clicked.connect(self.函数名)
2.2 获取textedit文本
self.textedit1.toPlainText()
2.3 获取lineedit文本
self.lineedit1.text()
2.4 输出textbrowser文本
self.textbrowser1.setTest()
self.textbrowser1.insertPlainText()#追加输出不换行
2.5 切换页面
# 页面1信号
self.pushButton.clicked.connect(self.btn1_fun)
# 页面1
def btn1_fun(self):
self.stackedWidget.setCurrentIndex(0)
3.功能实现
3.1 base编码解码
import base64 # base64加密实现函数
def base64_JIAM(self):
a = self.textEdit_1.toPlainText()
st = a.encode() # 默认以utf8编码
res = base64.b64encode(st)
self.textBrowser.setText(str(res.decode()))
# base64解密实现函数
def base64_JIEM(self):
a = self.textEdit_1.toPlainText()
st = a.encode() # 默认以utf8编码
res = base64.b64decode(st)
try:
self.textBrowser.setText(str(res.decode()))
3.2 仿射密码
# 仿射密码加密实现函数
def FANGSHE_JIAM(self):
s = 'abcdefghijklmnopqrstuvwxyz'
s1 = []
a = int(self.lineEdit_3.text())
b = int(self.lineEdit_4.text())
m = self.textEdit_2.toPlainText()
for i in range(len(m)):
c = s.index(m[i])
dx1 = (a * c b)
R = dx1 - 26 * (dx1 // 26)
s1.append(R)
self.textBrowser_2.insertPlainText(s[R])
# 仿密密码解密实现函数
def FANGSHE_JIEM(self):
s = 'abcdefghijklmnopqrstuvwxyz'
a = int(self.lineEdit_3.text())
b = int(self.lineEdit_4.text())
m = self.textEdit_2.toPlainText()
for i in range(0, 27):
if (a * i) % 26 == 1:
ny = i
for j in range(len(m)):
c = s.index(m[j])
dx1 = ny * (c - b)
R = dx1 - 26 * (dx1 // 26)
self.textBrowser_2.insertPlainText(s[R])
3.3 栅栏密码
# 栅栏密码加密实现函数
def ZHALAN_JIAM(self):
n = int(self.lineEdit_5.text())
s = self.textEdit_3.toPlainText()
s1 = []
for x in range(n, 0, -1):
for i in range(len(s)):
if ((i x) % n == 0):
s1.append(s[i])
s2 = "".join(s1)
self.textBrowser_5.setText(s2)
# 围栏密码解密
def ZHALAN_JIEM(self):
e = self.textEdit_3.toPlainText()
elen = len(e) # 计算字符串长度
field = []
for i in ange(2, elen): # 做一个循环,从2开始到数字elen(字符串长度)
if (elen % i == 0): # 计算哪些数字能整除字符串
field.append(i) # 将能整除的数字append到field里面
for f in field:
b = elen // f # 用字符串长度除以上面计算出能整除的数字f
result = {x: '' for x in range(b)}
for i in range(elen): # 字符串有多少位,就循环多少次
a = i % b;
result.update({a: result[a] + e[i]}) # 字符串截断,并update新数据
d = ''
for i in range(b):
d = d + result[i]
p = "分为{}栏时,解密结果为:{}".format(str(f), d)
self.textBrowser_5.append(p)
# self.textBrowser_5.clear()
3.4 凯撒密码
#凯撒密码加密 def KAISA_JIAM(self): d = self.textEdit_7.toPlainText() p = int(self.lineEdit.text()) s_encrypt = '' for word in d: if word == ' ': word_encrypt = ' ' else: word_encrypt = chr((ord(word) - ord('a') + p) % 26 + ord('a')) s_encrypt += word_encrypt self.textBrowser_6.setText(s_encrypt)
# 凯撒密码解密 def KAISA_JIEM(self): d = self.textEdit_7.toPlainText() p = int(self.lineEdit.text()) s_decrypt = '' for word in d: if word == ' ': word_decrypt = ' ' else: word_decrypt = chr((ord(word) - ord('a') - p) % 26 + ord('a')) s_decrypt += word_decrypt self.textBrowser_6.setText(s_decrypt)
3.5 摩斯密码
# 摩斯密码解密实现函数
def MOSI_JIEM(self):
a = self.textEdit_8.toPlainText()
s = a.split(" ")
dict = {'.-': 'A',
'-...': 'B',
'-.-.': 'C',
'-..': 'D',
'.': 'E',
'..-.': 'F',
'--.': 'G',
'....': 'H',
'..': 'I',
'.---': 'J',
'-.-': 'K',
'.-..': 'L',
'--': 'M',
'-.': 'N',
'---': 'O',
'.--.': 'P',
'--.-': 'Q',
'.-.': 'R',
'...': 'S',
'-': 'T',
'..-': 'U',
'...-': 'V',
'.--': 'W',
'-..-': 'X',
'-.--': 'Y',
'--..': 'Z',
'.----': '1',
'..---': '2',
'...--': '3',
'....-': '4',
'.....': '5',
'-....': '6',
'--...': '7',
'---..': '8',
'----.': '9',
'-----': '0',
'..--..': '?',
'-..-.': '/',
'-.--.-': '()',
'-....-': '-',
'.-.-.-': '.'
};
for item in s:
self.textBrowser_7.insertPlainText(dict[item])
# 摩斯密码加密实现函数
def MOSI_JIAM(self):
a = self.textEdit_8.toPlainText()
dict = {'A': '.-',
'B': '-...',
'C': '-.-.',
'D': '-..',
'E': '.',
'F': '..-.',
'G': '--.',
'H': '....',
'I': '..',
'J': '.---',
'K': '-.-',
'L': '.-..',
'M': '--',
'N': '-.',
'O': '---',
'P': '.--.',
'Q': '--.-',
'R': '.-.',
'S': '...',
'T': '-',
'U': '..-',
'V': '...-',
'W': '.--',
'X': '-..-',
'Y': '-.--',
'Z': '--..',
'1': '.----',
'2': '..---',
'3': '...--',
'4': '....-',
'5': '.....',
'6': '-....',
'7': '--...',
'8': '---..',
'9': '----.',
'0': '-----',
'?': '..--..',
'/': '-..-.',
'()': '-.--.-',
'-': '-....-',
'.': '.-.-.-'
};
for item in a:
self.textBrowser_7.insertPlainText(dict[item])
3.6 url编码解码
from urllib.parse import quote
from urllib.parse import unquote
# URL编码实现函数
def URL_BM(self):
f = self.textEdit_9.toPlainText()
text = quote(f, 'utf-8')
self.textBrowser_8.setText(str(text))
# URL解码实现函数
def URL_JM(self):
f = self.textEdit_9.toPlainText()
text = unquote(f, 'utf-8')
self.textBrowser_8.setText(str(text))
3.7 哈希算法
import hashlib # 哈希算法实现函数
def HASH(self):
sha1 = hashlib.sha1() # 应用MD5算法
md5 = hashlib.md5()
sha256 = hashlib.sha256()
sha512 = hashlib.sha512()
data = self.textEdit_10.toPlainText()
md5.update(data.encode('utf-8'))
sha1.update(data.encode('utf-8'))
sha256.update(data.encode('utf-8'))
sha512.update(data.encode('utf-8'))
a = "MD5加密结果为:\n{}".format(md5.hexdigest())
b = "SHA-1加密结果为:\n{}".format(sha1.hexdigest())
c = "SHA 256加密结果为:\n{}".format(sha256.hexdigest())
d = "SHA 512加密结果为:\n{}".format(sha512.hexdigest())
self.textBrowser_9.setText(a)
self.textBrowser_9.append(b)
self.textBrowser_9.append(c)
self.textBrowser_9.append(d)
3.8读取文件与导出文件
# 哈希算法读取文件
def readFile_HASH(self):
fname = QFileDialog.getOpenFileName(self, "Open File", "./", "Txt (*.txt)")
# 打开文件 返回一个字符串第一个是路径, 第二个是要打开文件的类型
# 如果用户主动关闭文件对话框,则返回值为空
if fname[0]: # 判断路径非空
f = QFile(fname[0]) # 创建文件对象,不创建文件对象也不报错 也可以读文件和写文件
# open()会自动返回一个文件对象
f = open(fname[0], "r") # 打开路径所对应的文件, "r"以只读的方式 也是默认的方式
with f:
data = f.read()
self.textEdit_10.setText(data)
f.close()
# 哈希算法导出文件
def writeFile_HASH(self):
fname = QFileDialog.getSaveFileName(self, "Write File", "./", "All (*.*)") # 写入文件首先获取文件路径
if fname[0]: # 如果获取的路径非空
f = open(fname[0], "w") # 以写入的方式打开文件
with f:
data = self.textBrowser_9.toPlainText() # 获取textEdit的str
f.write(data)
f.close()
其他加密读取文件和导出文件代码一致,修改文本对象名即可。
3.9 最终实现效果
4 总结
第一次写博客,也是第一次写ui,ui从头开始问题巨多🙀,密码学知识也忘的差不多了😢,天天看代码查报错😾,不过收获还是挺大的,拓展了一些没接触过的东西,回顾了一些密码学的知识。