# API documentation

All cryptographic functionalities are organized in sub-packages; each sub-package is dedicated to solving a specific class of problems.

Package | Description
--- | ---
Crypto.Cipher | Modules for protecting confidentiality that is, for encrypting and decrypting data (example: AES).
Crypto.Signature | Modules for assuring authenticity, that is, for creating and verifying digital signatures of messages (example: PKCS#1 v1.5).
Crypto.Hash | Modules for creating cryptographic digests (example: SHA-256).
Crypto.PublicKey | Modules for generating, exporting or importing public keys (example: RSA or ECC).
Crypto.Protocol | Modules for faciliting secure communications between parties, in most cases by leveraging cryptograpic primitives from other modules (example: Shamir’s Secret Sharing scheme).
Crypto.IO | Modules for dealing with encodings commonly used for cryptographic data (example: PEM).
Crypto.Random | Modules for generating random data.
Crypto.Util | General purpose routines (example: XOR for byte strings).

In certain cases, there is some overlap between these categories. For instance, authenticity is also provided by Message Authentication Codes, and some can be built using digests, so they are included in the `Crypto.Hash` package (example: HMAC). Also, cryptographers have over time realized that encryption without authentication is often of limited value so recent ciphers found in the `Crypto.Cipher` package embed it (example: GCM).

PyCryptodome strives to maintain strong backward compatibility with the old PyCrypto’s API (except for those few cases where that is harmful to security) so a few modules don’t appear where they should (example: the ASN.1 module is under `Crypto.Util` as opposed to `Crypto.IO`).