50 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from Crypto.PublicKey import RSA
 | 
						|
from Crypto.Util.number import bytes_to_long, long_to_bytes
 | 
						|
 | 
						|
 | 
						|
def generate_keys():
 | 
						|
    key = RSA.generate(2048)
 | 
						|
    return key
 | 
						|
 | 
						|
 | 
						|
def encrypt(message, public_key):
 | 
						|
    n = public_key.n
 | 
						|
    e = public_key.e
 | 
						|
    ciphertext = pow(message, e, n)
 | 
						|
    return ciphertext
 | 
						|
 | 
						|
 | 
						|
def decrypt(ciphertext, private_key):
 | 
						|
    n = private_key.n
 | 
						|
    d = private_key.d
 | 
						|
    plaintext = pow(ciphertext, d, n)
 | 
						|
    return plaintext
 | 
						|
 | 
						|
 | 
						|
# Generate keys
 | 
						|
key = generate_keys()
 | 
						|
public_key = key.publickey()
 | 
						|
private_key = key
 | 
						|
 | 
						|
# Original values
 | 
						|
m1 = 7
 | 
						|
m2 = 3
 | 
						|
 | 
						|
# Encrypt
 | 
						|
c1 = encrypt(m1, public_key)
 | 
						|
c2 = encrypt(m2, public_key)
 | 
						|
print(f"Ciphertext 1: {c1}")
 | 
						|
print(f"Ciphertext 2: {c2}")
 | 
						|
 | 
						|
# Homomorphic multiplication
 | 
						|
c_product = (c1 * c2) % public_key.n
 | 
						|
print(f"Encrypted product: {c_product}")
 | 
						|
 | 
						|
# Decrypt result
 | 
						|
decrypted_product = decrypt(c_product, private_key)
 | 
						|
print(f"Decrypted product: {decrypted_product}")
 | 
						|
 | 
						|
# Verify
 | 
						|
expected_product = m1 * m2
 | 
						|
print(f"Expected product: {expected_product}")
 | 
						|
print(f"Match: {decrypted_product == expected_product}")
 |