cryptanalysis_scripts/column_transposition.py

68 lines
1.8 KiB
Python

# Entschlüsselung einer Spaltentransposition bzw. Erzeugung einer Spaltentransformation
# gibt alle Varianten der Matrix aus (sofern möglich, aussser fuer 1 und Gesamtzahl)
import numpy as np
text = "Ml6,=o:3K1d81e1u49y3"
# Test ob Laenge des Einganstextes keine Primzahl
prim = len(text)
nonprim_list = []
for n in range(2, prim):
if prim % n == 0:
nonprim_list.append(n)
if nonprim_list == []:
print("Die Zeichenlänge", prim, "ist eine Primzahl, daher keine Spaltentransformation möglich.")
# leere Liste für Geheimtext
t = [] * len(text)
# wandle Geheimtext in Liste um
for i in text:
t.append(i)
# ermittle die Teiler der Buchstabenanzahl
def get_factors(x):
# leere Liste fuer Faktoren
f = []
# durchlaufe Anzahl Buchstaben
for i in range(1, x + 1):
# wenn teilbar
if x % i == 0:
# erweitere Liste um Teiler
f.append(i)
return f
# erstelle Matrix
def get_matrix(t, f):
# entferne Wert 1 und Wert der Buchstabenanzahl
# 1 Spalte und 1 Zeile wird nicht dargestellt
f = f[1:]
f = f[:-1]
# fuer Anzahl Spalten
for col in f:
# leerer String fuer Darstellung
s = ""
# Zeilen = Anzahl / Spalten
row = int(len(t) / col)
print('\nSpalten:', col, ', Zeilen:', row)
# erstelle Matrix aus Liste
m = np.asarray(t).reshape(col, row).T
print('Matrix:')
# durchlaufe Anzahl der Zeilen
for r in range(row):
# Ausgabe der Spalteninhalte
for c in range(col):
print(m[r][c], end=" ")
s = s + m[r][c]
print()
# Ausgabe des moeglichen Klartextes
print('\nString:\n' + s)
print('\n-----')
get_matrix(t, get_factors(len(text)))