Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def encode(msg, key, gap="+"):
- unique_letters = []
- for letter in key:
- if letter not in unique_letters:
- unique_letters.append(letter)
- unique_letters.sort()
- letter_count = {}
- for letter in key:
- if letter in letter_count:
- letter_count[letter] += 1
- else:
- letter_count[letter] = 1
- length = len(unique_letters)
- temp_key = key
- index = 0
- counter = 1
- counter_index = 1
- order = []
- for _ in range(len(key)):
- order.append(0)
- while length != 0:
- for char in temp_key:
- if char == unique_letters[index]:
- index_char = temp_key.index(char)
- order[index_char] = counter
- counter += 1
- temp_key = temp_key[:index_char] + "$" + temp_key[index_char + 1 :]
- if letter_count[char] > counter_index:
- counter_index += 1
- else:
- counter_index = 1
- index += 1
- break
- length -= 1
- matrix = []
- while len(msg) % len(key) != 0:
- msg += gap
- matrix = [list(msg[i : i + len(key)]) for i in range(0, len(msg), len(key))]
- counter = 1
- length = len(key)
- new_matrix = []
- while length != 0:
- for item in order:
- if item == counter:
- index = order.index(item)
- colum = [row[index] for row in matrix]
- new_matrix.append(colum)
- counter += 1
- break
- length -= 1
- joined_rows = ["".join(row) for row in new_matrix]
- result = "".join(joined_rows)
- result = result.replace(gap, "")
- return result
- def decode(enc_msg, key):
- unique_letters = []
- for letter in key:
- if letter not in unique_letters:
- unique_letters.append(letter)
- unique_letters.sort()
- letter_count = {}
- for letter in key:
- if letter in letter_count:
- letter_count[letter] += 1
- else:
- letter_count[letter] = 1
- length = len(unique_letters)
- temp_key = key
- index = 0
- counter = 1
- counter_index = 1
- order = []
- for _ in range(len(key)):
- order.append(0)
- while length != 0:
- for char in temp_key:
- if char == unique_letters[index]:
- index_char = temp_key.index(char)
- order[index_char] = counter
- counter += 1
- temp_key = temp_key[:index_char] + "$" + temp_key[index_char + 1 :]
- if letter_count[char] > counter_index:
- counter_index += 1
- else:
- counter_index = 1
- index += 1
- break
- length -= 1
- del length, temp_key, index, counter, counter_index
- key_len = len(key)
- enc_msg_len = len(enc_msg)
- length = len(order)
- cur_pos_in_matrix = 1
- tmp_enc_msg = enc_msg
- prt_enc_msg = ""
- ful_col = enc_msg_len % key_len
- ful_row = (enc_msg_len // key_len) + 1
- if ful_col != 0:
- ful_col -= 1
- matrix = [["" for _ in range(key_len)] for _ in range(ful_row)]
- while length != 0:
- for item in order:
- if item == cur_pos_in_matrix:
- cur_indx = order.index(item)
- if ful_col == 0:
- ful_row = enc_msg_len // key_len
- prt_enc_msg = tmp_enc_msg[:ful_row]
- tmp_enc_msg = tmp_enc_msg[ful_row:]
- elif cur_indx <= ful_col:
- ful_row = (enc_msg_len // key_len) + 1
- prt_enc_msg = tmp_enc_msg[:ful_row]
- tmp_enc_msg = tmp_enc_msg[ful_row:]
- else:
- ful_row = enc_msg_len // key_len
- prt_enc_msg = tmp_enc_msg[:ful_row]
- tmp_enc_msg = tmp_enc_msg[ful_row:]
- lst_prt_enc_msg = list(prt_enc_msg)
- for i in range(len(lst_prt_enc_msg)):
- matrix[i][cur_indx] = lst_prt_enc_msg[i]
- cur_pos_in_matrix += 1
- break
- else:
- continue
- length -= 1
- msg = "".join(sum(matrix, []))
- return msg
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement