sender修改了加密,并且进行了优化了输出格式和代码,letter就改了一下格式,AES完成

sender_okToCheck
UniDarkstars 4 months ago
parent 685bccaa93
commit b3a21d30cd

@ -1,6 +1,6 @@
class Letter: class Letter:
sign = "计算得到" sign = "计算得到"
encryptType = "SM4-GCM" encryptType = "SM4_GCM"
encryptKey = "计算获得" encryptKey = "计算获得"
recvPubKey = "" recvPubKey = ""
senderPubKey = "" senderPubKey = ""

@ -1,7 +1,12 @@
# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来 # 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来
from entity.Letter import Letter from entity.Letter import Letter
from tool.symmetric.AES import AESUtils from tool.symmetric.AES import AESUtils
from tool.symmetric.SM4 import encrypt_ecb, decrypt_cbc_with_iv
from Crypto.Random import get_random_bytes
# 两个变量,记录信封
letterWay = ""
letterMode = ""
def main(): def main():
# 用户输入各种数据填充letter字段 # 用户输入各种数据填充letter字段
@ -16,33 +21,40 @@ def sendLetter(letter: Letter, target="192.168.195.162:8426"):
pass pass
# 选择对称加密的方法和模式(aes/sm2) # 选择对称加密的方法和模式(aes/sm4)
def selectSymEncryptionChoice(): def selectSymEncryptionChoice():
global letterWay, letterMode
encryWay = "" encryWay = ""
encryMode = "" encryMode = ""
# 选择加密算法 # 选择加密算法
while True: while True:
encryWay = input("Choose the way for encryption (aes/sm2): ").strip().lower() # 统一转成小写 encryWay = input("Choose the way for encryption (aes/sm4): ").strip().lower() # 统一转成小写
if encryWay in ["aes", "sm2"]: if encryWay in ["aes", "sm4"]:
letterWay = encryWay
print(f"You have selected '{encryWay}' encryption.") print(f"You have selected '{encryWay}' encryption.")
break # 输入有效后退出循环 break # 输入有效后退出循环
else: else:
print("Invalid choice. Please enter 'aes' or 'sm2'.") print("Invalid choice. Please enter 'aes' or 'sm4'.")
# 选择加密算法的模式 # 选择加密算法的模式
while True: while True:
if encryWay == "aes": if encryWay == "aes":
encryMode = input("Choose the encryption mode (ecb/cbc/cfb/ofb): ").strip().lower() encryMode = input("Choose the encryption mode (ecb/cbc/cfb/ofb): ").strip().lower()
if encryMode in ["ecb", "cbc", "cfb", "ofb"]: if encryMode in ["ecb", "cbc", "cfb", "ofb"]:
letterMode = encryMode
print(f"You have selected '{encryMode}' encryption mode.") print(f"You have selected '{encryMode}' encryption mode.")
break # 输入有效后退出循环 break # 输入有效后退出循环
else: else:
print("Invalid choice. Please enter ecb/cbc/cfb/ofb") print("Invalid choice. Please enter ecb/cbc/cfb/ofb")
elif encryWay == "sm2": elif encryWay == "sm4":
print() encryMode = input("Choose the encryption mode (ecb/cbc): ").strip().lower()
if encryMode in ["ecb", "cbc"]:
print(f"You have selected '{encryMode}' encryption mode.")
break # 输入有效后退出循环 break # 输入有效后退出循环
else:
print("Invalid choice. Please enter ecb/cbc")
return encryWay, encryMode return encryWay, encryMode
@ -54,12 +66,18 @@ def SymEncryption(encryData, key: bytes = None):
if way == "aes": if way == "aes":
aesUtils = AESUtils(key) aesUtils = AESUtils(key)
# tureKey 为 真实返回的Key如果没有设置初始值那么key是随机生成 encryptedData, trueKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容
encryptedData, tureKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容 return encryptedData,trueKey
return encryptedData,tureKey
if way == "sm4":
key = get_random_bytes(16)
if mode == "ecb":
encrypted_data = encrypt_ecb(data, key)
# mode 为 cbc
else:
encrypted_data = decrypt_cbc_with_iv(data, key)
if way == "sm2": return encrypted_data, key
pass
def getKey(): def getKey():
@ -69,9 +87,10 @@ def getKey():
if __name__ == "__main__": if __name__ == "__main__":
# 示例数据和密钥 # 示例数据和密钥
data = "Hello, AES!" data = "Hello, AES!"
# key = "1234567890abcdef"
print(data)
data,key = SymEncryption(data) data, akey = SymEncryption(data)
print(data,akey)
print(data,key) encryptType = f"{letterWay}_{letterMode}".upper()
print(encryptType)

@ -4,14 +4,13 @@ from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes from Crypto.Random import get_random_bytes
import base64 import base64
from fontTools.misc.eexec import encrypt
class AESUtils: class AESUtils:
def __init__(self, key: bytes = None): def __init__(self, key: bytes = None):
"""初始化 AES 加密工具,如果没有提供密钥,则生成一个随机密钥""" """生成一个随机密钥"""
if key is None: self.key = get_random_bytes(32)
self.key = get_random_bytes(32) # AES-256
else:
self.key = key
def encrypt(self, data: str, mode: str = 'ECB') -> (str,str): def encrypt(self, data: str, mode: str = 'ECB') -> (str,str):
"""加密数据""" """加密数据"""
@ -20,6 +19,13 @@ class AESUtils:
ciphertext = cipher.encrypt(data) ciphertext = cipher.encrypt(data)
return base64.b64encode(ciphertext).decode(), self.key return base64.b64encode(ciphertext).decode(), self.key
def decrypt(self, encrypted_data: str, mode: str = 'ECB') -> str:
"""解密数据"""
cipher = self._get_cipher(mode)
encrypted_data = base64.b64decode(encrypted_data)
plaintext = unpad(cipher.decrypt(encrypted_data), AES.block_size)
return plaintext.decode()
def _get_cipher(self, mode: str) -> AES: def _get_cipher(self, mode: str) -> AES:
"""根据模式返回相应的 AES cipher""" """根据模式返回相应的 AES cipher"""
iv = None iv = None
@ -33,3 +39,12 @@ class AESUtils:
else: # 默认是 ECB else: # 默认是 ECB
return AES.new(self.key, AES.MODE_ECB) return AES.new(self.key, AES.MODE_ECB)
if __name__ == "__main__":
# 示例数据和密钥
data = "Hello, SM4!"
key = "1234567890abcdef"
enData , akey = AESUtils(key)
print(enData)

Loading…
Cancel
Save