SINGLE COLUMNAR DECRYPTION - PE
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)