68 lines
1.8 KiB
Python
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)))
|
||
|
|