In: Computer Science
Create a Columnar Transposition Cipher in Python that encrypts/decrypts the word "Crypt".
Code:
import math
key = "HACK"
# Encryption
def encryptMessage(msg):
cipher =
""
# track key indices
k_indx
= 0
msg_len =
float(len(msg))
msg_lst
= list(msg)
key_lst
=
sorted(list(key))
# calculate column of the matrix
col
= len(key)
# calculate maximum row of the matrix
row
= int(math.ceil(msg_len
/ col))
# add the padding character '_' in empty
# the empty cell of
the matix
fill_null
= int((row *
col) - msg_len)
msg_lst.extend('_'
* fill_null)
# create Matrix and
insert message and
# padding characters
row-wise
matrix
= [msg_lst[i: i +
col]
for
i in
range(0,
len(msg_lst), col)]
# read matrix
column-wise using key
for
_ in
range(col):
curr_idx
= key.index(key_lst[k_indx])
cipher
+=
''.join([row[curr_idx]
for
row in matrix])
k_indx
+= 1
return
cipher
# Decryption
def decryptMessage(cipher):
msg
= ""
# track key
indices
k_indx
= 0
# track msg
indices
msg_indx
= 0
msg_len
=
float(len(cipher))
msg_lst
= list(cipher)
# calculate column of
the matrix
col
= len(key)
# calculate maximum
row of the matrix
row
= int(math.ceil(msg_len
/ col))
# convert key into
list and sort
# alphabetically so
we can access
# each character by
its alphabetical position.
key_lst
=
sorted(list(key))
# create an empty
matrix to
# store deciphered
message
dec_cipher
= []
for
_ in
range(row):
dec_cipher
+=
[[None] *
col]
# Arrange the matrix
column wise according
# to permutation
order by adding into new matrix
for
_ in
range(col):
curr_idx
= key.index(key_lst[k_indx])
for
j in
range(row):
dec_cipher[j][curr_idx]
= msg_lst[msg_indx]
msg_indx
+= 1
k_indx
+= 1
# convert decrypted
msg matrix into a string
try:
msg
=
''.join(sum(dec_cipher,
[]))
except
TypeError:
raise
TypeError("This program
cannot",
"handle
repeating words.")
null_count
=
msg.count('_')
if
null_count > 0:
return
msg[: -null_count]
return
msg
# Driver Code
msg = "Geeks for
Geeks"
cipher =
encryptMessage(msg)
print("Encrypted Message:
{}".
format(cipher))
print("Decryped Message:
{}".
format(decryptMessage(cipher)))
Code and Output Snapshot:


