aes文件,sender加密方法和模式选择

sender_okToCheck
UniDarkstars 4 months ago
parent 375642c42d
commit ceb244792b

@ -1,4 +1,7 @@
# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来
from entity.Letter import Letter
from tool.symmetric.AES import AESUtils
def main():
# 用户输入各种数据填充letter字段
@ -6,6 +9,56 @@ def main():
# 使用对方的公钥进行加密
# 发送信件
pass
def sendLetter(letter: Letter, target="192.168.195.162:8426"):
# 向目标ip和端口发送指定的信件
pass
# 选择对称加密的方法和模式(aes/sm2)
def selectSymEncryptionChoice():
encryWay = ""
encryMode = ""
# 选择加密算法
while True:
encryWay = input("Choose the way for encryption (aes/sm2): ").strip().lower() # 统一转成小写
if encryWay in ["aes", "sm2"]:
print(f"You have selected '{encryWay}' encryption.")
break # 输入有效后退出循环
else:
print("Invalid choice. Please enter 'aes' or 'sm2'.")
# 选择加密算法的模式
while True:
if encryWay == "aes":
encryMode = input("Choose the encryption mode (ecb/cbc/cfb/ofb): ").strip().lower()
if encryMode in ["ecb", "cbc", "cfb", "ofb"]:
print(f"You have selected '{encryMode}' encryption mode.")
break # 输入有效后退出循环
else:
print("Invalid choice. Please enter ecb/cbc/cfb/ofb")
elif encryWay == "sm2":
print()
break # 输入有效后退出循环
return encryWay, encryMode
# 使用对称加密,返回加密后的数据和随机生成的密钥
def SymEncryption():
# 获得加密的方法和加密的模式
way, mode = selectSymEncryptionChoice()
if way == "aes":
aesUtils = AESUtils()
encryptedData, key = aesUtils.encrypt("test", mode=mode) # 这里data要改为文件内容
return encryptedData
if way == "sm2":
pass
def getKey():
pass

@ -0,0 +1,35 @@
# "ecb", "cbc", "cfb", "ofb"
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
class AESUtils:
def __init__(self, key: bytes = None):
"""初始化 AES 加密工具,如果没有提供密钥,则生成一个随机密钥"""
if key is None:
self.key = get_random_bytes(32) # AES-256
else:
self.key = key
def encrypt(self, data: str, mode: str = 'ECB') -> str:
"""加密数据"""
cipher = self._get_cipher(mode)
data = pad(data.encode(), AES.block_size) # 填充数据
ciphertext = cipher.encrypt(data)
return base64.b64encode(ciphertext).decode()
def _get_cipher(self, mode: str) -> AES:
"""根据模式返回相应的 AES cipher"""
iv = None
if mode == 'CBC':
iv = get_random_bytes(AES.block_size)
return AES.new(self.key, AES.MODE_CBC, iv), self.key
elif mode == 'CFB':
return AES.new(self.key, AES.MODE_CFB), self.key
elif mode == 'OFB':
return AES.new(self.key, AES.MODE_OFB), self.key
else: # 默认是 ECB
return AES.new(self.key, AES.MODE_ECB), self.key
Loading…
Cancel
Save