OneCompiler

SINGLE COLUMNAR DECRYPTION - PE

91

import math

def columnar_transposition_decrypt(ciphertext, key):
key_length = len(key)
num_rows = math.ceil(len(ciphertext) / key_length)

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

#Calculate number of full-length columns
num_full_cols = len(ciphertext) % key_length
col_lengths = [num_rows if i < num_full_cols else num_rows - 1 for i in range(key_length)]

#Create a list to hold columns
columns = [''] * key_length
index = 0
for sorted_index in column_order:
    length = col_lengths[sorted_index]
    columns[sorted_index] = ciphertext[index:index+length]
    index += length

#Reconstruct the message row-wise
plaintext = ''
for row in range(num_rows):
    for col in range(key_length):
        if row < len(columns[col]):
            plaintext += columns[col][row]

return plaintext

#Main program
if name == "main":
ciphertext = input("Enter ciphertext to decrypt: ")
key = input("Enter key (e.g., SECURE): ").upper()

if not key.isalpha():
    print("Key must contain only alphabetic characters.")
else:
    decrypted = columnar_transposition_decrypt(ciphertext, key)
    print("Decrypted Message:", decrypted)