目录
1.xcb-cuisor0问题解决
2.AES-CBC算法实现
2.1 信号和槽机制
2.2 开始设计算法
3.小结
1.xcb-cuisor0问题解决
继续解决该问题,在Ubuntu下面运行会发生这个错误。
看描述, 这是说要运行Qt xcb平台插件,需要xcb-cursor0或者libxcb-cursor0,这还不简单?
我直接安装对应插件不就行了吗?
终端里执行:
sudo apt-get install libxcb-cursor0
这时候再运行代码就没有报错了,此时显示界面如下,还是比较符合预期了:
这里补充一点代码说明:
我们用过PyUIC转换得到.py代码,得到的仅仅是Ui_Mainwindow这样的类,它里面定义的方法有setupUi(self, MainWindow),如果直接使用UI.py,会发现没有办法弹出想要的界面,例如window.show(),它实际上是没有这个属性的。
因为我们只是实例化了Ui_Mainwindow对象,并没有任何窗口对象,所以需要再实例化一个QMainwindow来承接属性并显示。
2.AES-CBC算法实现
对于UI的程序逻辑思路是,点击“calculate”,自动根据算法搜集所需数据,包括密钥、原始文档、IV等等, 最后计算出结果。
那我们就首先要解决UI上各种数据来源,其实也就是各个对象之间通信机制-- 信号和槽。
2.1 信号和槽机制
这个机制很好理解,以跑步比赛为例,听到发令枪的信号后(这就是信号),运动员立马响应开始跑步(这就是槽函数里指定动作)。
对于Qt Designer里,我们可以信号/槽 编辑器是如下界面:
需要注意的是,信号和槽只有连接后才会起作用,对应代码如下:
widget.signal.connect(slot)
在不会写这代码之前,我们可以使用QT Designer来看下如何连接信号和槽,如下:
拖动控件发送信号,到指定控件,选择clicked,这是信号,右侧为槽函数,得到代码如下:
self.PBSymCalc.clicked.connect(self.QTextLael.selectall)
而我们的目的是要求它显示结果,很明显QLineEdit这个控件里没有我们想要的方法,所以一般来说,我们把UI搞好了,很多信号\槽是需要自己手写的。
所以,我们这样来定义一个方法,目的是为了获取数据加解密并显示结果,如下:
得到结果如下:
2.2 开始设计算法
终于开始进入正题,要实现密码算法,我们很自然想到了OpenSSL,在python视角了使用pyOpenSSL,它相当于是对openSSL的一个python封装。
如下是文档链接 Welcome to pyOpenSSL’s documentation! — pyOpenSSL 24.1.0 documentation
根据文档描述,对于加密来说了,使用pyca/cryptographyg更加合适,那么我们肯定听劝呀。
Note
pyca/cryptography is likely a better choice than using this module. It contains a complete set of cryptographic primitives as well as a significantly better and more powerful X509 API. If necessary you can convert to and from cryptography objects using the
to_cryptography
andfrom_cryptography
methods onX509
,X509Req
,CRL
, andPKey
.
首先我们思考一下,如果我们在之前UI转出来的.py里去定义方法,那么后续如果UI一变,代码就得重新复制,这就很麻烦,所以,我们选择在一个新的.py里去继承这个UI里的内容,并在里面是实现我们想要的算法,如下图:
这样的好处就是将文件进行解耦,每个文件专注做想要的功能即可。
在该文件里,我们准备开始进行计算,首先导入密码库对应类,如下图:
然后我们就要进行思考,原始文件、密钥、IV等数据如何从QTextEdit中取出,熟悉的朋友对于这个块应该很熟,不清楚滴可以直接去类里找方法,如下:
最后,代码如下:
接下来就是填充和算法解析,这个直接到官网找例子即可。得出效果如下:
3.小结
目前看,我们实现了加密或者解密的功能,但是针对这个密文格式问题,后面单独再讨论,其实直接显示hex就最好,不要那么多花里胡哨。
前面三小节,我们算法把这条路打通了,接下来就是各种算法的实现,以及异常情况的处理。后面继续