Encryption is a tricky subject in any language. It is better to choose a library with active maintenance.

There are 2 **best Python encryption libraries** as follows.

Table of Contents

### Cryptography

**cryptography** includes both high-level recipes and low-level interfaces to common cryptographic algorithms such as symmetric ciphers, message digests, and key derivation functions.

Encrypt and decrypt text with cryptography’s high-level symmetric encryption recipe:

from cryptography.fernet import Fernet key = Fernet.generate_key() f = Fernet(key) encrypted_text = f.encrypt(b"This is a secret text message that needs to be hidden.") decrypted_text = f.decrypt(encrypted_text )

Encrypt and decrypt using AES

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes import os key = os.urandom(32) iv = os.urandom(16) cipher = Cipher(algorithms.AES(key), modes.CBC(iv)) encryptor = cipher.encryptor() ct = encryptor.update(b"This is a secret text") + encryptor.finalize() decryptor = cipher.decryptor() plain_text = decryptor.update(ct) + decryptor.finalize()

### PyCryptodome

**PyCryptodome** is a self-contained Python package of low-level cryptographic primitives. It is a fork of PyCrypto, which brings a lot of enhancements with respect to the last official version of PyCrypto (2.6.1).

PyCryptodome supports Python 2.6 and 2.7, Python 3.4 and newer, and PyPy.

Encrypt data with AES:

from Crypto.Random import get_random_bytes key = get_random_bytes(16) cipher = AES.new(key, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(data) file_out = open("encrypted.bin", "wb") [ file_out.write(x) for x in (cipher.nonce, tag, ciphertext) ] file_out.close()

Generate RSA key:

from Crypto.PublicKey import RSA secret_code = "Unguessable" key = RSA.generate(2048) encrypted_key = key.export_key(passphrase=secret_code, pkcs=8, protection="scryptAndAES128-CBC") file_out = open("rsa_key.bin", "wb") file_out.write(encrypted_key) file_out.close() print(key.publickey().export_key())