O'quv Markazi / Kriptografiya / Kripto Hujumlar

Kripto Hujumlar va CTF Toolbox

Chastota tahlili, Padding Oracle, Birthday Attack, Known/Chosen Plaintext, Length Extension — kriptografik zaifliklarni tushunish va CTF musobaqalarida qo'llash.

Padding Oracle Birthday Attack Length Extension Known Plaintext CyberChef pycryptodome

1 Kriptografik Hujum Turlari

Kriptografik Hujum Modeli Ciphertext Only
Faqat shifr matn. Chastota tahlili, brute force.
Known Plaintext
Ba'zi (plain, cipher) juftlar ma'lum.
Chosen Plaintext
Ixtiyoriy matnni shifrlata oladi.
Chosen Ciphertext
Ixtiyoriy shifr matnni deshifrlata oladi.
Hujumchi kuchi ortib boradi → Implementatsiya Hujumlari: Side-Channel
Vaqt, quvvat, elektromagnit nurlanish
Fault Attack
Xato kiritish, differensial tahlil
Birthday Attack
Hash koliziya: O(√n)
Length Extension
SHA-256: H(K||M) → H(K||M||pad||M')
Kriptografik kuch (algoritm) vs Implementatsiya zaifliği — ikkalasini bilish kerak

2 Padding Oracle Hujumi

Padding Oracle — AES-CBC'da server padding xatosini oshkor qilsa, butun ciphertext deshifrlanishi mumkin. POODLE (2014), BEAST (2011) hujumlari shu zaiflikdan foydalangan. TLS 1.3 ushbu hujumni butunlay yo'q qildi (CBC ishlatilmaydi).

Padding Oracle: CBC Deshifrlash C[i-1] C[i] AES⁻¹(K) Intermediate I[i] = AES⁻¹(C[i]) ⊕ P[i] = I[i] ⊕ C[i-1] Padding Oracle So'rovi C'[i-1] = C[i-1] ⊕ I[i] ⊕ \x01 → Server: Valid padding?

Hujum Bosqichlari

1

Oxirgi baytni topish

C[i-1] ning oxirgi baytini o'zgartira borib server 'valid padding' qaytarguncha kutish. Bu I[i] ning oxirgi baytini beradi.

2

Plaintext baytini hisoblash

P[i][j] = I[i][j] ⊕ C[i-1][j]

3

Keyingi baytga o'tish

\x02 padding uchun oxirgi 2 baytni to'g'irlash, yangi baytni topish.

4

Blokni to'liq deshifrlash

16 bayt uchun 16×256 = 4096 so'rov maksimal (odatda kamroq).

# Padding Oracle konseptual misol
def padding_oracle_attack(ciphertext, oracle):
    # oracle(c) → True agar padding to'g'ri
    blocks = [ciphertext[i:i+16]
              for i in range(0, len(ciphertext), 16)]
    plaintext = b""

    for block_idx in range(1, len(blocks)):
        C_prev = bytearray(blocks[block_idx - 1])
        C_curr = blocks[block_idx]
        intermediate = bytearray(16)
        plain_block = bytearray(16)

        for byte_idx in range(15, -1, -1):
            pad_val = 16 - byte_idx
            modified = bytearray(C_prev)

            # Avvalgi topilgan baytlarni to'g'rilash
            for k in range(byte_idx + 1, 16):
                modified[k] = intermediate[k] ^ pad_val

            # Joriy baytni qidirish
            for guess in range(256):
                modified[byte_idx] = guess
                if oracle(bytes(modified) + C_curr):
                    intermediate[byte_idx] = guess ^ pad_val
                    plain_block[byte_idx] = intermediate[byte_idx] ^ C_prev[byte_idx]
                    break

        plaintext += bytes(plain_block)

    return plaintext  # PKCS7 padding olib tashlanadi

# Himoya: AES-GCM ishlatish (AEAD)
# Yoki: Encrypt-then-MAC sxemasi

3 Birthday Attack (Tug'ilgan kun paradoksi)

Matematik Asosi

n-bitli hash funksiyada koliziya topish uchun faqat 2^(n/2) ta urinish yetarli (brute force kabi 2^n emas). Bu hash uzunligini samarali "yarmiga" kamaytiradi.

Ehtimollik formulasi:

P(koliziya) ≈ 1 - e^(-k²/2n)

k = sinov soni, n = hash fazosi o'lchami

50% koliziya ehtimoli uchun:

k ≈ 1.177 × √n

MD5 (128-bit):~2^64 ta urinish
SHA-1 (160-bit):~2^80 ta urinish
SHA-256 (256-bit):~2^128 ta urinish

Haqiqiy Hayotdagi Misol

MD5 koliziyasi (2004, Wang Xiaoyun)

Ikki xil matn bilan bir xil MD5 hash hosil qilindi. Raqamli sertifikatlarni soxtalashtirish imkoni yaratildi.

SHAttered (2017, Google)

Bir xil SHA-1 hashga ega 2 ta turli PDF yaratildi. 6500 CPU-yil hisoblash resursi sarflandi.

Flame zararli dasturi (2012)

MD5 koliziyasidan foydalanib, soxta Microsoft sertifikati bilan imzolangan. Windows Update orqali tarqaldi.

CTFda Birthday Attack

Kichik hash o'lchamli (16-32 bit) funksiyalar CTF'da koliziya topish orqali buzilishi mumkin.

import hashlib, random, string

# Kichik hash uchun birthday attack demo (CTF misol)
def small_hash(data: bytes, bits: int = 24) -> bytes:
    # Faqat n-bit ishlatadigan zaif hash
    h = hashlib.sha256(data).digest()
    mask = (1 << bits) - 1
    val = int.from_bytes(h[:4], 'big') & mask
    return val.to_bytes(4, 'big')

def birthday_attack(bits: int = 24):
    seen = {}
    attempts = 0
    while True:
        msg = ''.join(random.choices(string.ascii_letters, k=8)).encode()
        h = small_hash(msg, bits)
        if h in seen and seen[h] != msg:
            print(f"Koliziya! '{seen[h].decode()}' == '{msg.decode()}'")
            print(f"Hash: {h.hex()}, Urinishlar: {attempts}")
            return
        seen[h] = msg
        attempts += 1

# 24-bit hash uchun ~2^12 ≈ 4096 urinish kutiladi
birthday_attack(24)

# Himoya: Etarli uzunlikdagi hash (≥256-bit), SHA-256, SHA-3

4 Hash Length Extension Hujumi

SHA-1, SHA-256, MD5 da agar H(secret || message) ma'lum bo'lsa, secret bilmagan holda H(secret || message || padding || extra) hisoblab bo'ladi. Bu API autentifikatsiyasida keng tarqalgan zaiflik.

Hujum Qanday Ishlaydi?

Holat:

Server tekshiradi: mac == SHA256(secret + query)

URL: ?data=user&mac=abc123

Hujumchi (secret bilmaydi):

SHA-256 ichki holati uzluksiz — qayta ishga tushirish mumkin.

SHA256(secret + "user" + padding + "&admin=true") — eski MAC va qo'shimcha ma'lumotdan hisoblanadi.

Zaif API misol:

mac = sha256(SECRET + data)
# Hujumchi: data + padding + "&admin=true"
# Yangi to'g'ri MAC hisoblanadi!
# hashpump yoki hlextend bilan
# pip install hashpumpy
import hashpumpy

original_data = b"user=alice&role=user"
original_mac = "known_hash_value"
secret_len = 16  # Taxminiy, brute force qilinadi
append_data = b"&role=admin"

new_mac, new_data = hashpumpy.hashpump(
    original_mac,
    original_data,
    append_data,
    secret_len
)
print(f"Yangi MAC: {new_mac}")
print(f"Yangi data: {new_data}")

# ============================================
# HIMOYA: HMAC ishlatish!
# ============================================
import hmac, hashlib

# To'g'ri: HMAC-SHA256
def safe_mac(secret, data):
    return hmac.new(secret, data, hashlib.sha256).hexdigest()

# HMAC length extension hujumiga chidamli!
# HMAC(K, M) = H(K⊕opad || H(K⊕ipad || M))
# Ichki hash holati hujumchi uchun yopiq

5 Known/Chosen Plaintext Hujumlari

Known Plaintext Attack (KPA)

Hujumchi ba'zi plaintext–ciphertext juftlarini biladi va kalit yoki shifrni tiklashga harakat qiladi.

WW2 Enigma mashinasi

Nemis xabarlari "WETTER" (ob-havo) so'zi bilan boshlanganligi Alan Turing va Bletchley Park ga Enigma ni buzishda yordam berdi.

CTF: XOR Shifr

# Agar: C = P XOR K
# Va P bitta bayt ma'lum:
key_byte = cipher[i] ^ known_plain[i]
# Takrorlanuvchi kalit uchun:
for key_len in range(1, 40):
    key = [c[i] ^ p[i]
           for i in range(key_len)]

Chosen Plaintext Attack (CPA)

Hujumchi ixtiyoriy plaintextni shifrlata oladi. Bu kuchliroq model — ECB Oracle hujumi bunga misol.

ECB Byte-at-a-time Oracle

# Server: AES-ECB(your_input + secret)
# 1. Blok o'lchamini topish
for i in range(1, 64):
    c = oracle('A' * i)
    if len(c) > prev_len:
        block_size = len(c) - prev_len
        break

# 2. Har bir baytni topish
# oracle('A'*15) == oracle('A'*15 + secret[0])?
for byte in range(256):
    if oracle(prefix + chr(byte)) == target:
        secret_byte = byte; break

6 CTF Kripto Toolbox

Muhim Kutubxonalar (Python)

pycryptodome

pip install pycryptodome

AES, RSA, DES, hashing, PKCS padding — to'liq kripto kutubxona

pwntools

pip install pwntools

CTF uchun Swiss Army knife: netcat, number theory, encoding

from pwn import *
n = number.getPrime(512)
log.info(hex(n))

gmpy2

pip install gmpy2

Katta sonlar arifmetikasi: iroot, is_prime, powmod

import gmpy2
root, exact = gmpy2.iroot(C, 3)  # cube root

sympy

pip install sympy

CRT, factorint, mod inverse, nthroot

from sympy import factorint, mod_inverse
from sympy.ntheory.modular import crt

Online Vositalar

CyberChef

gchq.github.io/CyberChef

400+ operatsiya: Base64, AES, XOR, ROT, Vigenere, hash, GZIP...

dcode.fr

dcode.fr/cipher-identifier

Shifr turid avtomatik aniqlash, 200+ klassik shifr yechish

factordb.com

RSA n ni faktorlashtirish ma'lumotlar bazasi

Millionlab faktorlashtirilgan sonlar — CTFda tez tekshirish

RsaCtfTool

github.com/RsaCtfTool/RsaCtfTool

Avtomatik RSA hujumlar: Wiener, Fermat, small e, ROCA...

crackstation.net

15 milliard hashdan parol topish

# ============================================
# CTF Kripto: Universal Starter Template
# ============================================
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Util.number import long_to_bytes, bytes_to_long
from Crypto.Util.Padding import unpad
import gmpy2, hashlib, base64
from sympy import factorint, mod_inverse

# RSA kalitdan n, e, d, p, q olish
def rsa_from_pem(pem_str):
    key = RSA.import_key(pem_str)
    return key.n, key.e, key.d, key.p, key.q

# RSA: n ni faktorlashtirish (kichik n uchun)
def factor_n(n):
    factors = factorint(n)
    if len(factors) == 2:
        p, q = list(factors.keys())
        return p, q
    raise ValueError("n ikki omilga ajralmadi")

# RSA: d ni tiklash
def recover_d(e, p, q):
    phi = (p - 1) * (q - 1)
    return int(mod_inverse(e, phi))

# RSA: deshifrlash
def rsa_decrypt(c, d, n):
    return long_to_bytes(pow(c, d, n))

# AES-ECB deshifrlash
def aes_ecb_decrypt(ct_hex, key_hex):
    ct = bytes.fromhex(ct_hex)
    key = bytes.fromhex(key_hex)
    cipher = AES.new(key, AES.MODE_ECB)
    pt = cipher.decrypt(ct)
    try:
        return unpad(pt, 16).decode()
    except:
        return pt

# XOR brute force
def xor_brute(ciphertext: bytes):
    for key in range(256):
        pt = bytes(b ^ key for b in ciphertext)
        if b"CTF{" in pt or b"flag{" in pt:
            print(f"Key={key}: {pt}")

# Multi-byte XOR crack (chastota tahlili bilan)
def xor_multi_crack(ct: bytes, key_len: int):
    key = []
    for i in range(key_len):
        block = bytes(ct[j] for j in range(i, len(ct), key_len))
        # E harfi (0x65) eng ko'p → XOR key byte
        freq = sorted(range(256), key=lambda k: block.count(k), reverse=True)
        key.append(freq[0] ^ 0x65)
    return bytes(key)

7 CTF Kripto Masalasi Checklist

Aniqlash

  • □Encoding? (Base64, Hex, ASCII)
  • □Klassik shifr? (dcode.fr)
  • □Hash? (uzunlikni tekshirish)
  • □RSA parametrlari? (n, e, c)
  • □AES kalit va IV?
  • □XOR? (bir xil uzunlik?)

Tez Tekshirish

  • □CyberChef — Magic recipe
  • □factordb.com — RSA n
  • □crackstation.net — hash
  • □ROT1-25 brute force
  • □Atbash dekodlash
  • □Base64/32/16 decode

Chuqur Tahlil

  • □RsaCtfTool — RSA hujumlar
  • □IC hisoblash (Vigenere?)
  • □ECB naqsh tekshirish
  • □Padding oracle sinovi
  • □CTR nonce reuse
  • □Length extension (HMAC?)

Bilimni Sinash

1. Padding Oracle hujumidan himoya uchun qaysi usul eng samarali?

2. 128-bitli hash funksiyada Birthday Attack nechi urinishda 50% koliziya ehtimolini beradi?

3. Length Extension hujumidan himoya uchun qaysi konstruksiya ishlatiladi?

Kriptografiya Bo'limi Tugadi!

Siz modulli arifmetika, klassik shifrlar, AES, RSA, Diffie-Hellman, hashlash, xabar autentifikatsiyasi, raqamli imzolar, PKI/TLS va kripto hujumlarni o'rgandingiz. Endi CTF musobaqalarida kripto masalalarini yechishga tayyorsiz!

Modulli Arifmetika Klassik Shifrlar AES / DES RSA / DH Hashlash MAC / HMAC Raqamli Imzolar PKI / TLS Kripto Hujumlar