pyqt5界面设计之加法乘法加密解密算法(数字字母通享版)

首先要pycharm版本必须在3.9或者3.8,如果python版本过高建议到python官网重新安装并配置环境和解释器

在python3.9中安装两个第三方库,如下

安装过程可参考 

https://zhuanlan.zhihu.com/p/162866700

打开designer.exe

其中明文等字样选中label拖动,文本框选中lineEdit,文本框内的字在右侧属性编辑器找到placeholderText进行输入即可按钮选中pushbutton,对里面的文本进行编辑即可

 解决好后保存为后缀是.ui的文件,回到pycharm中,找到你刚刚保存的文件,右键选中External Tools,选择pyUIC即可将ui文件转化为py文件

(26条消息) 在pycharm中将.ui文件转化为.py文件_pycharm导出.py文件_knighthood2001的博客-CSDN博客

打开py文件,得到下面这部分代码

1.注意核对导入的库是否完全

2.删除三句,注意MainWindows在本文为Caesar

MainWindow.setCentralWidget(self.centralwidget)
MainWindow.setMenuBar(self.menubar)
MainWindow.setStatusBar(self.statusbar)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
class Ui_Caesar(object):
    def setupUi(self, Caesar):
        Caesar.setObjectName("Caesar")
        Caesar.resize(463, 386)
        self.centralwidget = QtWidgets.QWidget(Caesar)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 30, 41, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 50, 421, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 100, 54, 12))
        self.label_2.setObjectName("label_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(30, 120, 91, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(160, 120, 91, 21))
        self.pushButton.setCheckable(False)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.Button1)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 150, 54, 12))
        self.label_3.setObjectName("label_3")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(30, 170, 421, 41))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 220, 54, 12))
        self.label_4.setObjectName("label_4")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setGeometry(QtCore.QRect(30, 240, 91, 21))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(280, 120, 91, 21))
        self.pushButton_2.setCheckable(False)
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.Button2)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setGeometry(QtCore.QRect(30, 290, 421, 51))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(160, 240, 91, 21))
        self.pushButton_3.setCheckable(False)
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_3.clicked.connect(self.Button3)
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21))
        self.pushButton_4.setCheckable(False)
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_4.clicked.connect(self.Button4)
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(30, 270, 81, 16))
        self.label_5.setObjectName("label_5")
        self.menubar = QtWidgets.QMenuBar(Caesar)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 463, 22))
        self.menubar.setObjectName("menubar")
        self.statusbar = QtWidgets.QStatusBar(Caesar)
        self.statusbar.setObjectName("statusbar")
        self.retranslateUi(Caesar)
        QtCore.QMetaObject.connectSlotsByName(Caesar)
def retranslateUi(self, Caesar):
    _translate = QtCore.QCoreApplication.translate
    Caesar.setWindowTitle(_translate("Caesar", "MainWindow"))
    self.label.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">明文</span></p></body></html>"))
    self.lineEdit.setPlaceholderText(_translate("Caesar", "请输入明文"))
    self.lineEdit_2.setPlaceholderText(_translate("Caesar", "请输入加密密钥"))
    self.pushButton.setText(_translate("Caesar", "加法加密"))
    self.label_3.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">密文</span></p></body></html>"))
    self.lineEdit_3.setPlaceholderText(_translate("Caesar", "显示加密后的密文"))
    self.label_4.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密密钥</span></p></body></html>"))
    self.lineEdit_4.setPlaceholderText(_translate("Caesar", "请输入解密密钥"))
    self.pushButton_3.setText(_translate("Caesar", "加法解密"))
    self.lineEdit_5.setPlaceholderText(_translate("Caesar", "显示解密后的明文"))
    self.pushButton_2.setText(_translate("Caesar", "乘法加密"))
    self.pushButton_4.setText(_translate("Caesar", "乘法解密"))
    self.label_5.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密后的明文</span></p></body></html>"))
    self.label_2.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">加密密钥</span></p></body></html>"))

3.在最后放入 

 #显示画面

if __name__ == "__main__":
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#固定窗口大小,保持其与你在designer中的界面大小一致
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    ui = Ui_Caesar()  # 这是原py中的类,因人而异哦,这个Caesar一帮来说是MainWindow
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

 完成上面步骤即可运行看看是否界面有显示

