0

我一直在寻找一个好的加密方案来加密我的消息,我发现混合加密对大小消息都有好处。但我对输出密码消息的长度有疑问,它很大。

如果输入是“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
4

1 回答 1

0

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

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

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

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

于 2018-05-18T14:25:17.537 回答