import os import sys from aes_gcm import encrypt_text as aesgcm_encrypt_text, decrypt_text as aesgcm_decrypt_text, \ encrypt_file as aesgcm_encrypt_file, decrypt_file as aesgcm_decrypt_file from aes_cbc import encrypt_text as aescbc_encrypt_text, decrypt_text as aescbc_decrypt_text, \ encrypt_file as aescbc_encrypt_file, decrypt_file as aescbc_decrypt_file from xchacha import encrypt_text as xchacha_encrypt_text, decrypt_text as xchacha_decrypt_text, \ encrypt_file as xchacha_encrypt_file, decrypt_file as xchacha_decrypt_file import rsa_hybrid import pqcrypto_hybrid def load_text(path, binary=False): with open(path, 'rb' if binary else 'r') as f: return f.read() def save_text(path, data, binary=False): with open(path, 'wb' if binary else 'w') as f: f.write(data) def select_symmetric(): print("\nšŸ”€ Select symmetric engine:") choices = ["aes_gcm", "aes_cbc", "xchacha"] for i, c in enumerate(choices): print(f" [{i}] {c}") while True: try: choice = int(input("Choice: ")) return choices[choice] except (ValueError, IndexError): print("āŒ Invalid choice. Try again.") def hybrid_cli(name, module, key_ext, symmetric_engine, is_pem=False): while True: print(f"\n=== PacCrypt {name} Debug Mode ({symmetric_engine.upper()}) ===") print("Choose:") print(" [g] Generate keypair") print(" [e] Encrypt text") print(" [d] Decrypt text") print(" [ef] Encrypt file") print(" [df] Decrypt file") print(" [b] Back to engine menu") print(" [q] Quit script") mode = input("\nMode (g/e/d/ef/df/b/q): ").strip().lower() if mode == 'q': return 'quit' elif mode == 'b': return 'back' try: if mode == 'g': priv, pub = module.generate_key_pair() if hasattr(module, 'generate_key_pair') else module.generate_keypair() save_text(f"{name}_public.{key_ext}", pub, binary=True) save_text(f"{name}_private.{key_ext}", priv, binary=True) print(f"āœ… Keypair saved to {name}_public.{key_ext} / {name}_private.{key_ext}") elif mode == 'e': plaintext = input("Text to encrypt: ") pub_path = input("Public key path: ").strip() pub = load_text(pub_path, binary=not is_pem) result = module.encrypt_text(plaintext, pub, symmetric_engine) print(f"\nšŸ” Encrypted Base64:\n{result}") elif mode == 'd': encrypted = input("Encrypted Base64 input: ") priv_path = input("Private key path: ").strip() priv = load_text(priv_path, binary=not is_pem) result = module.decrypt_text(encrypted, priv) print(f"\nšŸ“ Decrypted:\n{result}") elif mode == 'ef': in_path = input("Input file path: ").strip() out_path = in_path + ".paccrypt" pub_path = input("Public key path: ").strip() pub = load_text(pub_path, binary=not is_pem) module.encrypt_file(in_path, out_path, pub, symmetric_engine) print(f"āœ… File encrypted and saved to: {out_path}") elif mode == 'df': in_path = input("Encrypted file path: ").strip() out_path = in_path.replace(".paccrypt", "") priv_path = input("Private key path: ").strip() priv = load_text(priv_path, binary=not is_pem) module.decrypt_file(in_path, out_path, priv) print(f"āœ… File decrypted and saved to: {out_path}") else: print("āŒ Invalid option.") except Exception as e: print(f"āŒ Error: {e}") def simple_cli(name, encrypt_text, decrypt_text, encrypt_file, decrypt_file): while True: print(f"\n=== PacCrypt {name} Debug Mode ===") print("Choose:") print(" [e] Encrypt text") print(" [d] Decrypt text") print(" [ef] Encrypt file") print(" [df] Decrypt file") print(" [b] Back to engine menu") print(" [q] Quit script") mode = input("\nMode (e/d/ef/df/b/q): ").strip().lower() if mode == 'q': return 'quit' elif mode == 'b': return 'back' try: if mode == 'e': plaintext = input("Plaintext to encrypt: ") password = input("Password: ") result = encrypt_text(plaintext, password) print(f"\nšŸ” Encrypted Base64:\n{result}") elif mode == 'd': encrypted = input("Encrypted Base64 input: ") password = input("Password: ") result = decrypt_text(encrypted, password) print(f"\nšŸ“ Decrypted:\n{result}") elif mode == 'ef': in_path = input("Input file path: ").strip() out_path = in_path + ".paccrypt" password = input("Password: ") encrypt_file(in_path, out_path, password) print(f"āœ… File encrypted and saved to: {out_path}") elif mode == 'df': in_path = input("Encrypted file path: ").strip() out_path = in_path.replace(".paccrypt", "") password = input("Password: ") decrypt_file(in_path, out_path, password) print(f"āœ… File decrypted and saved to: {out_path}") else: print("āŒ Invalid option.") except Exception as e: print(f"āŒ Error: {e}") # === PacCrypt CLI Entry === while True: print("\n=== PacCrypt Hardcoded CLI ===") print("Pick an engine:") print(" [0] AES-GCM") print(" [1] AES-CBC") print(" [2] XChaCha20-Poly1305") print(" [3] RSA Hybrid (with selectable symmetric)") print(" [4] PQCrypto Hybrid (with selectable symmetric)") print(" [q] Quit") choice = input("Choice: ").strip().lower() if choice == 'q': print("šŸ‘‹ Bye.") sys.exit(0) symmetric_engine = None if choice in ['3', '4']: symmetric_engine = select_symmetric() engines = { '0': lambda: simple_cli("AES-GCM", aesgcm_encrypt_text, aesgcm_decrypt_text, aesgcm_encrypt_file, aesgcm_decrypt_file), '1': lambda: simple_cli("AES-CBC", aescbc_encrypt_text, aescbc_decrypt_text, aescbc_encrypt_file, aescbc_decrypt_file), '2': lambda: simple_cli("XChaCha20-Poly1305", xchacha_encrypt_text, xchacha_decrypt_text, xchacha_encrypt_file, xchacha_decrypt_file), '3': lambda: hybrid_cli("RSA_Hybrid", rsa_hybrid, "pem", symmetric_engine, is_pem=True), '4': lambda: hybrid_cli("PQCrypto_Hybrid", pqcrypto_hybrid, "bin", symmetric_engine), } if choice in engines: result = engines[choice]() if result == 'quit': print("šŸ‘‹ Quitting.") sys.exit(0) # If 'back', just loops again to show engine menu else: print("āŒ Invalid choice.")