OneCompiler

PLAYFAIR DECRYPTION - PE

83

def generate_playfair_matrix(key):
key = key.upper().replace("J", "I")
matrix = []
seen = set()

for char in key:
    if char.isalpha() and char not in seen:
        seen.add(char)
        matrix.append(char)

for char in "ABCDEFGHIKLMNOPQRSTUVWXYZ":
    if char not in seen:
        seen.add(char)
        matrix.append(char)

return [matrix[i:i + 5] for i in range(0, 25, 5)]

def find_position(matrix, char):
for row in range(5):
for col in range(5):
if matrix[row][col] == char:
return row, col
return None

def decrypt_playfair(ciphertext, key):
matrix = generate_playfair_matrix(key)
plaintext = ""

for i in range(0, len(ciphertext), 2):
    a, b = ciphertext[i], ciphertext[i + 1]
    row1, col1 = find_position(matrix, a)
    row2, col2 = find_position(matrix, b)

    if row1 == row2:
        plaintext += matrix[row1][(col1 - 1) % 5]
        plaintext += matrix[row2][(col2 - 1) % 5]
    elif col1 == col2:
        plaintext += matrix[(row1 - 1) % 5][col1]
        plaintext += matrix[(row2 - 1) % 5][col2]
    else:
        plaintext += matrix[row1][col2]
        plaintext += matrix[row2][col1]

return plaintext

key_input = input("Enter the key: ")
cipher_input = input("Enter the ciphertext to decrypt: ")

decrypted_text = decrypt_playfair(cipher_input, key_input)
print("Decrypted message:", decrypted_text)