Advertisement
Oleksandr_Bitkov

verticalPermutationCipher

May 6th, 2024 (edited)
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.35 KB | Cryptocurrency | 0 0
  1. def encode(msg, key, gap="+"):
  2.  
  3.     unique_letters = []
  4.  
  5.     for letter in key:
  6.         if letter not in unique_letters:
  7.             unique_letters.append(letter)
  8.  
  9.     unique_letters.sort()
  10.  
  11.     letter_count = {}
  12.  
  13.     for letter in key:
  14.         if letter in letter_count:
  15.             letter_count[letter] += 1
  16.         else:
  17.             letter_count[letter] = 1
  18.  
  19.     length = len(unique_letters)
  20.     temp_key = key
  21.     index = 0
  22.     counter = 1
  23.     counter_index = 1
  24.     order = []
  25.  
  26.     for _ in range(len(key)):
  27.         order.append(0)
  28.  
  29.     while length != 0:
  30.         for char in temp_key:
  31.             if char == unique_letters[index]:
  32.                 index_char = temp_key.index(char)
  33.                 order[index_char] = counter
  34.                 counter += 1
  35.                 temp_key = temp_key[:index_char] + "$" + temp_key[index_char + 1 :]
  36.                 if letter_count[char] > counter_index:
  37.                     counter_index += 1
  38.                 else:
  39.                     counter_index = 1
  40.                     index += 1
  41.                     break
  42.         length -= 1
  43.  
  44.     matrix = []
  45.  
  46.     while len(msg) % len(key) != 0:
  47.         msg += gap
  48.  
  49.     matrix = [list(msg[i : i + len(key)]) for i in range(0, len(msg), len(key))]
  50.  
  51.     counter = 1
  52.     length = len(key)
  53.  
  54.     new_matrix = []
  55.  
  56.     while length != 0:
  57.         for item in order:
  58.             if item == counter:
  59.                 index = order.index(item)
  60.                 colum = [row[index] for row in matrix]
  61.                 new_matrix.append(colum)
  62.                 counter += 1
  63.                 break
  64.  
  65.         length -= 1
  66.  
  67.     joined_rows = ["".join(row) for row in new_matrix]
  68.  
  69.     result = "".join(joined_rows)
  70.  
  71.     result = result.replace(gap, "")
  72.  
  73.     return result
  74.  
  75.  
  76. def decode(enc_msg, key):
  77.  
  78.     unique_letters = []
  79.  
  80.     for letter in key:
  81.         if letter not in unique_letters:
  82.             unique_letters.append(letter)
  83.  
  84.     unique_letters.sort()
  85.  
  86.     letter_count = {}
  87.  
  88.     for letter in key:
  89.         if letter in letter_count:
  90.             letter_count[letter] += 1
  91.         else:
  92.             letter_count[letter] = 1
  93.  
  94.     length = len(unique_letters)
  95.     temp_key = key
  96.     index = 0
  97.     counter = 1
  98.     counter_index = 1
  99.     order = []
  100.  
  101.     for _ in range(len(key)):
  102.         order.append(0)
  103.  
  104.     while length != 0:
  105.         for char in temp_key:
  106.             if char == unique_letters[index]:
  107.                 index_char = temp_key.index(char)
  108.                 order[index_char] = counter
  109.                 counter += 1
  110.                 temp_key = temp_key[:index_char] + "$" + temp_key[index_char + 1 :]
  111.                 if letter_count[char] > counter_index:
  112.                     counter_index += 1
  113.                 else:
  114.                     counter_index = 1
  115.                     index += 1
  116.                     break
  117.         length -= 1
  118.  
  119.     del length, temp_key, index, counter, counter_index
  120.  
  121.     key_len = len(key)
  122.     enc_msg_len = len(enc_msg)
  123.     length = len(order)
  124.     cur_pos_in_matrix = 1
  125.     tmp_enc_msg = enc_msg
  126.     prt_enc_msg = ""
  127.  
  128.     ful_col = enc_msg_len % key_len
  129.     ful_row = (enc_msg_len // key_len) + 1
  130.  
  131.     if ful_col != 0:
  132.         ful_col -= 1
  133.  
  134.     matrix = [["" for _ in range(key_len)] for _ in range(ful_row)]
  135.  
  136.     while length != 0:
  137.         for item in order:
  138.             if item == cur_pos_in_matrix:
  139.                 cur_indx = order.index(item)
  140.                 if ful_col == 0:
  141.                     ful_row = enc_msg_len // key_len
  142.                     prt_enc_msg = tmp_enc_msg[:ful_row]
  143.                     tmp_enc_msg = tmp_enc_msg[ful_row:]
  144.                 elif cur_indx <= ful_col:
  145.                     ful_row = (enc_msg_len // key_len) + 1
  146.                     prt_enc_msg = tmp_enc_msg[:ful_row]
  147.                     tmp_enc_msg = tmp_enc_msg[ful_row:]
  148.                 else:
  149.                     ful_row = enc_msg_len // key_len
  150.                     prt_enc_msg = tmp_enc_msg[:ful_row]
  151.                     tmp_enc_msg = tmp_enc_msg[ful_row:]
  152.  
  153.                 lst_prt_enc_msg = list(prt_enc_msg)
  154.  
  155.                 for i in range(len(lst_prt_enc_msg)):
  156.                     matrix[i][cur_indx] = lst_prt_enc_msg[i]
  157.  
  158.                 cur_pos_in_matrix += 1
  159.                 break
  160.             else:
  161.                 continue
  162.         length -= 1
  163.  
  164.     msg = "".join(sum(matrix, []))
  165.  
  166.     return msg
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement