PRACTICAL 1: SUBSTITUTION CIPHER TECHNIQUE

1. Monoalphabetic cipher

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}")

Frequency analysis test (document example): BANANA -> KTRTRT
