记录一下自己小学期内做的项目。基于Python实现一个能够对凯撒密码、维吉尼亚密码、栅栏密码、摩斯密码、Base64编码、Ascii编码、AES、DES、RSA、RC4的加密解密以及维吉尼亚密文破解密钥和明文的CTF Crypto工具。其中程序的界面使用了qt以及pyside6实现。
以上就是该程序实现的界面,下面简单记录一下从拿到这个项目大纲再到基本实现的过程:
目录
第二步:为程序设计一个界面,我这里用的是qt以及pyside6实现
第一步:进行需求分析,确定实现的功能
由于在CTF比赛里的Crypto题目中,经常会有一些大整数的运算用于对字符串的加密和解密,如果比赛中使用计算来对加解密的字符串进行处理会十分麻烦。因此,如果可以编写一个CTF Crypto工具自动处理字符串加解密就显得十分重要了。在众多密码类型中,常见的有以下几种:
常见的古典密码类型: 包括但不限于维吉利亚密码,凯撒密码,栅栏密码……
常见的现代密码类型: AES、DES、RSA、RC4……
常见的编码类型: Base64、Ascii、摩斯密码……
综合以上的需求分析,就尝试实现这几种吧…………
第二步:为程序设计一个界面,我这里用的是qt以及pyside6实现
qt以及pyside6安装:
pip install Pyside6
安装完后就可以进入Pyside6的文件目录下找到design.exe进入qt去设计程序的界面了
进入后一般选择MainWindow或者Widget就够用了
选择类型后就拖动左边的部件到程序的窗口进行设计了
具体的qt界面的使用这里就不再赘述了,可以去b站看一下大佬们的仔细讲解,这里附上个人觉得讲的非常好的两个大佬的视频链接:
Python图形界面 15分钟快速入门PySide/PyQt_哔哩哔哩_bilibili
【python】快速上手GUI图形界面的编写(一)(使用pyside6,pyqt6,pyside2,pyqt5)_哔哩哔哩_bilibili
qt设计完界面后就是以下这个样子了
至此,程序的界面就已经设计完毕了,但目前这个ui文件并不能直接部署到python中去使用,需要将其转化为py类型的文件才可以使用
转化方法:
pyside6-uic xxxx.ui -o xxxx.py
转化完成后就可以进入下一步,进行部件与信号的绑定了
第三步:实例化窗口
首先是对ui的文件进行连接并实例化窗口,同时引入了qtmodern模块进行简单的美化
from PySide6.QtWidgets import QApplication, QMainWindow
from ui import Ui_MainWindow
import qtmodern.styles #引入qtmodern模块,简单的美化程序界面
import qtmodern.windows
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow() # UI类的实例化()
self.ui.setupUi(self)
if __name__ == '__main__':
app = QApplication([]) # 启动一个应用
qtmodern.styles.light(app) #选择light风格,也可以选择另一个dark风格
window = MainWindow() # 实例化主窗口
window = qtmodern.windows.ModernWindow(window)
window.show() # 展示主窗口
app.exec() # 避免程序执行到这一行后直接退出
运行看一下程序的界面:
至此,就完成了窗口的实例化了,非常简单。
第四步:实现不同密码类型下的加密和解密
1、凯撒密码的加密和解密
凯撒密码是已知最早、最简单的密码之一。它是一种替换密码,在这种密码中,明文中的每个字母都被“移位”到字母表中一定数量的位置。例如,移动1,A会被B取代,B会变成C,以此类推。这种方法以朱利叶斯·凯撒(Julius Caesar)的名字命名。
假设我们移位的值是6
,掰起指头算一下,那么a
对应的就是g
,b
对应h
,c
对应i
等等。
加密前:i love csdn
加密后:o rubk iyjt
python实现代码:
def kaisa_encode(p:str,k:int):
list = ''
for word in p:
if word == ' ':
tword = ' '
else:
tword = chr((ord(word)-ord('a') + k) % 26 + ord('a'))
list += tword
return list
def kaisa_decode(c:str,k:int):
list = ' '
for word in c:
if word == ' ':
tword = ' '
else:
tword = chr((ord(word)-ord('a') - k) % 26 + ord('a'))
list += tword
return list
2、维吉尼亚密码的加密和解密
维吉尼亚密码是一种简单的多表代换密码(由26个类似的Caesar密码的代换表组成),
即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。
英文中a~z,由0~25表示。
假设串长为m,明文为P,密文为C,密钥为K则
加密方法
加密公式:C = (P + K)%26
C:密文
P:原文
K:第几套加密方式
使用第几套加密方式是通过约定一个规则来确定的,这个规则就是“密钥”。
这样密钥和原文每个字符一一对应,如果密钥长度不足,那么循环替代。
解密方法
解密公式:P = (C - K)%26
C:密文
P:原文
K:第几套加密方式
python实现代码:
def Veginere_encode(p:str,key:str):
keylen = len(key)
plen = len(p)
c = ''
i = 0
while i < plen:
j = i % keylen
k = letter.index(key[j])
m = letter.index(p[i])
c += letter[(m+k)%26]
i +=1
return c
def Veginere_decode(c:str,key:str):
keylen = len(key)
clen = len(c)
p = ''
i = 0
while i < clen:
j = i % keylen
k = letter.index(key[j])
m = letter.index(c[i])
if m < k:
m +=26
p += letter[m-k]
i +=1
return p
3、栅栏密码的加密和解密
栅栏密码
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一