#!/usr/bin/env python3 """ElGamal encryption and decryption""" import random import sys import inverse def main() -> None: """""" if len(sys.argv) == 1: command = input("command ('encrypt' or 'decrypt'): ") else: command = sys.argv[1] if command == "encrypt": x = int(input("x : ")) g = int(input("g : ")) e = int(input("e : ")) k = int(input("k (0 for random) : ")) if k == 0: k = random.randint(1, p - 1) p = int(input("p : ")) r, y = encrypt(x, g, e, k, p) print(f"({r}, {y})") elif command == "decrypt": r = int(input("r : ")) y = int(input("y : ")) d = int(input("d : ")) p = int(input("p : ")) x = decrypt(r, y, d, p) print(x) def encrypt(x: int, g: int, e: int, k: int, p: int) -> tuple[int, int]: """Encrypt a message (x) using elgamal""" r = pow(g, k, p) y = x * pow(e, k, p) % p return r, y def decrypt(r: int, y: int, d: int, p: int) -> int: """Decrypt a message (r, y) using elgamal""" inv = inverse.inverser(pow(r, d, p), p, quiet=True) if inv is None: raise ValueError("{p} is not prime") x: int = (y * inv) % p return x if __name__ == "__main__": main()