Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for ADFGVX Cipher by Kurush
import copy
from collections import OrderedDict
def encode(message, secret_alphabet, keyword):
Matrix = "ADFGVX"
message = "".join(char for char in message if (char.isalpha() or char.isdigit())).lower()
new_message = "".join(Matrix[secret_alphabet.find(char)//6] + Matrix[secret_alphabet.find(char)%6] for char in message)
keyword_list = list(OrderedDict.fromkeys(keyword))
sorted_keyword_list = sorted(keyword_list)
if (len(new_message) % len(keyword_list)) != 0:
new_message = new_message + ((len(new_message) // len(keyword_list) + 1) * len(keyword_list) - len(new_message)) * ' '
final_message = [[0] * len(keyword_list) for i in range(len(new_message) // len(keyword_list))]
for i in range(len(new_message)):
j = i % len(keyword_list)
k = i // len(keyword_list)
final_message[k][j] = new_message[k * len(keyword_list) + keyword_list.index(sorted_keyword_list[j])]
final_message_tr = zip(*final_message)
final_string = "".join(char for row in final_message_tr for char in row if (char.isalpha() or char.isdigit()))
return final_string
def decode(message, secret_alphabet, keyword):
keyword_list = list(OrderedDict.fromkeys(keyword))
sorted_keyword_list = sorted(keyword_list)
col_number = len(keyword_list)
row_number = len(message) // len(keyword_list)
if (len(message) % len(keyword_list) != 0): row_number += 1
delta = row_number * col_number - len(message)
final_message = [[0] * col_number for i in range(row_number)]
for i in range(delta):
for j in range(col_number):
if (keyword_list.index(sorted_keyword_list[j]) == col_number - 1 - i):
final_message[row_number - 1][j] = ''
final_message_tr = [list(a) for a in zip(*final_message)]
k = 0
for i in range(len(final_message_tr)):
for j in range(len(final_message_tr[i])):
if final_message_tr[i][j] != '':
final_message_tr[i][j] = message[k]
k += 1
final_message = [list(a) for a in zip(*final_message_tr)]
new_final_message = copy.deepcopy(final_message)
for i in range(row_number):
for j in range(col_number):
new_j = keyword_list.index(sorted_keyword_list[j])
final_message[i][new_j] = new_final_message[i][j]
final_string = "".join(char for row in final_message for char in row if (char.isalpha() or char.isdigit()))
Matrix = "ADFGVX"
initial_string = ""
for i in range(0, len(final_string) - 1, 2):
row_number = Matrix.find(final_string[i:i+2][0])
col_number = Matrix.find(final_string[i:i+2][1])
new_char = secret_alphabet[row_number * 6 + col_number]
initial_string = initial_string + new_char
return initial_string
if __name__ == '__main__':
assert encode("I am going",
"dhxmu4p3j6aoibzv9w1n70qkfslyc8tr5e2g",
"cipher") == 'FXGAFVXXAXDDDXGA', "encode I am going"
assert decode("FXGAFVXXAXDDDXGA",
"dhxmu4p3j6aoibzv9w1n70qkfslyc8tr5e2g",
"cipher") == 'iamgoing', "decode I am going"
assert encode("attack at 12:00 am",
"na1c3h8tb2ome5wrpd4f6g7i9j0kjqsuvxyz",
"privacy") == 'DGDDDAGDDGAFADDFDADVDVFAADVX', "encode attack"
assert decode("DGDDDAGDDGAFADDFDADVDVFAADVX",
"na1c3h8tb2ome5wrpd4f6g7i9j0kjqsuvxyz",
"privacy") == 'attackat1200am', "decode attack"
assert encode("ditiszeergeheim",
"na1c3h8tb2ome5wrpd4f6g7i9j0kjqsuvxyz",
"piloten") == 'DFGGXXAAXGAFXGAFXXXGFFXFADDXGA', "encode ditiszeergeheim"
assert decode("DFGGXXAAXGAFXGAFXXXGFFXFADDXGA",
"na1c3h8tb2ome5wrpd4f6g7i9j0kjqsuvxyz",
"piloten") == 'ditiszeergeheim', "decode ditiszeergeheim"
assert encode("I am going",
"dhxmu4p3j6aoibzv9w1n70qkfslyc8tr5e2g",
"weasel") == 'DXGAXAAXXVDDFGFX', "encode weasel == weasl"
assert decode("DXGAXAAXXVDDFGFX",
"dhxmu4p3j6aoibzv9w1n70qkfslyc8tr5e2g",
"weasel") == 'iamgoing', "decode weasel == weasl"
Jan. 18, 2019