Building a Simple Encryption Library with PyCrypt
Overview
A compact, opinionated Python library that wraps PyCrypt primitives to provide easy-to-use, secure encryption for strings and files: AES-GCM for symmetric encryption, RSA for asymmetric key exchange/signing, secure key derivation (HKDF/PBKDF2), and safe serialization (JSON + base64). Focus: correctness, minimal surface area, clear API.
Core Features
- Symmetric encryption: AES-256-GCM with random 96-bit nonce, returns ciphertext + tag + nonce.
- Key derivation: PBKDF2-HMAC-SHA256 for passphrase → key; HKDF-SHA256 for expanding master keys.
- Asymmetric: RSA 3072 for key exchange and signatures (or use Ed25519/Curve25519 if available).
- File support: Chunked streaming encryption for large files with associated data (filename/metadata).
- Serialization: Compact JSON containing base64-encoded fields and version tag for future upgrades.
- Secure defaults: Constant-time comparisons, zeroing sensitive memory where possible, strict nonce reuse prevention.
API Design (suggested)
- encrypt_bytes(key: bytes, plaintext: bytes, aad: bytes|None=None) -> dict
- decrypt_bytes(key: bytes, payload: dict, aad: bytes|None=None) -> bytes
- derive_key_from_password(password: str, salt: bytes=None, iterations: int=200_000) -> (key, salt)
- generate_rsa_keypair(bits: int=3072) -> (private_pem, public_pem)
- encrypt_file(…), decrypt_file(…)
Example Implementation Sketch (conceptual)
- Use PyCrypt’s AES-GCM primitive for encryption.
- Generate a secure random nonce per message and include it in the serialized payload.
- For password-based keys, use a strong iteration count and unique salt per derivation.
- For file streaming, encrypt per-chunk with incremental counters included in AAD to prevent reorder attacks.
Security Notes
- Never reuse nonces with the same key.
- Use authenticated encryption (AES-GCM or ChaCha20-Poly1305).
- Prefer modern curves (X25519/Ed25519) over RSA when interoperability allows.
- Rotate keys periodically and include versioning in serialized output.
- Validate all inputs and fail closed on any integrity/authentication failure.
Deployment & Testing
- Unit tests for edge cases (empty plaintext, max-size, corrupted ciphertext).
- Fuzz tests on serialization parsing.
- Static analysis (bandit) and dependency checks.
- Provide clear migration path for future algorithm changes via versioned payloads.
Minimal Example (pseudo-output)
- encrypt_bytes returns JSON: {“v”:1,“alg”:“AES-GCM”,“nonce”:“…”,“ct”:“…”,“tag”:“…”,“salt”:“…”}
Leave a Reply