如何减少使用混合加密加密的邮件的长度

时间:2018-05-18 13:42:52

标签: aes rsa pycrypto hybrid pycryptodome

我一直在寻找一个好的加密方案来加密我的消息,我发现混合加密适用于大小消息。但我的输出密码消息的长度有问题。

  

如果输入为" 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

1 个答案:

答案 0 :(得分:0)

无论加密的明文数量多少,标题中都有固定数量的额外字节。从您的代码行中可以看出这一点

encrypted_data = cipher_rsa.encrypt(session_key) + cipher_aes.nonce + tag +  ciphertext 

此额外数据将由RSA加密的会话密钥控制。使用众所周知的256位椭圆曲线,ECIES更节省空间的选择。

但是,由于编码,您还会扩展数据。您选择的编码是十六进制编码,加倍数据量。一种更有效且支持良好的编码是base64编码。 Base64编码将数据扩展了4/3倍。最节省空间的是完全避免编码,只是存储和传输原始字节。如果数据将通过无法处理二进制数据的通道进行传输,则只需对数据进行编码。