PRACTICAL 1: SUBSTITUTION CIPHER TECHNIQUE
1. MONOALPHABETIC CIPHER

CODE:
def encrypt_mono(plaintext, key_map):
    ciphertext = ""
    for char in plaintext:
        if char.lower() in key_map:
            if char.isupper():
                ciphertext += key_map[char.lower()].upper()
            else:
                ciphertext += key_map[char]
        else:
            ciphertext += char
    return ciphertext


def decrypt_mono(ciphertext, key_map):
    inverse_key_map = {v: k for k, v in key_map.items()}
    plaintext = ""
    for char in ciphertext:
        if char.lower() in inverse_key_map:
            if char.isupper():
                plaintext += inverse_key_map[char.lower()].upper()
            else:
                plaintext += inverse_key_map[char]
        else:
            plaintext += char
    return plaintext


substitution_key = {
    'a': 'x', 'b': 'n', 'c': 'o', 'd': 'p', 'e': 'q', 'f': 'r',
    'g': 's', 'h': 't', 'i': 'u', 'j': 'v', 'k': 'w', 'l': 'a',
    'm': 'b', 'n': 'c', 'o': 'd', 'p': 'e', 'q': 'f', 'r': 'g',
    's': 'h', 't': 'i', 'u': 'j', 'v': 'k', 'w': '1', 'x': 'm',
    'y': 'z', 'z': 'y'
}

message = "HELLO TYCS students"
encrypted_msg = encrypt_mono(message, substitution_key)
print(f"Encrypted: {encrypted_msg}")
decrypted_msg = decrypt_mono(encrypted_msg, substitution_key)
print(f"decrypted: {decrypted_msg}")
