Skip to main content

cryptography

Cryptography fundamentals and implementation

Source facts

Repository
ffsshhttiikk/opencode-agents-skills
Last source activity
February 28, 2026 at 22:49
Detected SKILL.md language
English
Stars
3
Forks
2

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
cryptography
description
Cryptography fundamentals and implementation
license
MIT
compatibility
opencode
metadata
{"audience":"developers","category":"security"}
## What I do - Explain cryptographic primitives and their uses - Implement symmetric and asymmetric encryption - Design secure key exchange protocols - Implement hashing and digital signatures - Choose appropriate algorithms for use cases ## When to use me When learning about cryptography or implementing cryptographic solutions. ## Symmetric Encryption ### AES Modes of Operation ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import os def aes_gcm_encrypt(plaintext: bytes, key: bytes) -> tuple: """AES-GCM provides both confidentiality and authenticity""" nonce = os.urandom(12) # 96-bit nonce for GCM cipher = Cipher( algorithms.AES(key), modes.GCM(nonce), backend=default_backend() ) encryptor = cipher.encryptor() ciphertext = encryptor.update(plaintext) + encryptor.finalize() return nonce, ciphertext, encryptor.tag def aes_ctr_encrypt(plaintext: bytes, key: bytes) -> bytes: """AES-CTR turns block cipher into stream cipher""" nonce = os.urandom(16) cipher = Cipher( algorithms.AES(key), modes.CTR(nonce), backend=default_backend() ) return cipher.encryptor().update(plaintext) # Use cases: # GCM - When you need authenticated encryption (most common) # CTR - When you need random access (disk encryption) # CBC - Legacy systems only (use GCM instead) ``` ## Asymmetric Encryption ### RSA Encryption ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes def generate_rsa_keypair(): private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 # Minimum 2048 for security ) public_key = private_key.public_key() return private_key, public_key def rsa_encrypt(plaintext: bytes, public_key) -> bytes: return public_key.encrypt( plaintext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) def rsa_decrypt(ciphertext: bytes, private_key) -> bytes: return private_key.decrypt( ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # Hybrid encryption (for large data) def hybrid_encrypt(data: bytes, rsa_public_key): # Generate symmetric key for data symmetric_key = os.urandom(32) # Encrypt data with symmetric key nonce, ciphertext, tag = aes_gcm_encrypt(data, symmetric_key) # Encrypt symmetric key with RSA encrypted_key = rsa_encrypt(symmetric_key, rsa_public_key) return encrypted_key, nonce, ciphertext, tag ``` ### Elliptic Curve Cryptography ```python from cryptography.hazmat.primitives.asymmetric import ec def generate_ec_keypair(): private_key = ec.generate_private_key(ec.SECP256R1()) return private_key, private_key.public_key() def ecdsa_sign(message: bytes, private_key): return private_key.sign( message, ec.ECDSA(hashes.SHA256()) ) def ecdsa_verify(message: bytes, signature: bytes, public_key): try: public_key.verify(signature, message, ec.ECDSA(hashes.SHA256())) return True except: return False # EC is preferred over RSA for new systems # Same security with smaller keys and faster operations ``` ## Hashing ### Choosing Hash Functions ```python from cryptography.hazmat.primitives import hashes import hashlib def secure_hash(data: bytes) -> str: """Use SHA-256 for general hashing""" return hashlib.sha256(data).hexdigest() def blake2_hash(data: bytes) -> str: """BLAKE2 is faster than SHA-256 and equally secure""" return hashlib.blake2b(data).hexdigest() # NEVER use for passwords: # - MD5 (broken) # - SHA-1 (broken) # - SHA-256 (not designed for passwords) # Use for passwords: # - bcrypt # - scrypt # - Argon2 def argon2_hash(password: str) -> str: import argon2 ph = argon2.PasswordHasher( time_cost=3, memory_cost=65536, parallelism=4, hash_len=32, salt_len=16 ) return ph.hash(password) def verify_argon2(password: str, hash: str) -> bool: ph = argon2.PasswordHasher() try: ph.verify(hash, password) return True except: return False ``` ## Key Exchange ### Diffie-Hellman ```python from cryptography.hazmat.primitives.asymmetric import dh from cryptography.hazmat.primitives import serialization def generate_dh_parameters(): # Use standardized parameters return dh.generate_parameters(generator=2, key_size=2048) def dh_key_exchange(paramters): private_key = paramtes.generate_private_key() public_key = private_key.public_key() # Share public_key with other party # Other party does the same # Both derive same shared secret return private_key, public_key def derive_shared_key(my_private_key, their_public_key): shared_key = my_private_key.exchange(their_public_key) # Derive symmetric key from shared secret return hashlib.sha256(shared_key).digest() ``` ## Digital Signatures ```python # ECDSA (recommended) from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives import hashes private_key = ec.generate_private_key(ec.SECP256R1()) signature = private_key.sign( b"message", ec.ECDSA(hashes.SHA256()) ) # Verify public_key = private_key.public_key() public_key.verify(signature, b"message", ec.ECDSA(hashes.SHA256())) # Ed25519 (modern, recommended) from cryptography.hazmat.primitives.asymmetric import ed25519 private_key = ed25519.Ed25519PrivateKey.generate() signature = private_key.sign(b"message") public_key = private_key.public_key() public_key.verify(signature, b"message") ``` ## Random Number Generation ```python import secrets import os # Cryptographically secure random random_bytes = secrets.token_bytes(32) # For keys random_int = secrets.randbelow(1000000) # For numbers # System CSPRNG (used by secrets) system_random = os.urandom(32) # NEVER use: # - random module (not secure) # - Mersenne Twister (predictable) # - time-based seeds ```
View on GitHub