From 80b6916badcd8c4b3849abe4cfec067476790917 Mon Sep 17 00:00:00 2001 From: mefmagkfc <212697301@qq.com> Date: Thu, 25 Nov 2021 20:37:06 +0800 Subject: [PATCH] ADD file via upload --- client.py | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 client.py diff --git a/client.py b/client.py new file mode 100644 index 0000000..9f249e8 --- /dev/null +++ b/client.py @@ -0,0 +1,270 @@ +# 客户端(用户B) +import os +from tkinter import * +from tkinter.filedialog import askopenfilename +import socket +import threading +from Crypto import Signature +import rsa +from Crypto.Cipher import AES +from binascii import b2a_hex, a2b_hex +import base64 +import hashlib +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 +from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5 +from Crypto.Hash import SHA +from rsa.pkcs1 import sign +import chardet + + +class b(): + def t2(): + client = socket.socket() # 生成socket连接对象 + + ip_port =("localhost", 6969) # 地址和端口号 + + client.connect(ip_port) # 连接 + + print("服务器已连接") + sn=len(path.get().encode("utf-8")) + client.send(str(sn).encode("utf-8")) + # size=os.stat(path.get()).st_size + client.send(path.get().encode("utf-8")) #文件名 + client.send(mode.get().encode("utf-8")) + #读取密钥 + rsakey2 = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/kb/private.pem").read()) + signer = Signature_pkcs1_v1_5.new(rsakey2) + digest = SHA.new() + if mode.get()=="rsa": + + rsakey = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/ka/public.pem").read()) + cipher = Cipher_pkcs1_v1_5.new(rsakey) #创建用于执行pkcs1_v1_5加密或解密的密码 + + # cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8'))) + f=open(path.get(),"rb") + for line in f: + # print(pr.decode("utf-8")) + digest.update(line) + crypto=base64.b64encode(cipher.encrypt(line)) + size=len(crypto) + client.send(str(size).encode("utf-8")) + client.send(crypto) + + f.close() + sign=signer.sign(digest) + Signature=base64.b64encode(sign) + + client.send(' '.encode("utf-8")) #停止接收文件,开始接收摘要 + # client.send(str(len(Signature)).encode("utf-8")) + client.send(str(len(Signature)).encode("utf-8")) + client.send(Signature) + + + #AES + elif mode.get()=="aes": + + fk=open("C:/Users/Shinelon/Desktop/综合实验/kb/aeskey.pem", 'rb') + AESKEY=fk.read() + fk.close() + + rsakey = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/ka/public.pem").read()) + cipher = Cipher_pkcs1_v1_5.new(rsakey) + crypto=base64.b64encode(cipher.encrypt(AESKEY)) + client.send(str(len(crypto)).encode("utf-8")) + client.send(crypto) + + model = AES.MODE_ECB + aes = AES.new(add_to_16(AESKEY),model) + f=open(path.get(),"rb") + for line in f: + # print(pr.decode("utf-8")) + digest.update(line) + crypto=add_to_16(line) + crypto=aes.encrypt(crypto) + crypto=base64.encodebytes(crypto).decode().strip() + + size=len(crypto) + s=len(str(size)) + client.send(str(s).encode("utf-8")) + client.send(str(size).encode("utf-8")) + client.send(crypto.encode("utf-8")) + f.close() + + sign=signer.sign(digest) + Signature=base64.b64encode(sign) + client.send(' '.encode("utf-8")) #停止接收文件,开始接收摘要 + # client.send(str(len(Signature)).encode("utf-8")) + client.send(str(len(Signature)).encode("utf-8")) + + client.send(Signature) + + + +def t3(): + server = socket.socket() + + server.bind(("localhost", 6970)) # 绑定监听端口 + server.listen(5) # 监听 + print("监听开始..") + while True: + conn, addr = server.accept() # 等待连接 + + print("conn:", conn, "\naddr:", addr) # conn连接实例 + # while True: + sn=conn.recv(2) + fname=conn.recv(int(sn)) + filename=fname.decode("utf-8") + fl=filename.split("/") + fl[5]="a2b"+fl[5] + filename="/".join(fl) + mode=conn.recv(3) + mode=mode.decode("utf-8") + mode1.set(mode) + + if mode=="rsa": + f=open(filename,"wb") + rsakey = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/kb/private.pem").read()) + cipher = Cipher_pkcs1_v1_5.new(rsakey) + # received_size=0 + while True: + size=conn.recv(3) + size=size.decode("utf-8") + if size!=' ': + size=int(size) + data=conn.recv(size) + data=cipher.decrypt(base64.b64decode(data), "解密失败") + f.write(data) + else: + break + f.close() + sl=conn.recv(3) + Signature=conn.recv(int(sl.decode("utf-8"))) + rsakey2 = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/ka/public.pem").read()) + verifier = Signature_pkcs1_v1_5.new(rsakey2) + hsmsg = SHA.new() + f=open(filename,"rb") + for line in f: + hsmsg.update(line) + f.close() + is_verify = verifier.verify(hsmsg, base64.b64decode(Signature.decode("utf-8"))) + if is_verify: + result.set("文件未被篡改") + else: + result.set("文件可能被篡改") + + + + elif mode=="aes": + #获取密钥 + kl=conn.recv(3) + kl=int(kl.decode("utf-8")) + key=conn.recv(kl) + rsakey = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/kb/private.pem").read()) + cipher = Cipher_pkcs1_v1_5.new(rsakey) + AESKEY=cipher.decrypt(base64.b64decode(key), "解密失败") + model = AES.MODE_ECB + aes = AES.new(add_to_16(AESKEY),model) + + f=open(filename,"wb") + while True: + s=conn.recv(1) + s=s.decode("utf-8") + if s!=' ': + s=int(s) + size=conn.recv(s) + size=size.decode("utf-8") + size=int(size) + data=conn.recv(size) + data=base64.decodebytes(data) + data=str(aes.decrypt(add_to_16(data)),encoding="GBK").strip('\0') + f.write(data.encode("GBK")) + else: + break + f.close() + sl=conn.recv(3) + Signature=conn.recv(int(sl.decode("utf-8"))) + # Signature=conn.recv(172) + print(Signature) + rsakey2 = RSA.importKey(open("C:/Users/Shinelon/Desktop/综合实验/ka/public.pem").read()) + verifier = Signature_pkcs1_v1_5.new(rsakey2) + hsmsg = SHA.new() + + + f=open(filename,"rb") + for line in f: + hsmsg.update(line) + f.close() + is_verify = verifier.verify(hsmsg, base64.b64decode(Signature.decode("utf-8"))) + if is_verify: + result.set("文件未被篡改") + else: + result.set("文件可能被篡改") + if 1==2: + break + + server.close() + +root = Tk() +path = StringVar() +state = StringVar() +mode1=StringVar() +result=StringVar() +path = StringVar() +state = StringVar() +mode=StringVar() +root.title("client") + +def createkey(): #生成密钥 + (pubkey, privkey) = rsa.newkeys(1024) +# 生成公钥 + pub = pubkey.save_pkcs1() + + pubfile = open("C:/Users/Shinelon/Desktop/综合实验/kb/public.pem", 'wb') + pubfile.write(pub) + pubfile.close() + + # 生成私钥 + pri = privkey.save_pkcs1() + prifile = open("C:/Users/Shinelon/Desktop/综合实验/kb/private.pem", 'wb') + prifile.write(pri) + prifile.close() + +def selectPath(): #获取文件路径 + path_ = askopenfilename() + path.set(path_) + + print(path_) + +def add_to_16(par): + # par = par.encode() #先将字符串类型数据转换成字节型数据 + while len(par) % 16 != 0: #对字节型数据进行长度判断 + par += b'\x00' #如果字节型数据长度不是16倍整数就进行 补充 + return par + + +def t1(): + mode.set(m.get()) + t2=threading.Thread(target=b.t2) + t2.start() +Label(root,text = "发送:").grid(row = 0, column = 0) +Entry(root, textvariable = path).grid(row = 1, column = 1) +Button(root, text = "路径选择", command = selectPath).grid(row = 1, column = 0) +Label(root,text = "加密模式:").grid(row = 2, column = 0) +m=Entry(root, textvariable = mode) +m.grid(row = 2, column = 1) +Button(root,text="生成密钥" ,command=createkey).grid(row=3,column=0) +Button(root,text="发送" ,command=t1).grid(row=3,column=1) + +Label(root,text = "接收:").grid(row = 4, column = 0) +Label(root,text = "加密模式:").grid(row = 5, column = 0) +Entry(root, textvariable = mode1).grid(row = 5, column = 1) +Label(root,text = "验证结果:").grid(row = 6, column = 0) +Entry(root, textvariable = result).grid(row = 6, column = 1) + +t3=threading.Thread(target=t3) +t3.start() +root.mainloop() + + +