接下来是算法设计

关于按钮这部分需要在四个按钮插入第三句和最后一句

self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21)) self.pushButton_4.setCheckable(False)#设置按钮初始状态

self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.Button4)#当按钮被点击变为True,跳转到Button4这个函数


四个函数对应着加法加密,乘法加密,加法解密,乘法解密 

def Button1(self):
    result=""
    str=self.lineEdit.text()#获取文本框内容
    n=self.lineEdit_2.text()#注意此时获取的形式为字符串
    n=isnumber(n)#实现数字字母通享
    for i in str:
        j=i.upper()
        if 64<ord(j.upper())<92:
            k = chr((((ord(j) - 65) + int(n)) % 26 + 65))
            result += k
        else:
            continue
    self.lineEdit_3.setText(result)#输出到文本框上
def Button2(self):
    result = ""
    str = self.lineEdit.text()
    n = self.lineEdit_2.text()
    n = isnumber(n)
    if int(n)==0:
        msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
        msg_box.exec_()
    elif int(n)<26 and 26%int(n)!=0 and int(n)!=0:
        for i in str:
            j = i.upper()
            if 64 < ord(j.upper()) < 92:
                k = chr((((ord(j) - 65) * int(n)) % 26 + 65))
                result += k
            else:
                continue
        self.lineEdit_3.setText(result)
    else:
        msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
        msg_box.exec_()
def Button3(self):
    result = ""
    str = self.lineEdit_3.text()
    n = self.lineEdit_4.text()
    n = isnumber(n)
    for i in str:
        j=i.upper()
        if 64 < ord(j) < 92:
            k = chr((((ord(j) - 65) - int(n)) % 26 + 65))
            result += k
    self.lineEdit_5.setText(result)
def Button4(self):
    result = ""
    str = self.lineEdit_3.text()
    n = self.lineEdit_4.text()
    n = isnumber(n)
    c=int(n)
    s=findModReverse(c,26)
    print(s)
    for i in str:
        j = i.upper()
        if 64 < ord(j) < 92:
            k = chr((((ord(j) - 65) * s) % 26 + 65))
            result += k
    self.lineEdit_5.setText(result)


用于实现数字字母通享,把输入的密钥进行处理

def isnumber(str):
    if str.isdigit() != 1:
        m = str.upper()
        return ord(m)-65
    else:
        return str

关于加法算法比较简单不展开 

而乘法解密需要求逆,该算法用于求出原来输入密钥的逆

对于p是有要求限制的在乘法加密中,即(n,p)=1,就是n和p要互素(见上面按钮2和4进行判断)


判断以后以弹窗的形式进行提醒 

msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))

msg_box.exec_()


 求逆过程大概为:假设n=26(固定的) p=5

26=5*5+1

1=26-5*5即1=26+(-5)*5

将式子转化为1=n+k*p 此时逆为k  也就是(-5)mod26=21

该算法用于求逆

def gcd(a, b):
    while a != 0:
        a, b = b % a, a
    return b
def findModReverse(n, p):  # 这个扩展欧几里得算法求模逆
    if gcd(n, p) != 1:
        return None
    u1, u2, u3 = 1, 0, n
    v1, v2, v3 = 0, 1, p
    while v3 != 0:
        q = u3 // v3
        v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
    return u1 % p


 代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '密码算法(数字字母通享版).ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
def gcd(a, b):
    while a != 0:
        a, b = b % a, a
    return b
def findModReverse(n, p):  # 这个扩展欧几里得算法求模逆
    if gcd(n, p) != 1:
        return None
    u1, u2, u3 = 1, 0, n
    v1, v2, v3 = 0, 1, p
    while v3 != 0:
        q = u3 // v3
        v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
    return u1 % p
def isnumber(str):
    if str.isdigit() != 1:
        m = str.upper()
        return ord(m)-65
    else:
        return str
