added facotrisation and inverse modulo code

This commit is contained in:
marius 2023-05-31 18:21:26 +02:00
parent f377305f49
commit 64d66e5c82
5 changed files with 132 additions and 0 deletions

67
column_transposition.py Normal file
View File

@ -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)))

16
fermat_factorisation.py Normal file
View File

@ -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))

19
mult_inv_phi.py Normal file
View File

@ -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)

7
multi_inv.py Normal file
View File

@ -0,0 +1,7 @@
e = 13
n = 1364593
y = pow(e, -1, n)
print(y)

23
pollard_rho.py Normal file
View File

@ -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()