Vollständiger Python-Quellcode
import math
import random
# primzahlen erzeugen
obergrenze = 100
primliste = [2] #Initialisierung Primzahlarray
for i in range(3,obergrenze,2):
teilbar = False
for j in range(2, math.ceil(math.sqrt(i))+1):
if(i/j == i//j):
teilbar = True
break
if(not teilbar):
primliste.append(i)
print("Primzahlen zwischen 0 und",obergrenze,": ",primliste)
# Öffentlichen Modulus und Eulersche Phi-Funktion davon
p = primliste[random.randint(0, len(primliste)-1)] #zufällige Auswahl
primliste.remove(p) #Sicherstellen, dass p und q unterschiedlich
q = primliste[random.randint(0, len(primliste)-1)] #zufällige Auswahl
print("zufällig ausgewähltes p: ", p, "und q: ", q)
phiVonN = (p-1)*(q-1)
print("Phi(N): (",p,"- 1 ) * (",q,"- 1 ) = ", phiVonN, "\n")
N = p*q #öffentlicher Modulus
print ("** öffentlicher Modulus:" ,N)
# mit größtem gemeinsamen Teiler den öffentlichen Schlüssel bestimmen
def ggt(a,b): #Euklidischer Algorithmus
if b==0:
return a
return ggt(b,a%b)
e = 2 #Initialisierung mit Startwert
while ggt(e,phiVonN)!=1: #BrutForce Gleichung lösen
e = e + 1
print("** öffentlicher schlüssel: ", e)
# privaten Schlüssel bestimmen
d = 2 #Initialisierung mit Startwert
while (d*e)%phiVonN!=1: #Nochmal BruteForce
d = d + 1
print("** privater schlüssel: ", d)
klarzahl = 42 #irgendeine Zahl...
if klarzahl<(N-1):
geheimzahl = pow(klarzahl,e,N)
neueklarzahl = pow(geheimzahl,d,N)
print("\nklarzahl:", klarzahl,
"\ngeheimzahl:", geheimzahl,
"\nentschlüsselt: ", neueklarzahl)
else:
print("öffentlicher Modulus ", N, "ist kleiner als ", klarzahl, "+1")