RSA Kriptografiyasi
Asimmetrik
Qiyin
RSA nima?
RSA (Rivest-Shamir-Adleman, 1977) — eng mashhur asimmetrik kriptosistema. Katta sonlarni faktorizatsiya qilishning qiyinligiga asoslangan.
🔑 Kalit juft
- Ochiq kalit (n, e) — hamma biladigan
- Maxfiy kalit (n, d) — faqat siz bilasiz
Kalit yaratish (step-by-step)
1
Ikkita katta tub son tanlang: p, q
2
n = p × q hisoblang
3
φ(n) = (p-1) × (q-1) — Euler funksiyasi
4
e tanlang: 1 < e < φ(n), gcd(e, φ(n)) = 1 (odatda 65537)
5
d hisoblang: e × d ≡ 1 (mod φ(n)) — modular teskari
Shifrlash va deshifrlash
Shifrlash: C = Me mod n
Deshifrlash: M = Cd mod n
from sympy import isprime, mod_inverse
import random
def rsa_keygen(bits: int = 512):
# RSA kalit juft yaratish
# 1. Ikkita katta tub son
# (Sodda misol uchun kichik sonlar)
p = 61
q = 53
# 2. n
n = p * q # 3233
# 3. phi
phi = (p - 1) * (q - 1) # 3120
# 4. e
e = 17 # gcd(17, 3120) = 1
# 5. d (modular teskari)
d = mod_inverse(e, phi) # 2753
return (n, e), (n, d)
def rsa_encrypt(m: int, n: int, e: int) -> int:
# Shifrlash: c = m^e mod n
return pow(m, e, n)
def rsa_decrypt(c: int, n: int, d: int) -> int:
# Deshifrlash: m = c^d mod n
return pow(c, d, n)
# Misol
public_key, private_key = rsa_keygen()
n, e = public_key
_, d = private_key
print(f"Ochiq kalit: n={n}, e={e}")
print(f"Maxfiy kalit: d={d}")
message = 65 # Shifrlash uchun son
ciphertext = rsa_encrypt(message, n, e)
print(f"Shifrlangan: {ciphertext}") # 2790
decrypted = rsa_decrypt(ciphertext, n, d)
print(f"Deshifrlangan: {decrypted}") # 65
CTF da RSA hujumlari
🔓 Kichik n
n kichik bo'lsa → faktorizatsiya qiling
factordb.com
🔓 e=3, kichik m
m³ < n bo'lsa → oddiy kub ildiz
m = c^(1/3)
🔓 Wiener
d juda kichik bo'lsa
continued fractions
🔓 Common modulus
Bir xil n, turli e bilan
extended gcd
from sympy import integer_nthroot
from math import isqrt
# e=3 Cube Root hujumi
def cube_root_attack(c: int, n: int) -> int:
"m^3 < n bolsa ishlaydi"
m, perfect = integer_nthroot(c, 3)
if perfect:
return m
return None
# Fermat faktorizatsiya
def fermat_factor(n: int):
"p va q bir biriga yaqin bolsa"
a = isqrt(n) + 1
while True:
b2 = a * a - n
b = isqrt(b2)
if b * b == b2:
return (a - b, a + b)
a += 1
# n = 100000007
p, q = fermat_factor(100000007)
print(f"p={p}, q={q}") # p=9999, q=10001
💡 Bu mavzu bo'yicha amaliy mashq qilishni istaysizmi?
Asimmetrik challengelarini ko'rish →