Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for ADFGVX Cipher by tarjeii
from collections import OrderedDict
from itertools import zip_longest
def encode(message, secret_alphabet, keyword):
"""
Encode message using secret alphabet and key
#1 Translate message to fractionated form (row-column), e.g.: FA DV AG XX DX FA GD XX
#2 Divide fraction form into text with same length as key
#3 Put each divided part into key-character (using dict)
#4 Use the sorted key to return the encoded message
"""
#1
d = dict(enumerate('ADFGVX'))
fraction = ""
for x in message:
n = secret_alphabet.find(x.lower())
if n == -1:
continue
fraction += d[n//6] + d[n%6]
#2
dic = OrderedDict.fromkeys(keyword,"")
t = []
for x in range(0,len(fraction),len(dic)):
t.append(fraction[x:x+len(dic)])
#3
u = list(zip_longest(*t, fillvalue=""))
for i,x in enumerate(dic):
dic[x] = u[i]
#4
encode=""
sorted_keyword = sorted(dic)
for x in sorted(dic):
encode += "".join(dic[x])
return encode
def decode(message, secret_alphabet, keyword):
"""
Decode message using secret alphabet and key
#1 Calculate how many message-character each key-character shall have
#2 Dedicate message-characters into each key-character
#3 Create fraction text from transposed table, e.g.: FADVAGXXDXFAGDXX
#4 Translate fraction form using secret alphabet
"""
#1
dic = OrderedDict.fromkeys(keyword)
a = len(message)//len(dic)
b = len(message)%len(dic)
for i,x in enumerate(dic):
if i < b:
dic[x] = a + 1
else:
dic[x] = a
#2
counter = 0
for x in sorted(dic):
a = dic[x]
dic[x] = message[counter:counter+a]
counter += a
#3
t =[]
for x in dic:
t.append(dic[x])
fraction=""
for x in zip_longest(*t,fillvalue=""):
fraction += "".join(x)
#4
decoded =""
d = {'A':0, 'D':1, 'F':2, 'G':3, 'V':4, 'X':5}
for x in range(0,len(fraction)-1,2):
decoded += secret_alphabet[d[fraction[x]]*6+d[fraction[x+1]]]
return decoded
Dec. 10, 2015