import numpy as np

def generate_keys(n):

Generate random lattice basis

1
2
3
4
B = np.random.randint(-10, 10, size=(n, n))
# Compute inverse as private key
B_inv = np.linalg.inv(B)
return B, B_inv

def encrypt(plaintext, public_key):

Encode plaintext into vector

1
2
3
4
5
message_vec = np.fromstring(plaintext, dtype=np.uint8)
# Add random noise
noise = np.random.randint(-5, 5, size=len(message_vec))
ciphertext = np.dot(public_key, message_vec + noise)
return ciphertext

def decrypt(ciphertext, private_key):

Remove noise and decode

1
2
3
decrypted_vec = np.dot(private_key, ciphertext).astype(np.uint8)
plaintext = "".join(chr(c) for c in decrypted_vec)
return plaintext

Example usage

public_key, private_key = generate_keys(10)
message = "Hello, quantum world!"
encrypted_message = encrypt(message, public_key)
decrypted_message = decrypt(encrypted_message, private_key)

print("Original message:", message)
print("Encrypted message:", encrypted_message)
print("Decrypted message:", decrypted_message)

Edit

Pub: 15 Apr 2026 13:52 UTC

Views: 7