修正sender_net无法发送文件问题

修正测试用例
完成sender.py的发送者和接收方显示
main
Timmoc 3 months ago
parent 0667abe75f
commit ac69ed5917

@ -4,28 +4,28 @@ import recv
from senders import sender from senders import sender
@patch('builtins.input', side_effect=['../README.md', 'aes', 'ecb']) @patch('builtins.input', side_effect=['../README.md',r'D:\Users\Timmoc\AppData\Roaming\fst\public.pem','aes', 'ecb'])
def test_handleLetter_aes_ecb(mock_input): def test_handleLetter_aes_ecb(mock_input):
letter = sender.main() letter = sender.main()
recv.handleLetter(letter) recv.handleLetter(letter)
pass pass
@patch('builtins.input', side_effect=['../README.md', 'aes', 'cbc']) @patch('builtins.input', side_effect=['../README.md',r'D:\Users\Timmoc\AppData\Roaming\fst\public.pem', 'aes', 'cbc'])
def test_handleLetter_aes_cbc(mock_input): def test_handleLetter_aes_cbc(mock_input):
letter = sender.main() letter = sender.main()
recv.handleLetter(letter) recv.handleLetter(letter)
pass pass
@patch('builtins.input', side_effect=['../README.md', 'sm4', 'ecb']) @patch('builtins.input', side_effect=['../README.md',r'D:\Users\Timmoc\AppData\Roaming\fst\public.pem', 'sm4', 'ecb'])
def test_handleLetter_sm4_ecb(mock_input): def test_handleLetter_sm4_ecb(mock_input):
letter = sender.main() letter = sender.main()
recv.handleLetter(letter) recv.handleLetter(letter)
pass pass
@patch('builtins.input', side_effect=['../README.md', 'sm4', 'cbc']) @patch('builtins.input', side_effect=['../README.md',r'D:\Users\Timmoc\AppData\Roaming\fst\public.pem', 'sm4', 'cbc'])
def test_handleLetter_sm4_cbc(mock_input): def test_handleLetter_sm4_cbc(mock_input):
letter = sender.main() letter = sender.main()
recv.handleLetter(letter) recv.handleLetter(letter)

