import math
import secrets
# ==================== 1. Primzahlgenerator ====================
def is_prime_fermat(n):
"""Einfacher Fermat-Test zur Basis 2"""
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
return pow(2, n - 1, n) == 1
def generate_prime(bits=512):
"""Generiert eine zufällige ungerade Primzahl der gewünschten Bitlänge"""
while True:
# Höchstes Bit setzen (garantiert Bitlänge) & unterstes Bit (garantiert ungerade)
candidate = (
(1 << (bits - 1)) | secrets.randbelow(1 << (bits - 1)) | 1
)
if is_prime_fermat(candidate):
return candidate
# ==================== 2. SchlĂĽsselgenerierung ====================
def generate_rsa_keys(bits=1024):
half_bits = bits // 2
p = generate_prime(half_bits)
q = generate_prime(half_bits)
while q == p:
q = generate_prime(half_bits)
N = p * q
phi = (p - 1) * (q - 1)
# Zufälliges e in der Größenordnung von N suchen (ggT(e, phi) == 1)
e = secrets.randbelow(N) | 1
while math.gcd(e, phi) != 1:
e += 2
# Geheimer Exponent d via Modulo-Inversum
d = pow(e, -1, phi)
return (N, e), (N, d), p, q
# ==================== 3. Ver- & EntschlĂĽsselung ====================
def encrypt(m, public_key):
N, e = public_key
return pow(m, e, N)
def decrypt(c, private_key):
N, d = private_key
return pow(c, d, N)
# ==================== Demo / AusfĂĽhrung ====================
if __name__ == "__main__":
print("=== RSA-1024 Demonstration (reines Python) ===\n")
# Keygen (1024 Bit)
pub_key, priv_key, p, q = generate_rsa_keys(bits=1024)
N, e = pub_key
_, d = priv_key
print(f"Primzahl p ({p.bit_length()} Bit): {p}")
print(f"Primzahl q ({q.bit_length()} Bit): {q}")
print(f"Modul N ({N.bit_length()} Bit): {N}")
print(f"Exponent e ({e.bit_length()} Bit): {e}")
print(f"Exponent d ({d.bit_length()} Bit): {d}")
print("-" * 70)
# Nachricht als Text
text_nachricht = "Hello World"
m = int.from_bytes(text_nachricht.encode("utf-8"), byteorder="big")
print(f'Original Text: "{text_nachricht}"')
print(f"Nachricht als Int: {m}")
# VerschlĂĽsseln
c = encrypt(m, pub_key)
print(f"VerschlĂĽsselt (c): {c}")
# EntschlĂĽsseln
m_dec = decrypt(c, priv_key)
text_dec = m_dec.to_bytes(
(m_dec.bit_length() + 7) // 8, byteorder="big"
).decode("utf-8")
print(f"EntschlĂĽsselt (Int): {m_dec}")
print(f'EntschlĂĽsselt Text: "{text_dec}"')
print("-" * 70)
if m == m_dec:
print("âś… ERFOLG: Die Nachricht wurde korrekt ver- und entschlĂĽsselt!")
else:
print("❌ FEHLER: Die Nachricht stimmt nicht überein!")