Optimized transpose.py

Is much faster because it only tries truly different keys.
if tqdm is installed a progressbar will be printed while decrypting
This commit is contained in:
tabledevil
2019-10-19 02:01:40 +02:00
parent 842bd147db
commit 12c85abc7b

View File

@@ -1,5 +1,13 @@
#!/usr/bin/env python3
import pprint import pprint
import math import math
import itertools
try:
import tqdm
has_tqdm=True
except ImportError:
print("Install tqdm for Progressbar! (pip3 install tqdm)")
has_tqdm=False
secret="OUHRSTHFSOENOFETURFELIRFTSNEMOEEMELNTARETOKCAETBFIHFTTTNMEELEEOHYBAERORCRSEDNCEUUTHITOYRSTEDSBEIEOTNLRMOEFPOHHAYLAGXYISNIARAUABGBURILFERPEEHTECDINNDITHFFIEHTKESYTDHEREOALGNABSMWEHVEFSOAMETAOCRFTAHEOFSINAMEOTRNGRINTHFFIEHTIEGMELNTSTEOMCOHEOWTEWREAIDANHTRARARTEHEETVFIYREAHVSAONDPROSTRAEUOYCTTTHWISANMUHETENTIISEDHETSUSENTEITNG OOLEEB L" secret="OUHRSTHFSOENOFETURFELIRFTSNEMOEEMELNTARETOKCAETBFIHFTTTNMEELEEOHYBAERORCRSEDNCEUUTHITOYRSTEDSBEIEOTNLRMOEFPOHHAYLAGXYISNIARAUABGBURILFERPEEHTECDINNDITHFFIEHTKESYTDHEREOALGNABSMWEHVEFSOAMETAOCRFTAHEOFSINAMEOTRNGRINTHFFIEHTIEGMELNTSTEOMCOHEOWTEWREAIDANHTRARARTEHEETVFIYREAHVSAONDPROSTRAEUOYCTTTHWISANMUHETENTIISEDHETSUSENTEITNG OOLEEB L"
@@ -8,11 +16,6 @@ row_key="GHPTYPAMTAPQRNDHD" # (21) missing 4 chars one of which is 'D'
col_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ" col_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
row_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ" row_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#As we know from the cold wars in the galaxy with the KLI, the Mondoshiva used the double transposition cipher with first/inner column and second/outer row transformation for encryption to secure the most powerful information. Furthermore, they usually used the longer keys for the rows
def cell_length(text_length,key_length): def cell_length(text_length,key_length):
return math.ceil(text_length/key_length) return math.ceil(text_length/key_length)
@@ -72,7 +75,6 @@ def prows(a,header=None):
counter+=1 counter+=1
print("%s : %s"%(heading,x)) print("%s : %s"%(heading,x))
def encode(text,key): def encode(text,key):
text=text.ljust(padded_length(len(text),len(key)),'_') text=text.ljust(padded_length(len(text),len(key)),'_')
columnized_text=cols(text,len(key)) columnized_text=cols(text,len(key))
@@ -84,17 +86,6 @@ def decode(text,key):
reorderd=mosh(row_data,revert_key(key)) reorderd=mosh(row_data,revert_key(key))
return cols_to_str(reorderd) return cols_to_str(reorderd)
def decross(text,key_rows,key_cols):
#revert row transformation
matrix_cells=len(key_rows)*len(key_cols)
if len(text) != matrix_cells:
print("!!TEXT HAD TO BE PADDED!!")
text=text.ljust(matrix_cells,'_')
#generate rows with a length of the column-key
matrix=rows(text,len(key_cols))
prows(matrix,key_rows)
def get_col_keys(): def get_col_keys():
for x in col_alpha: for x in col_alpha:
yield col_key+x yield col_key+x
@@ -110,21 +101,25 @@ def get_row_keys():
yield(row_key+x+y+"D"+z) yield(row_key+x+y+"D"+z)
yield(row_key+x+y+z+"D") yield(row_key+x+y+z+"D")
def nub(it): def normalize_keys(key_generator):
seen = set() k = [revert_key(revert_key(x)) for x in key_generator]
for x in it: k.sort()
if x not in seen: return list(k for k,_ in itertools.groupby(k))
yield x
seen.add(x)
def decryptor(): def decryptor():
for col_key in get_col_keys(): rowkeys=normalize_keys(get_row_keys())
for row_key in get_row_keys(): colkeys=normalize_keys(get_col_keys())
text=encode(encode(secret,col_key),row_key) if has_tqdm:
yield "{};{};{}".format(row_key,col_key,text) pbar=tqdm.tqdm(total=(len(rowkeys)*len(colkeys)))
with open("output3.txt",'w') as f: with open("normalized2.txt",'w') as f:
for possiblematch in decryptor(): for col_key in colkeys:
f.write(possiblematch+'\n') for row_key in rowkeys:
text=encode(encode(secret,col_key),row_key)
f.write("{};{};{}\n".format(row_key,col_key,text))
if has_tqdm:
pbar.update(1)
if has_tqdm:
pbar.close()
decryptor()