From 64d66e5c828d2c3a8ca402751ac6220d33bbe5ab Mon Sep 17 00:00:00 2001 From: marius Date: Wed, 31 May 2023 18:21:26 +0200 Subject: [PATCH] added facotrisation and inverse modulo code --- column_transposition.py | 67 +++++++++++++++++++++++++++++++++++++++++ fermat_factorisation.py | 16 ++++++++++ mult_inv_phi.py | 19 ++++++++++++ multi_inv.py | 7 +++++ pollard_rho.py | 23 ++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 column_transposition.py create mode 100644 fermat_factorisation.py create mode 100644 mult_inv_phi.py create mode 100644 multi_inv.py create mode 100644 pollard_rho.py diff --git a/column_transposition.py b/column_transposition.py new file mode 100644 index 0000000..5d3a247 --- /dev/null +++ b/column_transposition.py @@ -0,0 +1,67 @@ +# 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))) + diff --git a/fermat_factorisation.py b/fermat_factorisation.py new file mode 100644 index 0000000..ef10af6 --- /dev/null +++ b/fermat_factorisation.py @@ -0,0 +1,16 @@ +import math +import decimal + + +def factorise(n): + x = math.ceil(math.sqrt(n)) + y = x ** 2 - n + while not math.sqrt(y).is_integer(): + x += 1 + y = x ** 2 - n + return x + math.sqrt(y), x - math.sqrt(y) + + +n = 1364593 +print("Die beiden Faktoren p und q lauten:", factorise(n)) + diff --git a/mult_inv_phi.py b/mult_inv_phi.py new file mode 100644 index 0000000..5f13fcf --- /dev/null +++ b/mult_inv_phi.py @@ -0,0 +1,19 @@ +def extended_euclidean(a, b): + if a == 0: + return b, 0, 1 + else: + g, x, y = extended_euclidean(b % a, a) + return g, y - (b // a) * x, x + +def mod_inverse(e, phi): + g, x, _ = extended_euclidean(e, phi) + if g != 1: + raise Exception('modular inverse does not exist') + else: + return x % phi + +e = 13 +phi = 1362240 + +d = mod_inverse(e, phi) +print(d) diff --git a/multi_inv.py b/multi_inv.py new file mode 100644 index 0000000..1dc0eb6 --- /dev/null +++ b/multi_inv.py @@ -0,0 +1,7 @@ + +e = 13 +n = 1364593 + +y = pow(e, -1, n) + +print(y) \ No newline at end of file diff --git a/pollard_rho.py b/pollard_rho.py new file mode 100644 index 0000000..0e476c3 --- /dev/null +++ b/pollard_rho.py @@ -0,0 +1,23 @@ +#!/usr/bin/python +import math + + +def rho(n): + x = 3 + y = 3 + d = 1 + while d<=1: + x = (x * x + 23) % n + y = (y * y + 23) % n + y = (y * y + 23) % n + d = math.gcd(x-y,n) + return d + + +def main(): + result = rho(1364593) + print(f"p = {result}") + + +if __name__ == '__main__': + main() \ No newline at end of file