Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for ADFGVX Cipher by U.V
from itertools import zip_longest, chain
adf = "ADFGVX"
def encode(message, secret_alphabet, keyword):
# clean message and key
clmsg = [i for i in message.lower() if i.isalnum()]
cleankey = ''
for c in keyword.lower():
if c not in cleankey:
cleankey += c
a = ''.join([''.join(list(map(lambda x: adf[x], divmod(secret_alphabet.index(l), 6)))) for l in clmsg])
for l in clmsg:
r, c = list(map(lambda x: adf[x], divmod(secret_alphabet.index(l), 6)))
lc = len(cleankey)
# new table
k = len(message) // len(cleankey)
nt = []
for i,c in enumerate(cleankey):
nt.append((c, a[i::lc]))
nt.sort(key=lambda x: x[0])
nt1 = [[c, a[i:: lc]] for i, c in enumerate(cleankey)]
nt1 = sorted(nt, key=lambda x: x[0])
return ''.join([i[1] for i in nt1])
def decode(message, secret_alphabet, keyword):
# arr 2
cleankey = ''
for c in keyword.lower():
if c not in cleankey:
cleankey += c
lc = len(cleankey)
sord = sorted(enumerate(cleankey), key=lambda x: x[1])
k = len(message) // len(cleankey)
k1 = len(message) % len(cleankey)
q = 'a' * (len(message) // 2)
a1 = []
sord = [i for i, j in sord]
for i in range(len(cleankey)):
l1 = k + (sord[i] < k1)
m1, message = message[:l1],message[l1:]
a1.append(m1)
a2 = [x for _,x in sorted(zip(sord, a1))]
a3 = list(zip_longest(*a2, fillvalue=''))
a4 = ''.join(list(chain(*a3)))
ans = ''
for r, c in zip(a4[::2], a4[1::2]):
ans += secret_alphabet[ adf.index(r) *6 + adf.index(c)]
return ans
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"
Nov. 23, 2022