C/S架构即客户端/服务器端架构,客户端和服务器端之间需要采取通信的手段来实现数据交互。
客户端以JSON数据格式,给服务器端发送数据,服务器根据动作不同,执行不同的操作。
客户端给服务器端发送的报文格式{"action":"add","data":{...}}
服务器端给客户端回复的报文格式{"ans":"....."}
辅助类,长文本加密解密:
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
class Encryption(object):
def __init__(self):
# 伪随机数生成器
self.random_generator = Random.new().read
def getKey(self):
# rsa算法生成实例
rsa = RSA.generate(1024, self.random_generator)
# master的秘钥对的生成
private_pem = rsa.exportKey()
public_pem = rsa.publickey().exportKey()
key={}
key["private"]=private_pem
key["public"] =public_pem
return key
def rsa_long_encrypt(self,msg,pub_key_str, length=100):
"""
单次加密串的长度最大为 (key_size/8)-11
1024bit的证书用100, 2048bit的证书用 200
"""
pubobj = RSA.importKey(pub_key_str)
pubobj = Cipher_pkcs1_v1_5.new(pubobj)
res = []
for i in range(0, len(msg), length):
res.append(
str(
base64.b64encode(pubobj.encrypt(
msg[i:i + length].encode(encoding="utf-8"))), 'utf-8'
)
)
return "".join(res)
def rsa_long_decrypt(self,msg,priv_key_str, length=172):
"""
1024bit的证书用128,2048bit证书用256位
"""
privobj = RSA.importKey(priv_key_str)
privobj = Cipher_pkcs1_v1_5.new(privobj)
res = []
for i in range(0, len(msg), length):
res.append(
str(
privobj.decrypt(
base64.b64decode(msg[i:i + length])
, 'xyz'), 'utf-8'
)
)
return "".join(res)
if __name__ == '__main__':
str1="""{"ans": [{"id": 5, "sno": "6", "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}, {"id": 9, "sno": "99, "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}"""*5
a = Encryption()
# key = a.getKey()
prikey = '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC5GOlknwPrENofdQcu5oXBrVcyPkjkjXIry7Lp3NKwSRqCue+7\nNrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8PeLk4l3plriZUPyuLVM2Qjoh\n8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sadtTAep3Z0xVsY+jevbwIDAQAB\nAoGACBvORaktq8OOOqiOywAwRd7JHhtaaCDGKqL+0H3rAOwC7E0m8mWgQtEbCc0a\nw6jgBxJolbuYytJHCTmzO1MvdIwd1iRfYBqkZT71GxRvsPwN014/TleRRtPR14/s\nyzShjQFxX+QSerF6UYZqWVk8zQm4aWBQ8m5mMd/4ImkLRckCQQDLICMNeNf5QrpI\nFAGZuHYK6Nf/RJHy95O4pd7V8RQ4M3e3nd1VTBKsK8u09lN0SiFtBpH//cDU/Sv9\nR6L52IurAkEA6UdpVQQW5VENTYqkPXvpVUIG3vE62ZFjAqSWfkA/mouIyzcVzl5s\n9zsMZJ+FS/hwyEd7jFRFziNNZ1QS1MwHTQJAJTe2NHm32MwJJbvEr03FEyqmqPb/\nZu1F+8colTqe4c1MWjBqpX5SzYkYwgeAMwaCKV/S0HzGIEBjFv1RN0YeEQJBALmL\nylULtqZZDIqzjqU0zMe6h7qGBvgMcsMkZGsw8SYcfAae3uJRKryOo/HZC+38QsCa\nUsOwOAGZBLT+IyhMzDUCQAm6uJ07t9msJ6IBbp7VvscX9yAGiIvfMEmLWuUkmZXx\nluoyK+3fcPyloPFXp1IfGO+i8oDFjKzmQ9PlaP29aPk=\n-----END RSA PRIVATE KEY-----'
pubkey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5GOlknwPrENofdQcu5oXBrVcy\nPkjkjXIry7Lp3NKwSRqCue+7NrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8\nPeLk4l3plriZUPyuLVM2Qjoh8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sad\ntTAep3Z0xVsY+jevbwIDAQAB\n-----END PUBLIC KEY-----'
print(prikey)
print(pubkey)
print(str1)
cipher_text = a.rsa_long_encrypt(str1,pubkey)
print(cipher_text)
plaintext = a.rsa_long_decrypt(cipher_text,prikey)
print(plaintext)
客户端实现:
UI界面1
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'dialog.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(241, 320)
self.verticalLayoutWidget = QtWidgets.QWidget(Form)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 201, 301))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.snoText = QtWidgets.QLineEdit(self.verticalLayoutWidget)
self.snoText.setObjectName("snoText")
self.horizontalLayout.addWidget(self.snoText)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.nameText = QtWidgets.QLineEdit(self.verticalLayoutWidget)
self.nameText.setObjectName("nameText")
self.horizontalLayout_2.addWidget(self.nameText)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_3.addWidget(self.label_3)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_3.addItem(spacerItem)
self.dateEdit = QtWidgets.QDateEdit(self.verticalLayoutWidget)
self.dateEdit.setObjectName("dateEdit")
self.horizontalLayout_3.addWidget(self.dateEdit)
self.horizontalLayout_3.setStretch(0, 2)
self.horizontalLayout_3.setStretch(1, 2)
self.horizontalLayout_3.setStretch(2, 4)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_

本文介绍了一个基于C/S架构的学生信息管理系统的实现过程,包括客户端与服务器端的通信机制,使用JSON格式进行数据交换,以及利用RSA加密算法确保数据的安全传输。系统通过PyQt5构建了用户界面,并详细展示了如何通过Python的socketserver模块搭建服务器端,同时涵盖了数据库操作、异常处理等关键环节。
最低0.47元/天 解锁文章
1221

被折叠的 条评论
为什么被折叠?



