|
|
|
@ -1,34 +1,26 @@
|
|
|
|
|
# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来
|
|
|
|
|
import pyfiglet
|
|
|
|
|
|
|
|
|
|
import base64
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
import pyfiglet
|
|
|
|
|
from Crypto.Random import get_random_bytes
|
|
|
|
|
|
|
|
|
|
from entity.Letter import Letter
|
|
|
|
|
from tool import PriKeyHelper
|
|
|
|
|
from tool.PriKeyHelper import getUserKey
|
|
|
|
|
from tool.asymmetric import RSA
|
|
|
|
|
from tool.hash import Segwit
|
|
|
|
|
from tool.symmetric.AES import AESUtils
|
|
|
|
|
from tool.symmetric.SM4 import encrypt_ecb, encrypt_cbc_with_iv
|
|
|
|
|
from Crypto.Random import get_random_bytes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 三个全局变量,记录信封
|
|
|
|
|
letterWay = ""
|
|
|
|
|
letterMode = ""
|
|
|
|
|
letterSymKey = b""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
# greet
|
|
|
|
|
print("")
|
|
|
|
|
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
|
|
|
|
greet = pyfiglet.figlet_format("File Secure Transfer", font="slant", width=250)
|
|
|
|
|
print(greet)
|
|
|
|
|
print(" <For Secure And Fast File Transfer>")
|
|
|
|
|
author = " <-Made By Li-Nuo-Cheng Tan-Jun-Wen Ren-Qing-Yu->"
|
|
|
|
|
print(author)
|
|
|
|
|
print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
letter = Letter()
|
|
|
|
|
# 用户输入各种数据填充letter字段
|
|
|
|
@ -37,6 +29,7 @@ def main():
|
|
|
|
|
with open(path,"rb") as f:
|
|
|
|
|
data = f.read()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
letter.fileName = getFileName(path)
|
|
|
|
|
letter.recvPubKey = getRecvPubKey()
|
|
|
|
|
letter.senderPubKey = getSenderPubKey()
|
|
|
|
@ -54,19 +47,12 @@ def main():
|
|
|
|
|
print(letter.recvPubKey)
|
|
|
|
|
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测试,以后可以删除。
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def selectFile() -> str:
|
|
|
|
|
# s = "public.pem"
|
|
|
|
|
while True:
|
|
|
|
@ -82,13 +68,11 @@ def selectFile() -> str:
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"发生未知错误: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获得文件名
|
|
|
|
|
def getFileName(fName:str) -> str:
|
|
|
|
|
filePath = os.path.split(fName)
|
|
|
|
|
return filePath[-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def sendLetter(letter: Letter, target="192.168.195.162:8426"):
|
|
|
|
|
# 向目标ip和端口发送指定的信件
|
|
|
|
|
pass
|
|
|
|
@ -136,6 +120,7 @@ def selectSymEncryptionChoice():
|
|
|
|
|
|
|
|
|
|
# 使用对称加密,返回加密后的数据和随机生成的密钥
|
|
|
|
|
def SymEncryption(encryData, key: bytes = None):
|
|
|
|
|
|
|
|
|
|
global letterSymKey
|
|
|
|
|
# 获得加密的方法和加密的模式
|
|
|
|
|
way, mode = selectSymEncryptionChoice()
|
|
|
|
@ -157,30 +142,27 @@ def SymEncryption(encryData, key: bytes = None):
|
|
|
|
|
letterSymKey = key
|
|
|
|
|
return encrypted_data, key
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获得签名
|
|
|
|
|
def getSign(document_bytes):
|
|
|
|
|
|
|
|
|
|
#计算文件bytes
|
|
|
|
|
priKey, pubKey = PriKeyHelper.getUserKey()
|
|
|
|
|
signDocuHash = RSA.sign_message(document_bytes, priKey)
|
|
|
|
|
|
|
|
|
|
return signDocuHash
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获得加密的方法和模式,封装信封
|
|
|
|
|
def getEncryptType():
|
|
|
|
|
encryType = f"{letterWay}_{letterMode}".upper()
|
|
|
|
|
|
|
|
|
|
return encryType
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 对称密钥,返回的是使用接收方公钥加密后的对称密钥
|
|
|
|
|
def getEncryptKey(getRecvPubKey):
|
|
|
|
|
rsaEncrySymKey = RSA.encrypt_message(letterSymKey, getRecvPubKey)
|
|
|
|
|
|
|
|
|
|
return base64.b64encode(rsaEncrySymKey).decode("utf-8")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获得接收方的公钥
|
|
|
|
|
def getRecvPubKey():
|
|
|
|
|
# recPubKey = input(" plz input Receiver's Public Key: ")
|
|
|
|
@ -191,7 +173,6 @@ def getRecvPubKey():
|
|
|
|
|
recPubKey = base64.b64encode(data).decode('utf-8')
|
|
|
|
|
return recPubKey
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获得发送方的公钥
|
|
|
|
|
def getSenderPubKey():
|
|
|
|
|
privateKey, publicKey = getUserKey()
|
|
|
|
|