Ein frei kopier- und anpassbares Lehrmittel von eduskript.org

Eine simples Python-Programm für RSA.

PythonLoading editor…
import random
 
# Funktion zur Berechnung des grössten gemeinsamen Teilers (ggT)
def ggT(a, b):
    while b != 0:
        a, b = b, a % b
    return a
 
# Funktion zur Berechnung des modularen Inversen
def modinv(a, m):
    m0, x, y = m, 0, 1
    if m == 1:
        return 0
    while a > 1:
        q = a // m # ganzzahlige, abgerundete Division
        m, a = a % m, m
        x, y = y - q * x, x
    if y < 0:
        y += m0
    return y
 
# Funktion zur Generierung eines Schlüsselpaares
def generate_keypair(p, q):
    # Berechne n als Produkt von p und q
    n = p * q
    # Berechne phi als Produkt von (p-1) und (q-1)
    phi = (p - 1) * (q - 1)
 
    gefundener_ggT = 0
    while gefundener_ggT != 1:
        # Wähle e zufällig, sodass 1 < e < phi und ggT(e, phi) = 1
        pub = random.randrange(1, phi)
        gefundener_ggT = ggT(pub, phi)
 
    # Berechne d als das modulare Inverse von e modulo phi
    priv = modinv(pub, phi)
    # Rückgabe des öffentlichen Schlüssels (e, n) und des privaten Schlüssels (d, n)
    return (pub, priv, n)
 
# Funktion zur Verschlüsselung einer Nachricht
def encrypt(pk, plaintext):
    key, n = pk
    # Verschlüssele jedes Zeichen der Nachricht
    cipher = [chr(pow(ord(char), key, n)) for char in plaintext]
    return cipher
 
# Funktion zur Entschlüsselung einer Nachricht
def apply_key(key, n, ciphertext):
    # Entschlüssele jedes Zeichen der verschlüsselten Nachricht
    plain = [chr(pow(ord(char), key, n)) for char in ciphertext]
    return ''.join(plain)
 
# Beispielwerte für p und q (Primezahlen)
p = 61
q = 53
 
print("Generiere Schlüsselpaare...")
public, private, n = generate_keypair(p, q)
print("Öffentlicher Schlüssel:", public)
print("Privater Schlüssel:", private)
print("n:",n)
 
message = "Hallo"
print("Ursprüngliche Nachricht:", message)
encrypted_msg = apply_key(public, n, message)
print("Verschlüsselte Nachricht:", ''.join(map(lambda x: str(x), encrypted_msg)))
decrypted_msg = apply_key(private, n, encrypted_msg)
print("Entschlüsselte Nachricht:", decrypted_msg)