RSA funktioniert nicht
Verfasst: Sonntag 12. März 2023, 14:34
Hi,
ich muss in Info nen Vortrag über asymetrische Kryptographie halten und hatte mich mal selbst versucht das zu programmieren, sodass die andren aus meiner Klasse das auch verstehen können. Und irgendwie fühl ich mich echt dumm, weil das hier funktioniert nicht, dabei ist es fast dasselbe was ich schonmal verwendet habe, und da hats funktioniert, war aber nicht so simpel geschrieben:
(ich hoffe, das zählt nicht unter 'Hausaufgaben, ich hätte ja auch nen xbeliebiges Programm ausm Internet nehmen können oder mein altes aber ich wollte es ja verständlicher schreiben nochmal')
import random as rd
def mod(a,m):
return a % m
def convdectobin(x,n=2):
l = []
while x != 0:
x,r = x//n,x%n
l.append(r)
print('converted')
return list(reversed(l))
def power(a,b,n): # with S&M
bb = convdectobin(b)
st = 1
for fig in bb:
st *= st
if fig == 1:
st *= a
st = mod(st,n)
print('solved! power')
return st
def isprime(n): # because the primes here are about 3 figs
if n < 2:
return False
prime = [True for i in range(n+1)]
p = 2
while p**2 <= n:
if prime[p] == True:
for i in range(p**2, n+1, p):
prime = False
p += 1
return prime[n]
def prime_generator():
# first prime is 2
yield 2
# starting from 3, check odd numbers for primality
n = 3
while True:
if isprime(n):
yield n
n += 2
primegen = prime_generator()
primegen1 = prime_generator()
def getRSAprimes():
a,b = 1,1
while a == b:
a,b = rd.randint(10,100),rd.randint(10,100)
if a > b:
a,b = b,a
b -= a
c = 1
while c < a:
c += 1
r = next(primegen1)
cb = 0
while cb < b:
cb += 1
def getRSAprimes():
a,b = 1,1
while a == b:
a,b = rd.randint(10,100),rd.randint(10,100)
if a > b:
a,b = b,a
b -= a
c = 1
while c < a:
c += 1
r = next(primegen)
cb = 0
while cb < b:
cb += 1
rb = next(primegen)
return [r,rb]
def EEA(a,b,ex=False):
x, y, u, v = 0, 1, 1, 0
while a != 0:
q, r = b // a, b % a
m, n = x - u*q, y - v*q
b, a, x, y, u, v = a, r, u, v, m, n
gcd = b
return [gcd, x, y] if ex else gcd
def getRSAkeys(p,q):
n = p*q
ph = (p-1)*(q-1)
te = [3,17,(2**16 + 1)]
rle = False
for e in te:
if EEA(e,ph) == 1:
rle = e
while not rle:
to = next(primegen)
if EEA(to,ph) == 1:
rle = to
if not rle:
print('ERROR')
return False
dcan = EEA(p,rle,True)[1]
d = mod(dcan,ph)
return [n,d,rle]
def writecrypt():
M = int(input('Message'))
e = int(input('coms key '))
n = int(input('coms n '))
Mr = mod(M,n)
if Mr != M:
print('changed your Message to:',Mr)
return power(Mr,e,n)
def getcrypt():
ps = getRSAprimes()
ks = getRSAkeys(ps[0],ps[1])
print('key',ks[2])
print('n',ks[0])
ct = int(input('crypt:'))
return power(ct,ks[1],ks[0])
die funktionen sollten selbsterklärend sein, sonst weiß ich hoffentlich später noch, was die machen.
Was jetzt falsch ist: ich hab mir selber eine Message geschickt und mit den öffentlichen Keys aus getcrypt() die Nachricht verschlüsseln lassen und das Chiffrat wieder in getcrypt() eingegeben, aber es kam nicht dasselbe heraus. Ich hab auch schon alle Funktionen getestet, die sollten alle funktionieren, wie ich sie haben will. Ich hab auch schon die Ausgabe vom EEA vertauscht, also mir den 'falschen' Linearfakto ausgeben lassen (Zeile 106, das indice von dcan von 2 zu 1 geändert) aber es kam immer noch das falsche heraus.
Kann mir hier vlt jemand helfen, den Fehler zu finden? Danke schonmal <3
ich muss in Info nen Vortrag über asymetrische Kryptographie halten und hatte mich mal selbst versucht das zu programmieren, sodass die andren aus meiner Klasse das auch verstehen können. Und irgendwie fühl ich mich echt dumm, weil das hier funktioniert nicht, dabei ist es fast dasselbe was ich schonmal verwendet habe, und da hats funktioniert, war aber nicht so simpel geschrieben:
(ich hoffe, das zählt nicht unter 'Hausaufgaben, ich hätte ja auch nen xbeliebiges Programm ausm Internet nehmen können oder mein altes aber ich wollte es ja verständlicher schreiben nochmal')
import random as rd
def mod(a,m):
return a % m
def convdectobin(x,n=2):
l = []
while x != 0:
x,r = x//n,x%n
l.append(r)
print('converted')
return list(reversed(l))
def power(a,b,n): # with S&M
bb = convdectobin(b)
st = 1
for fig in bb:
st *= st
if fig == 1:
st *= a
st = mod(st,n)
print('solved! power')
return st
def isprime(n): # because the primes here are about 3 figs
if n < 2:
return False
prime = [True for i in range(n+1)]
p = 2
while p**2 <= n:
if prime[p] == True:
for i in range(p**2, n+1, p):
prime = False
p += 1
return prime[n]
def prime_generator():
# first prime is 2
yield 2
# starting from 3, check odd numbers for primality
n = 3
while True:
if isprime(n):
yield n
n += 2
primegen = prime_generator()
primegen1 = prime_generator()
def getRSAprimes():
a,b = 1,1
while a == b:
a,b = rd.randint(10,100),rd.randint(10,100)
if a > b:
a,b = b,a
b -= a
c = 1
while c < a:
c += 1
r = next(primegen1)
cb = 0
while cb < b:
cb += 1
def getRSAprimes():
a,b = 1,1
while a == b:
a,b = rd.randint(10,100),rd.randint(10,100)
if a > b:
a,b = b,a
b -= a
c = 1
while c < a:
c += 1
r = next(primegen)
cb = 0
while cb < b:
cb += 1
rb = next(primegen)
return [r,rb]
def EEA(a,b,ex=False):
x, y, u, v = 0, 1, 1, 0
while a != 0:
q, r = b // a, b % a
m, n = x - u*q, y - v*q
b, a, x, y, u, v = a, r, u, v, m, n
gcd = b
return [gcd, x, y] if ex else gcd
def getRSAkeys(p,q):
n = p*q
ph = (p-1)*(q-1)
te = [3,17,(2**16 + 1)]
rle = False
for e in te:
if EEA(e,ph) == 1:
rle = e
while not rle:
to = next(primegen)
if EEA(to,ph) == 1:
rle = to
if not rle:
print('ERROR')
return False
dcan = EEA(p,rle,True)[1]
d = mod(dcan,ph)
return [n,d,rle]
def writecrypt():
M = int(input('Message'))
e = int(input('coms key '))
n = int(input('coms n '))
Mr = mod(M,n)
if Mr != M:
print('changed your Message to:',Mr)
return power(Mr,e,n)
def getcrypt():
ps = getRSAprimes()
ks = getRSAkeys(ps[0],ps[1])
print('key',ks[2])
print('n',ks[0])
ct = int(input('crypt:'))
return power(ct,ks[1],ks[0])
die funktionen sollten selbsterklärend sein, sonst weiß ich hoffentlich später noch, was die machen.
Was jetzt falsch ist: ich hab mir selber eine Message geschickt und mit den öffentlichen Keys aus getcrypt() die Nachricht verschlüsseln lassen und das Chiffrat wieder in getcrypt() eingegeben, aber es kam nicht dasselbe heraus. Ich hab auch schon alle Funktionen getestet, die sollten alle funktionieren, wie ich sie haben will. Ich hab auch schon die Ausgabe vom EEA vertauscht, also mir den 'falschen' Linearfakto ausgeben lassen (Zeile 106, das indice von dcan von 2 zu 1 geändert) aber es kam immer noch das falsche heraus.
Kann mir hier vlt jemand helfen, den Fehler zu finden? Danke schonmal <3