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