import base64
from nacl import public
from nacl.public import SealedBox
def generate_keypair():
sk = public.PrivateKey.generate()
pk = sk.public_key
sk_b64 = base64.b64encode(bytes(sk)).decode("ascii")
pk_b64 = base64.b64encode(bytes(pk)).decode("ascii")
return sk_b64, pk_b64
def load_private_key(sk_b64):
raw = base64.b64decode(sk_b64.encode("ascii"))
return public.PrivateKey(raw)
def load_public_key(pk_b64):
raw = base64.b64decode(pk_b64.encode("ascii"))
return public.PublicKey(raw)
def encrypt_message(recipient_pk_b64, plaintext: bytes) -> str:
recipient_pk = load_public_key(recipient_pk_b64)
sealed = SealedBox(recipient_pk)
ciphertext = sealed.encrypt(plaintext)
return base64.b64encode(ciphertext).decode("ascii")
def decrypt_message(recipient_sk_b64, ciphertext_b64: str) -> bytes:
recipient_sk = load_private_key(recipient_sk_b64)
sealed = SealedBox(recipient_sk)
ciphertext = base64.b64decode(ciphertext_b64.encode("ascii"))
plaintext = sealed.decrypt(ciphertext)
return plaintext