OneCompiler

DOUBLE COLUMNAR ENCRYPTION - PE

89

import math

def columnar_transposition_encrypt(plaintext, key):
plaintext = plaintext.replace(" ", "") # remove spaces for tighter encryption
key_length = len(key)

#Calculate padding
padding = (key_length - len(plaintext) % key_length) % key_length
plaintext += '_' * padding  # Use underscore as padding character

#Determine column order from sorted key
key_order = sorted(list(enumerate(key)), key=lambda x: x[1])
column_order = [index for index, _ in key_order]

#Break text into rows
rows = [plaintext[i:i+key_length] for i in range(0, len(plaintext), key_length)]

#Read columns in key order
ciphertext = ''
for col in column_order:
    for row in rows:
        ciphertext += row[col]

return ciphertext

def double_columnar_encrypt(plaintext, key1, key2):
#First encryption
first_pass = columnar_transposition_encrypt(plaintext, key1.upper())
#Second encryption
second_pass = columnar_transposition_encrypt(first_pass, key2.upper())
return second_pass

#Main program
if name == "main":
plaintext = input("Enter plaintext to encrypt: ")
key1 = input("Enter first key: ")
key2 = input("Enter second key: ")

if not key1.isalpha() or not key2.isalpha():
    print("Both keys must contain only alphabetic characters.")
else:
    encrypted_message = double_columnar_encrypt(plaintext, key1, key2)
    print("Encrypted Message:", encrypted_message)