@ -1,26 +1,25 @@
# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来 # 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来
import pyfiglet
import base64 import base64
import os import os
import pyfiglet
from Crypto.Random import get_random_bytes
from entity.Letter import Letter from entity.Letter import Letter
from tool import PriKeyHelper from tool import PriKeyHelper
from tool.PriKeyHelper import getUserKey from tool.PriKeyHelper import getUserKey
from tool.asymmetric import RSA from tool.asymmetric import RSA
from tool.hash import Segwit
from tool.symmetric.AES import AESUtils from tool.symmetric.AES import AESUtils
from tool.symmetric.SM4 import encrypt_ecb, encrypt_cbc_with_iv from tool.symmetric.SM4 import encrypt_ecb, encrypt_cbc_with_iv
from Crypto.Random import get_random_bytes
# 三个全局变量,记录信封 # 三个全局变量,记录信封
letterWay = "" letterWay = ""
letterMode = "" letterMode = ""
letterSymKey = b"" letterSymKey = b""
def main():
def main():
# greet # greet
print("") print("")
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
@ -35,14 +34,13 @@ def main():
# 用户输入各种数据填充letter字段 # 用户输入各种数据填充letter字段
path = selectFile() path = selectFile()
with open(path,"rb") as f: with open(path, "rb") as f:
data = f.read() data = f.read()
letter.fileName = getFileName(path) letter.fileName = getFileName(path)
letter.recvPubKey = getRecvPubKey() letter.recvPubKey = getRecvPubKey()
letter.senderPubKey = getSenderPubKey() letter.senderPubKey = getSenderPubKey()
letter.fileBase64, akey = SymEncryption(base64.b64encode(data).decode("utf-8"),letterSymKey) letter.fileBase64, akey = SymEncryption(base64.b64encode(data).decode("utf-8"), letterSymKey)
letter.encryptKey = getEncryptKey(letter.recvPubKey) letter.encryptKey = getEncryptKey(letter.recvPubKey)
letter.encryptType = getEncryptType() letter.encryptType = getEncryptType()
@ -56,12 +54,19 @@ def main():
print(letter.recvPubKey) print(letter.recvPubKey)
print(letter.senderPubKey) print(letter.senderPubKey)
# by Timmoc
print(
f"已以 {Segwit.encodeSegwit(letter.senderPubKey.encode('utf-8'))} 的身份向"
f" {Segwit.encodeSegwit(letter.recvPubKey.encode('utf-8'))} 生成加密信件")
# by Timmoc
# 获取用户的公私钥对进行签名 # 获取用户的公私钥对进行签名
# 使用对方的公钥进行加密 # 使用对方的公钥进行加密
# 发送信件 # 发送信件
return letter # 方便recv测试以后可以删除。 return letter # 方便recv测试以后可以删除。
pass pass
def selectFile() -> str: def selectFile() -> str:
# s = "public.pem" # s = "public.pem"
while True: while True:
@ -69,7 +74,7 @@ def selectFile() -> str:
s = input("输入文件路径:") s = input("输入文件路径:")
with open(s, "rb") as _: with open(s, "rb") as _:
pass pass
return s return s
except FileNotFoundError: except FileNotFoundError:
print("错误: 文件未找到,请输入正确的文件路径。") print("错误: 文件未找到,请输入正确的文件路径。")
except PermissionError: except PermissionError:
@ -77,11 +82,13 @@ def selectFile() -> str:
except Exception as e: except Exception as e:
print(f"发生未知错误: {e}") print(f"发生未知错误: {e}")
# 获得文件名 # 获得文件名
def getFileName(fName:str) -> str: def getFileName(fName: str) -> str:
filePath = os.path.split(fName) filePath = os.path.split(fName)
return filePath[-1] return filePath[-1]
def sendLetter(letter: Letter, target="192.168.195.162:8426"): def sendLetter(letter: Letter, target="192.168.195.162:8426"):
# 向目标ip和端口发送指定的信件 # 向目标ip和端口发送指定的信件
pass pass
@ -129,7 +136,6 @@ def selectSymEncryptionChoice():
# 使用对称加密,返回加密后的数据和随机生成的密钥 # 使用对称加密,返回加密后的数据和随机生成的密钥
def SymEncryption(encryData, key: bytes = None): def SymEncryption(encryData, key: bytes = None):
global letterSymKey global letterSymKey
# 获得加密的方法和加密的模式 # 获得加密的方法和加密的模式
way, mode = selectSymEncryptionChoice() way, mode = selectSymEncryptionChoice()
@ -139,7 +145,7 @@ def SymEncryption(encryData, key: bytes = None):
encryptedData, trueKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容 encryptedData, trueKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容
letterSymKey = trueKey letterSymKey = trueKey
return encryptedData,trueKey return encryptedData, trueKey
if way == "sm4": if way == "sm4":
key = get_random_bytes(16) key = get_random_bytes(16)
@ -151,27 +157,30 @@ def SymEncryption(encryData, key: bytes = None):
letterSymKey = key letterSymKey = key
return encrypted_data, key return encrypted_data, key
# 获得签名 # 获得签名
def getSign(document_bytes): def getSign(document_bytes):
# 计算文件bytes
#计算文件bytes
priKey, pubKey = PriKeyHelper.getUserKey() priKey, pubKey = PriKeyHelper.getUserKey()
signDocuHash = RSA.sign_message(document_bytes, priKey) signDocuHash = RSA.sign_message(document_bytes, priKey)
return signDocuHash return signDocuHash
# 获得加密的方法和模式,封装信封 # 获得加密的方法和模式,封装信封
def getEncryptType(): def getEncryptType():
encryType = f"{letterWay}_{letterMode}".upper() encryType = f"{letterWay}_{letterMode}".upper()
return encryType return encryType
# 对称密钥,返回的是使用接收方公钥加密后的对称密钥 # 对称密钥,返回的是使用接收方公钥加密后的对称密钥
def getEncryptKey(getRecvPubKey): def getEncryptKey(getRecvPubKey):
rsaEncrySymKey = RSA.encrypt_message(letterSymKey, getRecvPubKey) rsaEncrySymKey = RSA.encrypt_message(letterSymKey, getRecvPubKey)
return base64.b64encode(rsaEncrySymKey).decode("utf-8") return base64.b64encode(rsaEncrySymKey).decode("utf-8")
# 获得接收方的公钥 # 获得接收方的公钥
def getRecvPubKey(): def getRecvPubKey():
# recPubKey = input(" plz input Receiver's Public Key: ") # recPubKey = input(" plz input Receiver's Public Key: ")
@ -182,6 +191,7 @@ def getRecvPubKey():
recPubKey = base64.b64encode(data).decode('utf-8') recPubKey = base64.b64encode(data).decode('utf-8')
return recPubKey return recPubKey
# 获得发送方的公钥 # 获得发送方的公钥
def getSenderPubKey(): def getSenderPubKey():
privateKey, publicKey = getUserKey() privateKey, publicKey = getUserKey()
@ -198,4 +208,4 @@ if __name__ == "__main__":
# #
# encryptType = f"{letterWay}_{letterMode}".upper() # encryptType = f"{letterWay}_{letterMode}".upper()
# print(encryptType) # print(encryptType)
main() main()

Loading…
Cancel
Save