Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for ADFGVX Cipher by kurosawa4434
from re import sub
ADFGVX = 'ADFGVX'
def encode(message, secret_alphabet, keyword):
dict = {x[0]: x[1] for x in zip(ADFGVX, [secret_alphabet[i * 6: i * 6 + 6] for i in range(6)])}
def search_matrix(x):
for k, v in dict.items():
if v.find(x) > -1:
return k + ADFGVX[v.index(x)]
enc = ''.join([search_matrix(x) for x in sub('[^a-z0-9]', '', message.lower())])
true_key = ''.join([v for i, v in enumerate(keyword) if keyword[:i].find(v) == -1])
return ''.join([x[1] for x in sorted([(v, enc[i::len(true_key)]) for i, v in enumerate(true_key)])])
def decode(message, secret_alphabet, keyword):
dict = {x[0]: x[1] for x in zip(ADFGVX, [secret_alphabet[i * 6: i * 6 + 6] for i in range(6)])}
org_key = ''.join([v for i, v in enumerate(keyword) if keyword[:i].find(v) == -1])
dm = divmod(len(message), len(org_key))
key_dict = {}
idx1 = 0
for i, v in enumerate(org_key):
ln = dm[0] + (1 if i < dm[1] else 0)
key_dict[v] = (idx1, ln)
idx1 += ln
key_dict2 = {}
idx2 = 0
for k, v in sorted(key_dict.items()):
key_dict2[k] = message[idx2: idx2 + v[1]]
idx2 += v[1]
dc_message = ''
for i in range(dm[0] + (1 if dm[1] > 0 else 0)):
for x in org_key:
dc_message += key_dict2[x][i:i + 1]
return ''.join([dict[dc_message[i]][ADFGVX.index(dc_message[i + 1])] for i in range(0, len(dc_message), 2)])
July 24, 2016