# Practical 3 – Secure Communication: Receiver
# Install: pip install cryptography
from cryptography.exceptions import InvalidSignature
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

with open("receiver_private_key.pem", "rb") as file:
    receiver_key = serialization.load_pem_private_key(file.read(), password=None)
with open("sender_public_key.pem", "rb") as file:
    sender_key = serialization.load_pem_public_key(file.read())
with open("encrypted_message.bin", "rb") as file:
    encrypted = file.read()
with open("signature.bin", "rb") as file:
    signature = file.read()

message = receiver_key.decrypt(encrypted, padding.OAEP(
    mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None
))
print("Message:", message.decode())
if input("Alter message before verification? (y/n): ").lower() == "y":
    message = input("Altered message: ").encode()

try:
    sender_key.verify(signature, message, padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
    ), hashes.SHA256())
    print("Signature verified.")
except InvalidSignature:
    print("Signature verification failed; message may be altered.")

# What this code does: decrypts a received message and verifies its sender's
# digital signature to detect changes.