class Ui_Caesar(object):
    def setupUi(self, Caesar):
        Caesar.setObjectName("Caesar")
        Caesar.resize(463, 386)
        self.centralwidget = QtWidgets.QWidget(Caesar)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 30, 41, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 50, 421, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 100, 54, 12))
        self.label_2.setObjectName("label_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(30, 120, 91, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(160, 120, 91, 21))
        self.pushButton.setCheckable(False)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.Button1)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 150, 54, 12))
        self.label_3.setObjectName("label_3")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(30, 170, 421, 41))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 220, 54, 12))
        self.label_4.setObjectName("label_4")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setGeometry(QtCore.QRect(30, 240, 91, 21))
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(280, 120, 91, 21))
        self.pushButton_2.setCheckable(False)
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.Button2)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setGeometry(QtCore.QRect(30, 290, 421, 51))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(160, 240, 91, 21))
        self.pushButton_3.setCheckable(False)
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_3.clicked.connect(self.Button3)
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21))
        self.pushButton_4.setCheckable(False)
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_4.clicked.connect(self.Button4)
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(30, 270, 81, 16))
        self.label_5.setObjectName("label_5")
        self.menubar = QtWidgets.QMenuBar(Caesar)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 463, 22))
        self.menubar.setObjectName("menubar")
        self.statusbar = QtWidgets.QStatusBar(Caesar)
        self.statusbar.setObjectName("statusbar")
        self.retranslateUi(Caesar)
        QtCore.QMetaObject.connectSlotsByName(Caesar)
    def Button1(self):
        result=""
        str=self.lineEdit.text()
        n=self.lineEdit_2.text()
        n=isnumber(n)
        for i in str:
            j=i.upper()
            if 64<ord(j.upper())<92:
                k = chr((((ord(j) - 65) + int(n)) % 26 + 65))
                result += k
            else:
                continue
        self.lineEdit_3.setText(result)
    def Button2(self):
        result = ""
        str = self.lineEdit.text()
        n = self.lineEdit_2.text()
        n = isnumber(n)
        if int(n)==0:
            msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
            msg_box.exec_()
        elif int(n)<26 and 26%int(n)!=0 and int(n)!=0:
            for i in str:
                j = i.upper()
                if 64 < ord(j.upper()) < 92:
                    k = chr((((ord(j) - 65) * int(n)) % 26 + 65))
                    result += k
                else:
                    continue
            self.lineEdit_3.setText(result)
        else:
            msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
            msg_box.exec_()
    def Button3(self):
        result = ""
        str = self.lineEdit_3.text()
        n = self.lineEdit_4.text()
        n = isnumber(n)
        for i in str:
            j=i.upper()
            if 64 < ord(j) < 92:
                k = chr((((ord(j) - 65) - int(n)) % 26 + 65))
                result += k
        self.lineEdit_5.setText(result)
    def Button4(self):
        result = ""
        str = self.lineEdit_3.text()
        n = self.lineEdit_4.text()
        n = isnumber(n)
        c=int(n)
        s=findModReverse(c,26)
        for i in str:
            j = i.upper()
            if 64 < ord(j) < 92:
                k = chr((((ord(j) - 65) * s) % 26 + 65))
                result += k
        self.lineEdit_5.setText(result)

    def retranslateUi(self, Caesar):
        _translate = QtCore.QCoreApplication.translate
        Caesar.setWindowTitle(_translate("Caesar", "MainWindow"))
        self.label.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">明文</span></p></body></html>"))
        self.lineEdit.setPlaceholderText(_translate("Caesar", "请输入明文"))
        self.lineEdit_2.setPlaceholderText(_translate("Caesar", "请输入加密密钥"))
        self.pushButton.setText(_translate("Caesar", "加法加密"))
        self.label_3.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">密文</span></p></body></html>"))
        self.lineEdit_3.setPlaceholderText(_translate("Caesar", "显示加密后的密文"))
        self.label_4.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密密钥</span></p></body></html>"))
        self.lineEdit_4.setPlaceholderText(_translate("Caesar", "请输入解密密钥"))
        self.pushButton_3.setText(_translate("Caesar", "加法解密"))
        self.lineEdit_5.setPlaceholderText(_translate("Caesar", "显示解密后的明文"))
        self.pushButton_2.setText(_translate("Caesar", "乘法加密"))
        self.pushButton_4.setText(_translate("Caesar", "乘法解密"))
        self.label_5.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密后的明文</span></p></body></html>"))
        self.label_2.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">加密密钥</span></p></body></html>"))
if __name__ == "__main__":
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    ui = Ui_Caesar()  # 这是原py中的类,因人而异哦
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())









运行结果如下:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值