Compare commits

...

7 Commits

@ -1,13 +1,15 @@
from enum import Enum, auto from enum import Enum, auto
from tool.DownloadPathTool import get_config_path
port = 8426 port = 8426
priKeySavePath = "./private.pem" configPath = get_config_path()
pubKeySavePath = "./public.pem" priKeySavePath = f"{configPath}/private.pem"
pubKeySavePath = f"{configPath}/public.pem"
class EncryptType(Enum): class EncryptType(Enum):
AES_ECB = auto() AES_ECB = auto()
AES_CBC = auto() AES_CBC = auto()
AES_CFB = auto()
AES_OFB = auto()
SM4_ECB = auto() SM4_ECB = auto()
SM4_CBC = auto() SM4_CBC = auto()

@ -42,9 +42,9 @@ def handleLetter(letter: Letter):
elif type == config.EncryptType.SM4_CBC: elif type == config.EncryptType.SM4_CBC:
data = base64.b64decode(SM4.decrypt_cbc_with_iv(letter.fileBase64, key)) data = base64.b64decode(SM4.decrypt_cbc_with_iv(letter.fileBase64, key))
elif type == config.EncryptType.AES_ECB: elif type == config.EncryptType.AES_ECB:
data = base64.b64decode(AES.AESUtils(key).decrypt(key, letter.fileBase64, "ecb")) data = base64.b64decode(AES.AESUtils().decrypt(key, letter.fileBase64, "ecb"))
elif type == config.EncryptType.AES_CBC: elif type == config.EncryptType.AES_CBC:
data = base64.b64decode(AES.AESUtils(key).decrypt(key, letter.fileBase64,"cbc")) data = base64.b64decode(AES.AESUtils().decrypt(key, letter.fileBase64,"cbc"))
else: else:
raise KeyError("不支持的对称加密算法") raise KeyError("不支持的对称加密算法")

@ -43,7 +43,7 @@ def main():
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.encryptKey = getEncryptKey(letter.recvPubKey)
letter.encryptType = getEncryptType() letter.encryptType = getEncryptType()
letter.sign = getSign(data) letter.sign = getSign(data)
@ -106,13 +106,13 @@ def selectSymEncryptionChoice():
# 选择加密算法的模式 # 选择加密算法的模式
while True: while True:
if encryWay == "aes": if encryWay == "aes":
encryMode = input("选择加密算法模式 (ecb/cbc/cfb/ofb): ").strip().lower() encryMode = input("选择加密算法模式 (ecb/cbc): ").strip().lower()
if encryMode in ["ecb", "cbc", "cfb", "ofb"]: if encryMode in ["ecb", "cbc"]:
letterMode = encryMode letterMode = encryMode
print(f"已选择 '{encryMode}' 加密模式.") print(f"已选择 '{encryMode}' 加密模式.")
break # 输入有效后退出循环 break # 输入有效后退出循环
else: else:
print("非法输入,请输入 ecb/cbc/cfb/ofb") print("非法输入,请输入 ecb/cbc")
elif encryWay == "sm4": elif encryWay == "sm4":
encryMode = input("选择加密模式 (ecb/cbc): ").strip().lower() encryMode = input("选择加密模式 (ecb/cbc): ").strip().lower()
@ -166,16 +166,20 @@ def getEncryptType():
return encryType return encryType
# 对称密钥,返回的是使用接收方公钥加密后的密钥 # 对称密钥,返回的是使用接收方公钥加密后的对称密钥
def getEncryptKey(): 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: ")
recPubKey = getUserKey()[1] # 在某某地方获得对方的公钥,然后保存到某个地方,输入路径
recPubKeyPath = input("请输入接受方的公钥文件路径:")
with open(recPubKeyPath, "rb") as f:
data = f.read()
recPubKey = base64.b64encode(data).decode('utf-8')
return recPubKey return recPubKey
# 获得发送方的公钥 # 获得发送方的公钥

@ -3,6 +3,18 @@ import sys
import winreg import winreg
from pathlib import Path from pathlib import Path
def get_config_path():
if sys.platform == 'win32':
# 展开环境变量并转换为标准格式
download_dir = Path(os.path.expandvars("%appdata%/fst")).resolve()
else:
# 对于非 Windows 系统,使用 ~\Downloads 作为默认下载目录
home_dir = Path.home()
download_dir = home_dir / 'fst'
dir_path = Path(download_dir)
if not dir_path.exists():
dir_path.mkdir(parents=True, exist_ok=True)
return str(download_dir)
def get_download_directory(): def get_download_directory():
if sys.platform == 'win32': if sys.platform == 'win32':

@ -24,27 +24,19 @@ class AESUtils:
def _get_encipher(self, mode: str) -> AES: def _get_encipher(self, mode: str) -> AES:
"""根据模式返回相应的加密 AES cipher""" """根据模式返回相应的加密 AES cipher"""
iv = None iv = b'abcdefghijklmnop'
if mode == 'CBC': if mode == 'CBC':
iv = get_random_bytes(AES.block_size) iv = get_random_bytes(AES.block_size)
return AES.new(self.key, AES.MODE_CBC, iv) return AES.new(self.key, AES.MODE_CBC, iv)
elif mode == 'CFB':
return AES.new(self.key, AES.MODE_CFB)
elif mode == 'OFB':
return AES.new(self.key, AES.MODE_OFB)
else: # 默认是 ECB else: # 默认是 ECB
return AES.new(self.key, AES.MODE_ECB) return AES.new(self.key, AES.MODE_ECB)
def _get_decipher(self, dekey, mode: str) -> AES: def _get_decipher(self, dekey, mode: str) -> AES:
"""根据模式返回相应的解密 AES cipher""" """根据模式返回相应的解密 AES cipher"""
iv = None iv = b'abcdefghijklmnop'
if mode == 'CBC': if mode == 'CBC':
iv = get_random_bytes(AES.block_size) iv = get_random_bytes(AES.block_size)
return AES.new(dekey, AES.MODE_CBC, iv) return AES.new(dekey, AES.MODE_CBC, iv)
elif mode == 'CFB':
return AES.new(dekey, AES.MODE_CFB)
elif mode == 'OFB':
return AES.new(dekey, AES.MODE_OFB)
else: # 默认是 ECB else: # 默认是 ECB
return AES.new(dekey, AES.MODE_ECB) return AES.new(dekey, AES.MODE_ECB)

Loading…
Cancel
Save