我一直在寻找一个好的加密方案来加密我的消息,我发现混合加密适用于大小消息。但我的输出密码消息的长度有问题。
如果输入为" hello",那么输出消息的长度将为586,如果消息更大则为两倍
这是我使用的加密功能:
def encrypt(username, msg):
#get the reciever's public key
f = open("{}.pem".format(username)) # a.salama.pem
recipient_key = RSA.import_key(f.read())
f.close()
# Encrypt the session key with the reciever's public RSA key
cipher_rsa = PKCS1_OAEP.new(recipient_key)
# Encrypt the data with the AES128 session key
session_key = get_random_bytes(16)
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(msg)
#finishing your processing
encrypted_data = cipher_rsa.encrypt(session_key) + cipher_aes.nonce + tag + ciphertext
encrypted_data = hexlify(encrypted_data).decode("utf-8")
return encrypted_data
答案 0 :(得分:0)
无论加密的明文数量多少,标题中都有固定数量的额外字节。从您的代码行中可以看出这一点
encrypted_data = cipher_rsa.encrypt(session_key) + cipher_aes.nonce + tag + ciphertext
此额外数据将由RSA加密的会话密钥控制。使用众所周知的256位椭圆曲线,ECIES更节省空间的选择。
但是,由于编码,您还会扩展数据。您选择的编码是十六进制编码,加倍数据量。一种更有效且支持良好的编码是base64编码。 Base64编码将数据扩展了4/3倍。最节省空间的是完全避免编码,只是存储和传输原始字节。如果数据将通过无法处理二进制数据的通道进行传输,则只需对数据进行编码。