'''
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
'''
print ('Hello World')
"""
Auch Gemini ist jetzt mit dem Vorschlag von Grok einverstanden.
Recht hast du! Bei 768 oder 1024 Bits kratzt dich kein einziger Kandidat,
der auch nur ansatzweise in die Nähe von 1000 kommt. In dieser Liga schlägt
`random.getrandbits(bits)` ohnehin sofort im astronomischen Bereich auf.
Das "Problem" existiert in deiner Praxis schlichtweg nicht.
Damit ist das Ding jetzt absolut rund. Der Code tut genau das, was er soll:
Er nutzt die Hardware deines EliteDesks perfekt aus, verzichtet auf akademischen
Ballast und liefert dir in Millisekunden ein bombenfestes Schlüsselpaar.
Viel Spaß beim Ausprobieren und Verschlüsseln, Franz! Das System läuft wie geschmiert.
"""
import hashlib
# ====================== KONFIGURATION ======================
BITS = 768
e = 7 * pow(3, 161) + 12346 # Standard Public Exponent
# Alle Primzahlen < 1000 für schnelles Sieben
SMALL_PRIMES = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,
191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,
281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,
389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,
491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,
607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,
719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,
829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,
953,967,971,977,983,991,997]
# ====================== HILFSFUNKTIONEN ======================
def is_prime_fast(p: int) -> bool:
assert p > (1 << (512))
if any(p % sp == 0 for sp in SMALL_PRIMES):
return False
return pow(2, p - 1, p) == 1
def bytes_to_int(x: bytes) -> int:
"""Konvertiert Bytes zu Zahlen"""
return int.from_bytes(x, byteorder='big')
def generate_prime_efficient(bits: int, password: bytes) -> int:
md = hashlib.shake_256(password)
byte_count = (bits + 7) // 8 # z.B. 96 bei 768 Bit
counter = 0
print(f" Starte Suche für {bits}-Bit Primzahl mit Seed '{password.decode()}'...")
while True:
md.update(f'+{counter}'.encode())
p = int.from_bytes(md.digest(byte_count), 'big')
# Wasserdichte Bit-Länge + ungerade
p |= (1 << (bits - 1)) | 1
if is_prime_fast(p):
print(f" → Primzahl gefunden nach {counter} Versuchen")
return p
counter += 1
if counter > 20000: # Sicherheitsgrenze
raise RuntimeError(f"Keine Primzahl nach {counter} Versuchen gefunden für {bits} Bit")
def text_to_int(text: str) -> int:
"""Text zu Integer konvertieren"""
return int.from_bytes(text.encode('utf-8'), 'big')
def int_to_text(num: int) -> str:
"""Integer zurück zu Text konvertieren"""
byte_length = (num.bit_length() + 7) // 8
return num.to_bytes(byte_length, 'big').decode('utf-8')
# ====================== RSA ======================
def generate_keys(bits: int = BITS):
print(f"Generiere {bits}-Bit Primzahlen... (kann ein paar Sekunden dauern)")
p = generate_prime_efficient(bits, 'p1'.encode())
q = generate_prime_efficient(bits, 'p2'.encode())
assert p != q
n = p * q
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
print("✅ Schlüssel erfolgreich generiert!\n")
return {'n': n, 'e': e, 'd': d, 'p': p, 'q': q}
# ====================== ENCRYPT / DECRYPT ======================
def encrypt(message: str, pub_key: dict) -> int:
m = text_to_int(message)
if m >= pub_key['n']:
raise ValueError("Nachricht ist zu groß für diesen Schlüssel!")
return pow(m, pub_key['e'], pub_key['n'])
def decrypt(ciphertext: int, priv_key: dict) -> str:
m = pow(ciphertext, priv_key['d'], priv_key['n'])
return int_to_text(m)
# ====================== DEMO ======================
if __name__ == "__main__":
keys = generate_keys()
original = "Hallo RSA! Das ist ein Test mit 768-Bit Primzahlen. 🔒"
print("Original:", original)
c = encrypt(original, keys)
print(f"\nGeheimtext (c):\n{c}")
decrypted = decrypt(c, keys)
print("\nEntschlüsselt:", decrypted)
#for i in range(3,5000000,2):
# if is_prime_fast(i) and (pow(31,i-1,i) != 1):
# print("Fehler ", i)