from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# Tạo hoặc load khóa RSA từ file
def generate_or_load_keys(private_key_path='private_key.pem', 
public_key_path='public_key.pem'):
    try:
        # Thử load private key từ file
        with open(private_key_path, "rb") as priv_file:
            private_key = serialization.load_pem_private_key(priv_file.read(), 
password=None)
        print("Loaded existing private key.")
    except FileNotFoundError:
        # Nếu không tìm thấy file, tạo mới cặp khóa
        private_key = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048,
        )
        # Lưu private key ra file (định dạng PEM, không mã hóa mật khẩu)
        with open(private_key_path, "wb") as priv_file:
            priv_file.write(private_key.private_bytes(
                encoding=serialization.Encoding.PEM,
                format=serialization.PrivateFormat.PKCS8,
                encryption_algorithm=serialization.NoEncryption()
            ))
        # Lưu public key ra file
        public_key = private_key.public_key()
        with open(public_key_path, "wb") as pub_file:
            pub_file.write(public_key.public_bytes(
                encoding=serialization.Encoding.PEM,
                format=serialization.PublicFormat.SubjectPublicKeyInfo
            ))
        print("Generated and saved new key pair.")

    # Load public key cho chắc
    with open(public_key_path, "rb") as pub_file:
        public_key = serialization.load_pem_public_key(pub_file.read())

    return private_key, public_key

private_key, public_key = generate_or_load_keys()

# Xuất public key ra chuỗi PEM
public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
).decode('utf-8')

print(public_key_pem)
