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