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:


