Practical 3 : Rail Fence Cipher
Code: 
def encryptRailFence(text,key):
    key=len(key)
    rail=[['\n' for i in range(len(text))]
          for j in range(key)]
    dir_down=None
    row,col=0,0
    for i in range(len(text)):
        if row==0:
            dir_down=True
        if row==key-1:
            dir_down=False
        rail[row][col]=text[i]
        col+=1
        if dir_down:
            row+=1
        else:
            row-=1
    print("\nRail Matrix:")
  for row in rail:
        print("".join(ch if ch!="\n" else ' ' for ch in row))
    result = ""
    for i in range(key):
        for j in range(len(text)):
            if rail[i][j] != '\n':
                result += rail[i][j]
    return result
def decryptRailFence(cipher,key):
    key=len(key)
    rail=[['\n' for i in range(len(cipher))]
          for j in range(key)]
    dir_down=None
    row,col=0,0
    for i in range(len(cipher)):
          if row==0:
             dir_down= True
          if row== key-1:
             dir_down=False
          rail[row][col]='*'
          col+=1
          if dir_down:
             row +=1
          else:
              row -=1
    index=0
    for i in range(key):
        for j in range(len(cipher)):
            if((rail[i][j]=='*' and (index<len(cipher)))):
               rail[i][j]=cipher[index]
               index+=1
    result = ""
    row,col=0,0
    for i in range(len(cipher)):
               if row==0:
                  dir_down=True
               if row == key -1:
                  dir_down=False
               if rail[row][col]!='\n':
                  result +=rail[row][col]
                  col+=1
               if dir_down:
                  row+=1
               else:
                   row-=1
    return result
text=input("Enter text:")
key=input("Enter key:")
cipher=encryptRailFence(text,key)
decrypt=decryptRailFence(cipher,key)
print("Encrypted text",cipher)
print("Decrypted text",decrypt)
Output:-
2.columnar cipher 
Code:- 
import math
def encrypt_columnar(plaintext,key):
    key_len=len(key)
    num_rows=math.ceil(len(plaintext)/key_len)
    if len(plaintext)%key_len!=0:
           plaintext +='X' *(key_len-(len(plaintext)%key_len))
    matrix=[[''] * key_len for _ in range(int(num_rows))]
    idx=0
    for r in range(int(num_rows)):
        for c in range(key_len):
            if idx <len(plaintext):
                matrix[r][c]=plaintext[idx]
                idx+=1
    key_order=sorted(range(key_len),key=lambda k_idx:key[k_idx])
    ciphertext=""
    for col_idx in key_order:
        for r in range(int(num_rows)):
            ciphertext +=matrix[r][col_idx]
    return ciphertext
text="Aditya"
key="hii"
encrypt=encrypt_columnar(text,key)
print("Encrypted text:",encrypt)
Output:-
