PRACTICAL 2: VERNAM CIPHER AND PLAYFAIR CIPHER

A. VERNAM CIPHER
CODE:
text = input("Enter text: ")
key = input("Enter key (same length): ")

encrypted = [ord(t) ^ ord(k) for t, k in zip(text, key)]
print("Encrypted:", encrypted)

decrypted = ''.join(chr(e ^ ord(k)) for e, k in zip(encrypted, key))
print("Decrypted:", decrypted)


B. PLAYFAIR CIPHER
CODE:
key = "monarchy"
text = "hello"

table = ""
for c in (key + "abcdefghiklmnopqrstuvwxyz").upper():
    if c not in table:
        table += c

text = text.upper().replace(" ", "")
result = ""
i = 0
while i < len(text):
    a = text[i]
    b = text[i + 1] if i + 1 < len(text) else "X"
    if a == b:
        b = "X"
        i += 1
    else:
        i += 2
    r1, c1 = divmod(table.index(a), 5)
    r2, c2 = divmod(table.index(b), 5)
    if r1 == r2:
        c1, c2 = (c1 + 1) % 5, (c2 + 1) % 5
    elif c1 == c2:
        r1, r2 = (r1 + 1) % 5, (r2 + 1) % 5
    else:
        c1, c2 = c2, c1
    result += table[r1 * 5 + c1] + table[r2 * 5 + c2]

print("Encrypted:", result)
