moved ctf stuff
This commit is contained in:
125
ctf/transpose.py
Normal file
125
ctf/transpose.py
Normal file
@@ -0,0 +1,125 @@
|
||||
#!/usr/bin/env python3
|
||||
import pprint
|
||||
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"
|
||||
col_key="EJALMVWUSTRPOBY" # (16)missing 1 char
|
||||
row_key="GHPTYPAMTAPQRNDHD" # (21) missing 4 chars one of which is 'D'
|
||||
col_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
row_alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
|
||||
def cell_length(text_length,key_length):
|
||||
return math.ceil(text_length/key_length)
|
||||
|
||||
def padded_length(text_length,key_length):
|
||||
return cell_length(text_length,key_length)*key_length
|
||||
|
||||
def revert_key(enc_key):
|
||||
return [x[0] for x in sorted(enumerate(enc_key), key=lambda x: x[1])]
|
||||
|
||||
def mosh(text,enc_key):
|
||||
tmp=sorted(zip(text,enc_key), key=lambda x: x[1])
|
||||
return [x[0] for x in tmp]
|
||||
|
||||
def cols(text,key_length):
|
||||
# col_length=cell_length(len(text),key_length)
|
||||
columns=[ "" for i in range(0,key_length) ]
|
||||
cursor=0
|
||||
for c in text:
|
||||
columns[cursor%key_length]+=c
|
||||
cursor += 1
|
||||
return columns
|
||||
|
||||
def rows(text,key_length):
|
||||
# row_length=math.ceil(len(text)/key_length)
|
||||
rows=[text[i:i+key_length] for i in range(0,len(text),key_length)]
|
||||
return rows
|
||||
|
||||
def cols_to_str(a):
|
||||
max_length=max([len(i) for i in a] )
|
||||
result=""
|
||||
for i in range(0,max_length):
|
||||
for x in a:
|
||||
try:
|
||||
result+=x[i]
|
||||
except:
|
||||
pass
|
||||
return result
|
||||
|
||||
def rows_to_str(a):
|
||||
return "".join(a)
|
||||
|
||||
def pcols(a):
|
||||
print("COLUMS:")
|
||||
text=cols_to_str(a)
|
||||
split_text=rows(text,len(a))
|
||||
for x in split_text:
|
||||
print(x)
|
||||
|
||||
def prows(a,header=None):
|
||||
print("ROWS:")
|
||||
counter=0
|
||||
for x in a:
|
||||
if header:
|
||||
heading="{}".format(header[counter]).ljust(5)
|
||||
else:
|
||||
heading="{}".format(counter).ljust(5)
|
||||
counter+=1
|
||||
print("%s : %s"%(heading,x))
|
||||
|
||||
def encode(text,key):
|
||||
text=text.ljust(padded_length(len(text),len(key)),'_')
|
||||
columnized_text=cols(text,len(key))
|
||||
shuffled_colums=mosh(columnized_text,key)
|
||||
return rows_to_str(shuffled_colums)
|
||||
|
||||
def decode(text,key):
|
||||
row_data=rows(text,cell_length(len(text), len(key)))
|
||||
reorderd=mosh(row_data,revert_key(key))
|
||||
return cols_to_str(reorderd)
|
||||
|
||||
def get_col_keys():
|
||||
for x in col_alpha:
|
||||
yield col_key+x
|
||||
|
||||
def get_row_keys():
|
||||
for x in row_alpha:
|
||||
for y in row_alpha:
|
||||
for z in row_alpha:
|
||||
# for d in row_alpha:
|
||||
# yield(row_key+d+x+y+z)
|
||||
yield(row_key+"D"+x+y+z)
|
||||
yield(row_key+x+"D"+y+z)
|
||||
yield(row_key+x+y+"D"+z)
|
||||
yield(row_key+x+y+z+"D")
|
||||
|
||||
def normalize_keys(key_generator):
|
||||
k = [revert_key(revert_key(x)) for x in key_generator]
|
||||
k.sort()
|
||||
return list(k for k,_ in itertools.groupby(k))
|
||||
|
||||
def decryptor():
|
||||
rowkeys=normalize_keys(get_row_keys())
|
||||
colkeys=normalize_keys(get_col_keys())
|
||||
if has_tqdm:
|
||||
pbar=tqdm.tqdm(total=(len(rowkeys)*len(colkeys)))
|
||||
|
||||
with open("normalized2.txt",'w') as f:
|
||||
for col_key in colkeys:
|
||||
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()
|
||||
Reference in New Issue
Block a user