Cryptography
Medium
150 points
Baby RSA 1
Recuite 2025 - HCMUS
6 tháng 10, 2025
RSA
CRT
Fault Attack

Cryptography
Baby RSA 1 - Write-up#
Thông Tin Challenge#
- Danh mục: Cryptography
- Độ khó: Trung bình - Khó
- Lỗ hổng: Kiểm soát tùy ý q_inv trong tái kết hợp RSA-CRT
Tổng Quan#
Server tạo RSA keypair và cho phép:
- Decrypt ciphertext tùy ý với "magic number" do user cung cấp (q_inv)
- Tiết lộ public key (n, e)
- Tiết lộ encrypted flag
Phân Tích Lỗ Hổng#
Triển Khai RSA-CRT#
pythondef decrypt_data(c, private_key, q_inv):
p, q, d = private_key[0], private_key[1], private_key[2]
dp, dq = d % (p - 1), d % (q - 1)
m1 = pow(c, dp, p)
m2 = pow(c, dq, q)
h = q_inv * (m1 - m2) % p
m = m2 + h * q % (p * q)
return long_to_bytes(m)
Lỗi: q_inv nên là inverse(q, p) nhưng lại do user kiểm soát!
Tấn Công Toán Học#
Với ciphertext c cố định và hai giá trị q_inv khác nhau (a và b):
Δ = m(a) - m(b) = [((a-b)(m1 - m2) mod p)] * q
Do đó: gcd(n, |Δ|) = q với xác suất cao!
Sơ Đồ Tấn Công#
mermaidgraph TD A[Start] --> B[Query Server] B --> C1[Get Public Key n,e] B --> C2[Get Encrypted Flag] D[Prepare Attack] --> E[Choose Random c] E --> F1[Decrypt c with q_inv=1] E --> F2[Decrypt c with q_inv=2] F1 --> G[Calculate Difference] F2 --> G G --> H[GCD with n] H --> I[Factor Found: q] I --> J[Calculate p = n/q] J --> K[Reconstruct Private Key d] K --> L[Decrypt Flag] L --> M[Success!] style A fill:#f9f,stroke:#333,stroke-width:4px style M fill:#9f9,stroke:#333,stroke-width:4px
Kế Hoạch Tấn Công#
- Query public key (n, e) và flag_enc
- Chọn c ngẫu nhiên ≠ flag_enc
- Decrypt c với q_inv=1 → nhận dec1
- Decrypt c với q_inv=2 → nhận dec2
- Tính g = gcd(n, |dec1 - dec2|)
- Tìm thấy phân tích thừa số! Tái tạo private key d
- Decrypt flag_enc
Flag#
BPCTF{Thank_you_naul_for_finding_this_not_so_intended_solution_901832123ab}
Bài Học Rút Ra#
- Không bao giờ cho phép user kiểm soát tham số CRT!
- q_inv phải được tính trước:
q_inv = inverse(q, p) - Fault attacks trên CRT có thể phá vỡ hoàn toàn RSA
- Thông tin lỗi có thể leak secrets ngay cả không có giải mã "đúng"
150
Points
Medium
Difficulty
Cryptography
Category