QQ聊天框消息加密
之前做过简单的英文文本加密,用过凯撒密码这样很简单的加密方式,我想有没有简单易学,但是加密程度更高的加密方式;
另外通过这个程序还想学习一下python的GUI开发,做出真正的界面;
如果可以与QQ等聊天界面结合起来,将内容直接输入到QQ的消息窗口中去,省去了复制粘贴的麻烦。
2021年8月我写好了第一版的程序,但是这个效果嘛,Emmmmm……一言难尽。
2022年3月的一天下午,厌学了!也是因为好久都没有写过程序了,就看了一些自己的博客,看一下还有什么坑没有填!然后就发现了我之前做的这个半成品,然后花了几个小时的时间,重写了一下,也把UI(简陋)界面简单做了一下!
需求分析
- 写一个聊天外挂框,实现在框内输入内容,自动加密然后通过QQ聊天框发送出去。
- 做一个简单的UI,其实我之前并没有学过也没用做过GUI的开发,了解一点点QT,这次做这个程序也是现学现卖了。
- 消息加密算法,大概率是使用对称加密了,如果是非对称加密的话估计仅靠本地是不太好实现的,得上云了!
- 写着玩,能用就行!
理论依据
PyQt5
Qt is set of cross-platform C++ libraries that implement high-level APIs for accessing many aspects of modern desktop and mobile systems. These include location and positioning services, multimedia, NFC and Bluetooth connectivity, a Chromium based web browser, as well as traditional UI development.
PyQt5 is a comprehensive set of Python bindings for Qt v5. It is implemented as more than 35 extension modules and enables Python to be used as an alternative application development language to C++ on all supported platforms including iOS and Android.
PyQt5 may also be embedded in C++ based applications to allow users of those applications to configure or enhance the functionality of those applications.
Base64
Base64 - 维基百科,自由的百科全书 (wikipedia.org)
Base64(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。由于一2为64的对数的值是6,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z
、a-z
、数字0-9
,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
AES
高级加密标准 - 维基百科,自由的百科全书 (wikipedia.org)
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法(荷兰语发音: [ˈrɛindaːl],音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。
该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。
严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中两者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度均可以是128,192或256比特。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
大多数AES计算是在一个特别的有限域完成的。
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵的“列数(Row number)”可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
AddRoundKey
—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。SubBytes
—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。ShiftRows
—将矩阵中的每个横列进行循环式移位。MixColumns
—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns
步骤,而以另一个AddRoundKey
取代。
源代码
- Encrpt.py
1 |
|
- GUI.py
1 |
|
结果
打包成为exe文件
![](https://murhyimgur.oss-cn-beijing.aliyuncs.com/website/image-20220320200259164.png)
稍显简陋,但是能用就行!
![](https://murhyimgur.oss-cn-beijing.aliyuncs.com/website/image-20220320200339455.png)
问题
- UI窗口界面问题(简陋不是问题(/doge)),因为这给UI元素都是固定在一个确定的位置的,因此,在把界面放大或者缩小的时候,界面中的元素不能自适应位置,还是保持了原来的位置。
![](https://murhyimgur.oss-cn-beijing.aliyuncs.com/website/image-20220320200745156.png)
- 加密密钥问题,我测试的数量不算特别多,英文和数字均支持,中文不支持;且要求密钥的位数不能过长,不要超过35位,否则会闪退;
- 还是不能做到完全自动化,对方发过来的消息还是需要自己去复制一下,再点击“解密”按键才可以解密的。如果说要解决这个问题的话,我想到的只能是多线程方法,但是这个我并没有学过,一时半会不好试验我的这个想法能不能解决这个问题。