def chain_add(seq, end):
a = len(seq)
for i in range(end-a):
seq += chr(48+(ord(seq[i])+ord(seq[i+1]))%32%10)
return seq
def sequent(seq):
res = [0]*len(seq);seq=list(seq)
for z in range(len(seq)):
b=min(range(len(seq)),key=lambda i:seq[i])
res[b]=z
seq[b]="~"
return res
def transpose(text, keys, disrupt=False):
if disrupt:
num_rows, len_last = divmod(len(text),len(keys))
num_rows+=1
if len_last==0:len_last=len(keys)
d_rows = []
for i in range(num_rows):
d_rows += [[]]
text_index = 0
current_row = 0
stop_key = 0
stop_index = keys.index(stop_key)
while current_row < num_rows:
d_rows[current_row]=list(text[text_index:text_index+stop_index])
text_index+=stop_index
stop_index+=1
if stop_index>len(keys):
stop_key=(stop_key+1)%len(keys)
stop_index=keys.index(stop_key)
current_row+=1
current_row = 0
stop_key = 0
stop_len = len(keys)-keys.index(stop_key)
while current_row < num_rows:
d_rows[current_row]+=list(text[text_index:text_index+stop_len])
text_index+=stop_len
stop_len-=1
if stop_len<1:
stop_key+=1
stop_len=len(keys)-keys.index(stop_key)
current_row+=1
current_row+=1
d_rows[-1]+=['']*(len(keys)-len(d_rows[-1]))
columns = []
for j in range(len(keys)):
columns+=[''.join(i[j]for i in d_rows)]
else:
columns = ['']*len(keys)
for t in range(len(text)):
columns[t%len(keys)]+=text[t]
res = [0]*len(keys)
for index in range(len(keys)):
res[keys[index]]=columns[index]
return''.join(res)
def checkerboard(message, seq, word, null):
trans = {".":seq[-2:], "#":seq[-1]*2};m=65;res=''
for i in range(len(word)):
trans[word[i]]=seq[i]
for z in[0,1]:
while chr(m)in word:
m+=1
trans[chr(m)]=seq[z-2]+seq[i];m+=1
while m<90:
for i in seq[len(word):]:
for z in[0,1]:
while chr(m)in word:
m+=1
trans[chr(m)]=seq[z-2]+i;m+=1
for i in message:
if i.isdigit():
res+=i
else:
res+=trans[i]
return res+null[:-len(res)%5]
def vic_cipher(message, keyword, phrase, date, agent, m_id, null):
s1=sequent(phrase[:10])
s2=sequent(phrase[10:20])
a=g=t=""
for i in range(5):
a+=str((int(m_id[i])-int(date[i]))%10)
a=chain_add(a,10)
for i in range(10):
g+=str((int(a[i])+int(s1[i]))%10)
for i in range(10):
t+=str(s2[int(g[i])])
u=chain_add(t,60)[10:]
p=agent+int(u[-2])
q=agent+int(u[-1])
seqT=sequent(t)
v=transpose(u,seqT)
k1=sequent(v[:p])
k2=sequent(v[p:p+q])
c=''.join(str(i)for i in sequent(u[40:]))
x=checkerboard(message,c,keyword,null)
y=transpose(x,k1)
z=transpose(y,k2,1)
e=[z[5*i:5*-~i]for i in range(-(-len(z)//5))]
return' '.join(e[:1-int(date[-1])]+[m_id]+e[1-int(date[-1]):])
print(vic_cipher("HINGELSE.MOVETOSAFEHOUSEFOXTROT#3#..WEAREDISCOVERED.TAKEWHATYOUCAN.BURNEVERYT",\
"SENATORI","THEFIRSTPRINCIPLEIST","3172016",9,"47921","4561"))
ZGVmIGNoYWluX2FkZChzZXEsIGVuZCk6CiAgICBhID0gbGVuKHNlcSkKICAgIGZvciBpIGluIHJhbmdlKGVuZC1hKToKICAgICAgICBzZXEgKz0gY2hyKDQ4KyhvcmQoc2VxW2ldKStvcmQoc2VxW2krMV0pKSUzMiUxMCkKICAgIHJldHVybiBzZXEKCmRlZiBzZXF1ZW50KHNlcSk6CiAgICByZXMgPSBbMF0qbGVuKHNlcSk7c2VxPWxpc3Qoc2VxKQogICAgZm9yIHogaW4gcmFuZ2UobGVuKHNlcSkpOgogICAgICAgIGI9bWluKHJhbmdlKGxlbihzZXEpKSxrZXk9bGFtYmRhIGk6c2VxW2ldKQogICAgICAgIHJlc1tiXT16CiAgICAgICAgc2VxW2JdPSJ+IgogICAgcmV0dXJuIHJlcwoKZGVmIHRyYW5zcG9zZSh0ZXh0LCBrZXlzLCBkaXNydXB0PUZhbHNlKToKICAgIGlmIGRpc3J1cHQ6CiAgICAgICAgbnVtX3Jvd3MsIGxlbl9sYXN0ID0gZGl2bW9kKGxlbih0ZXh0KSxsZW4oa2V5cykpCiAgICAgICAgbnVtX3Jvd3MrPTEKICAgICAgICBpZiBsZW5fbGFzdD09MDpsZW5fbGFzdD1sZW4oa2V5cykKICAgICAgICBkX3Jvd3MgPSBbXQogICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9yb3dzKToKICAgICAgICAgICAgZF9yb3dzICs9IFtbXV0KICAgICAgICB0ZXh0X2luZGV4ID0gMAogICAgICAgIGN1cnJlbnRfcm93ID0gMAogICAgICAgIHN0b3Bfa2V5ID0gMAogICAgICAgIHN0b3BfaW5kZXggPSBrZXlzLmluZGV4KHN0b3Bfa2V5KQogICAgICAgIHdoaWxlIGN1cnJlbnRfcm93IDwgbnVtX3Jvd3M6CiAgICAgICAgICAgIGRfcm93c1tjdXJyZW50X3Jvd109bGlzdCh0ZXh0W3RleHRfaW5kZXg6dGV4dF9pbmRleCtzdG9wX2luZGV4XSkKICAgICAgICAgICAgdGV4dF9pbmRleCs9c3RvcF9pbmRleAogICAgICAgICAgICBzdG9wX2luZGV4Kz0xCiAgICAgICAgICAgIGlmIHN0b3BfaW5kZXg+bGVuKGtleXMpOgogICAgICAgICAgICAgICAgc3RvcF9rZXk9KHN0b3Bfa2V5KzEpJWxlbihrZXlzKQogICAgICAgICAgICAgICAgc3RvcF9pbmRleD1rZXlzLmluZGV4KHN0b3Bfa2V5KQogICAgICAgICAgICBjdXJyZW50X3Jvdys9MQogICAgICAgIGN1cnJlbnRfcm93ID0gMAogICAgICAgIHN0b3Bfa2V5ID0gMAogICAgICAgIHN0b3BfbGVuID0gbGVuKGtleXMpLWtleXMuaW5kZXgoc3RvcF9rZXkpCiAgICAgICAgd2hpbGUgY3VycmVudF9yb3cgPCBudW1fcm93czoKICAgICAgICAgICAgZF9yb3dzW2N1cnJlbnRfcm93XSs9bGlzdCh0ZXh0W3RleHRfaW5kZXg6dGV4dF9pbmRleCtzdG9wX2xlbl0pCiAgICAgICAgICAgIHRleHRfaW5kZXgrPXN0b3BfbGVuCiAgICAgICAgICAgIHN0b3BfbGVuLT0xCiAgICAgICAgICAgIGlmIHN0b3BfbGVuPDE6CiAgICAgICAgICAgICAgICBzdG9wX2tleSs9MQogICAgICAgICAgICAgICAgc3RvcF9sZW49bGVuKGtleXMpLWtleXMuaW5kZXgoc3RvcF9rZXkpCiAgICAgICAgICAgICAgICBjdXJyZW50X3Jvdys9MQogICAgICAgICAgICBjdXJyZW50X3Jvdys9MQogICAgICAgIGRfcm93c1stMV0rPVsnJ10qKGxlbihrZXlzKS1sZW4oZF9yb3dzWy0xXSkpCiAgICAgICAgY29sdW1ucyA9IFtdCiAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKGtleXMpKToKICAgICAgICAgICAgY29sdW1ucys9WycnLmpvaW4oaVtqXWZvciBpIGluIGRfcm93cyldCiAgICBlbHNlOgogICAgICAgIGNvbHVtbnMgPSBbJyddKmxlbihrZXlzKQogICAgICAgIGZvciB0IGluIHJhbmdlKGxlbih0ZXh0KSk6CiAgICAgICAgICAgIGNvbHVtbnNbdCVsZW4oa2V5cyldKz10ZXh0W3RdCiAgICByZXMgPSBbMF0qbGVuKGtleXMpCiAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKGtleXMpKToKICAgICAgICByZXNba2V5c1tpbmRleF1dPWNvbHVtbnNbaW5kZXhdCiAgICByZXR1cm4nJy5qb2luKHJlcykKCmRlZiBjaGVja2VyYm9hcmQobWVzc2FnZSwgc2VxLCB3b3JkLCBudWxsKToKICAgIHRyYW5zID0geyIuIjpzZXFbLTI6XSwgIiMiOnNlcVstMV0qMn07bT02NTtyZXM9JycKICAgIGZvciBpIGluIHJhbmdlKGxlbih3b3JkKSk6CiAgICAgICAgdHJhbnNbd29yZFtpXV09c2VxW2ldCiAgICAgICAgZm9yIHogaW5bMCwxXToKICAgICAgICAgICAgd2hpbGUgY2hyKG0paW4gd29yZDoKICAgICAgICAgICAgICAgIG0rPTEKICAgICAgICAgICAgdHJhbnNbY2hyKG0pXT1zZXFbei0yXStzZXFbaV07bSs9MQogICAgd2hpbGUgbTw5MDoKICAgICAgICBmb3IgaSBpbiBzZXFbbGVuKHdvcmQpOl06CiAgICAgICAgICAgIGZvciB6IGluWzAsMV06CiAgICAgICAgICAgICAgICB3aGlsZSBjaHIobSlpbiB3b3JkOgogICAgICAgICAgICAgICAgICAgIG0rPTEKICAgICAgICAgICAgICAgIHRyYW5zW2NocihtKV09c2VxW3otMl0raTttKz0xCiAgICBmb3IgaSBpbiBtZXNzYWdlOgogICAgICAgIGlmIGkuaXNkaWdpdCgpOgogICAgICAgICAgICByZXMrPWkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXMrPXRyYW5zW2ldCiAgICByZXR1cm4gcmVzK251bGxbOi1sZW4ocmVzKSU1XQoKZGVmIHZpY19jaXBoZXIobWVzc2FnZSwga2V5d29yZCwgcGhyYXNlLCBkYXRlLCBhZ2VudCwgbV9pZCwgbnVsbCk6CiAgICBzMT1zZXF1ZW50KHBocmFzZVs6MTBdKQogICAgczI9c2VxdWVudChwaHJhc2VbMTA6MjBdKQogICAgYT1nPXQ9IiIKICAgIGZvciBpIGluIHJhbmdlKDUpOgogICAgICAgIGErPXN0cigoaW50KG1faWRbaV0pLWludChkYXRlW2ldKSklMTApCiAgICBhPWNoYWluX2FkZChhLDEwKQogICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgIGcrPXN0cigoaW50KGFbaV0pK2ludChzMVtpXSkpJTEwKQogICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgIHQrPXN0cihzMltpbnQoZ1tpXSldKQogICAgdT1jaGFpbl9hZGQodCw2MClbMTA6XQogICAgcD1hZ2VudCtpbnQodVstMl0pCiAgICBxPWFnZW50K2ludCh1Wy0xXSkKICAgIHNlcVQ9c2VxdWVudCh0KQogICAgdj10cmFuc3Bvc2UodSxzZXFUKQogICAgazE9c2VxdWVudCh2WzpwXSkKICAgIGsyPXNlcXVlbnQodltwOnArcV0pCiAgICBjPScnLmpvaW4oc3RyKGkpZm9yIGkgaW4gc2VxdWVudCh1WzQwOl0pKQogICAgeD1jaGVja2VyYm9hcmQobWVzc2FnZSxjLGtleXdvcmQsbnVsbCkKICAgIHk9dHJhbnNwb3NlKHgsazEpCiAgICB6PXRyYW5zcG9zZSh5LGsyLDEpCiAgICBlPVt6WzUqaTo1Ki1+aV1mb3IgaSBpbiByYW5nZSgtKC1sZW4oeikvLzUpKV0KICAgIHJldHVybicgJy5qb2luKGVbOjEtaW50KGRhdGVbLTFdKV0rW21faWRdK2VbMS1pbnQoZGF0ZVstMV0pOl0pCgpwcmludCh2aWNfY2lwaGVyKCJISU5HRUxTRS5NT1ZFVE9TQUZFSE9VU0VGT1hUUk9UIzMjLi5XRUFSRURJU0NPVkVSRUQuVEFLRVdIQVRZT1VDQU4uQlVSTkVWRVJZVCIsXAoiU0VOQVRPUkkiLCJUSEVGSVJTVFBSSU5DSVBMRUlTVCIsIjMxNzIwMTYiLDksIjQ3OTIxIiwiNDU2MSIpKQ==