2026. június 10., szerda

RSA kulcsok generálása és visszafejtése

import secrets
import random

# 1. Miller-Rabin prímteszt
def miller_rabin(n, k=5):
    if n < 2: return False
    if n in (2, 3): return True
    if n % 2 == 0: return False

    # n-1 = 2^s * d felbontás
    d = n - 1
    s = 0
    while d % 2 == 0:
        d //= 2
        s += 1

    for _ in range(k):
        a = secrets.randbelow(n - 3) + 2
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(s - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

# 2. Nagy prím generálása adott bitszámmal
def generate_large_prime(bits=1024):
    while True:
        # Páratlan szám generálása
        n = secrets.randbits(bits) | (1 << bits - 1) | 1
        if miller_rabin(n):
            return n

# 3. Kiterjesztett euklideszi algoritmus
# ax + by = gcd(a,b). Visszatérési érték: (gcd, x, y)
def extended_gcd(a, b):
    if a == 0:
        return b, 0, 1
    gcd, x1, y1 = extended_gcd(b % a, a)
    x = y1 - (b // a) * x1
    y = x1
    return gcd, x, y

# Moduláris inverz számítás (a * x = 1 mod m)
def mod_inverse(a, m):
    gcd, x, y = extended_gcd(a, m)
    if gcd != 1:
        raise ValueError("A moduláris inverz nem létezik.")
    return x % m

# 4. RSA Kulcsgenerálás
def generate_rsa_keys(bits=512):
    p = generate_large_prime(bits)
    q = generate_large_prime(bits)
    n = p * q
    phi_n = (p - 1) * (q - 1)

    # Nyilvános kulcs (e) választása
    while True:
        e = secrets.randbelow(phi_n)
        if e > 1 and extended_gcd(e, phi_n)[0] == 1:
            break

    # Titkos kulcs (d) számítása
    d = mod_inverse(e, phi_n)
    
    return (e, n), (d, n)

# 5. Titkosítás
def encrypt(public_key, plaintext):
    e, n = public_key
    # Üzenet (karakterlánc) konvertálása számmá
    message = int.from_bytes(plaintext.encode('utf-8'), 'big')
    cipher = pow(message, e, n)
    return cipher

# 6. Visszafejtés
def decrypt(private_key, ciphertext):
    d, n = private_key
    message = pow(ciphertext, d, n)
    # Szám konvertálása vissza karakterlánccá
    try:
        byte_length = (message.bit_length() + 7) // 8
        plaintext_bytes = message.to_bytes(byte_length, 'big')
        return plaintext_bytes.decode('utf-8')
    except Exception:
        return "Hiba a visszafejtés során"

# --- Példa futtatás ---
if __name__ == "__main__":
    print("RSA kulcsok generálása folyamatban...")
    public_key, private_key = generate_rsa_keys(bits=256) # Teszteléshez rövidebb kulcs
    
    print(f"\nNyilvános kulcs (e, n):\n{public_key}")
    print(f"\nTitkos kulcs (d, n):\n{private_key}")
    
    message = "Titkos üzenet a kriptográfiához!"
    print(f"\nEredeti üzenet: {message}")
    
    # Titkosítás
    ciphertext = encrypt(public_key, message)
    print(f"\nTitkosított szöveg (számként): {ciphertext}")
    
    # Visszafejtés
    decrypted_message = decrypt(private_key, ciphertext)
    print(f"\nVisszafejtett üzenet: {decrypted_message}")
----------------------
Válasz
----------------------
RSA kulcsok generálása folyamatban...

Nyilvános kulcs (e, n):
(1920916985852970459043629395409263969246621197918328070322237977929018840074419703965021760537109678079016866773330106596487429181662092659033763396896187, 8165416843091695222455265542795392256816772823855224489218066336246731692834273371865217084702507589613323755519638859146226123292805743590636779649319161)

Titkos kulcs (d, n):
(4735353450344245588049210762751135074215273281857045509341616675421219264946593318403009021903920390000489040394670078412221784391920284130359943066135155, 8165416843091695222455265542795392256816772823855224489218066336246731692834273371865217084702507589613323755519638859146226123292805743590636779649319161)

Eredeti üzenet: Titkos üzenet a kriptográfiához!

Titkosított szöveg (számként): 8081259975579316313307267154334539515924421916623907674871938229155170337519114633688855096916952942088667274952408298601570158158950773970345505682334131
Visszafejtett üzenet: Titkos üzenet a kriptográfiához!
** Process exited - Return Code: 0 **
-----------------
import os
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 1. RSA kulcspár generálása
print("Kulcspár generálása folyamatban...")
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=4096
)

public_key = private_key.public_key()

# 2. Privát kulcs mentése PEM formátumban
private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption() # Jelszavas védelemhez lásd a dokumentációt
)

with open('private_key.pem', 'wb') as f:
    f.write(private_pem)

# 3. Nyilvános kulcs mentése PEM formátumban
public_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

with open('public_key.pem', 'wb') as f:
    f.write(public_pem)

print("A kulcsok sikeresen elkészültek és mentésre kerültek.")
print("Privát kulcs: private_key.pem")
print("Nyilvános kulcs: public_key.pem")
----------------
átlátok rajtad mint Ahogy Hans Castorp madame Chauchat testén

Nincsenek megjegyzések:

Megjegyzés küldése