# 模式,文件,自己的公钥从哪里来,别人的公钥从哪里来 import base64 from entity.Letter import Letter from itsdangerous import base64_encode from tool import PriKeyHelper from tool.PriKeyHelper import getUserKey from tool.asymmetric import RSA from tool.symmetric.AES import AESUtils from tool.symmetric.SM4 import encrypt_ecb, decrypt_cbc_with_iv, encrypt_cbc_with_iv from Crypto.Random import get_random_bytes # 两个变量,记录信封 letterWay = "" letterMode = "" letterSymKey = b"" def main(): letter = Letter() # 用户输入各种数据填充letter字段 path = selectFile() with open(path,"rb") as f: data = f.read() letter.fileName = "交给你了" letter.recvPubKey = getRecvPubKey() letter.senderPubKey = getSenderPubKey() letter.fileBase64, akey = SymEncryption(base64_encode(data).decode("utf-8"),letterSymKey) # data = "Hello, AES!" letter.encryptKey = getEncryptKey() letter.encryptType = getEncryptType() letter.sign = getSign(data) print(letter.sign) print(letter.encryptType) print(letter.encryptKey) print(letter.recvPubKey) print(letter.senderPubKey) # 获取用户的公私钥对进行签名 # 使用对方的公钥进行加密 # 发送信件 return letter # 方便recv测试,以后可以删除。 pass def selectFile() -> str: s = input("输入文件路径:") return s def sendLetter(letter: Letter, target="192.168.195.162:8426"): # 向目标ip和端口发送指定的信件 pass # 选择对称加密的方法和模式(aes/sm4) def selectSymEncryptionChoice(): global letterWay, letterMode encryWay = "" encryMode = "" # 选择加密算法 while True: encryWay = input("Choose the way for encryption (aes/sm4): ").strip().lower() # 统一转成小写 if encryWay in ["aes", "sm4"]: letterWay = encryWay print(f"You have selected '{encryWay}' encryption.") break # 输入有效后退出循环 else: print("Invalid choice. Please enter 'aes' or 'sm4'.") # 选择加密算法的模式 while True: if encryWay == "aes": encryMode = input("Choose the encryption mode (ecb/cbc/cfb/ofb): ").strip().lower() if encryMode in ["ecb", "cbc", "cfb", "ofb"]: letterMode = encryMode print(f"You have selected '{encryMode}' encryption mode.") break # 输入有效后退出循环 else: print("Invalid choice. Please enter ecb/cbc/cfb/ofb") elif encryWay == "sm4": encryMode = input("Choose the encryption mode (ecb/cbc): ").strip().lower() if encryMode in ["ecb", "cbc"]: letterMode = encryMode print(f"You have selected '{encryMode}' encryption mode.") break # 输入有效后退出循环 else: print("Invalid choice. Please enter ecb/cbc") return encryWay, encryMode # 使用对称加密,返回加密后的数据和随机生成的密钥 def SymEncryption(encryData, key: bytes = None): global letterSymKey # 获得加密的方法和加密的模式 way, mode = selectSymEncryptionChoice() if way == "aes": aesUtils = AESUtils(key) encryptedData, trueKey = aesUtils.encrypt(encryData, mode=mode) # 这里encryData要改为文件内容 letterSymKey = trueKey return encryptedData,trueKey if way == "sm4": key = get_random_bytes(16) if mode == "ecb": encrypted_data = encrypt_ecb(encryData, key) # mode 为 cbc else: encrypted_data = encrypt_cbc_with_iv(encryData, key) 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(): rsaEncrySymKey = RSA.encrypt_message(letterSymKey, getRecvPubKey()) return base64.b64encode(rsaEncrySymKey).decode("utf-8") # 获得接收方的公钥 def getRecvPubKey(): # recPubKey = input("plz input Receiver's Public Key: ") recPubKey = getUserKey()[1] return recPubKey # 获得发送方的公钥 def getSenderPubKey(): privateKey, publicKey = getUserKey() return publicKey if __name__ == "__main__": # 示例数据和密钥 # data = "Hello, AES!" # # data, akey = SymEncryption(data) # print(data,akey) # # encryptType = f"{letterWay}_{letterMode}".upper() # print(encryptType) main()