UIUCTF 2023
UIUCTF_2023
CRYPTOGRAPHY WRITEUP
Author:
Pham Quoc Trung
Used Language:
Python3
Problem Solving:
Three-Time Pad
"We've been monitoring our adversaries' communication channels, but they encrypt their data with XOR one-time pads! However, we hear rumors that they're reusing the pads...\n\nEnclosed are three encrypted messages. Our mole overheard the plaintext of message 2. Given this information, can you break the enemy's encryption and get the plaintext of the other messages?"
Attachment: c1,c2,c3,p2
Ở bài này ta có 3 file p1, p2, p3 bị XOR với một one-time pads để tạo nên 3 file c1, c2, c3. Đề bài cung cấp cho ta 3 file mã hóa và p2. Trong đề bài, ta được biết tác giả chỉ dùng 1 pad để XOR với mỗi file. Vậy thì mọi chuyện đã trở nên đơn giản hơn. Sử dụng tính đối xứng của XOR, ta chỉ cần XOR p2 với c2 để tìm ra pad. Tiếp theo sử dụng pad đó để XOR với c1 và c3, ta sẽ ra được p1 và p3.
from pwn import *
c1 = read('c1')
c2 = read('c2')
c3 = read('c3')
p2 = read('p2')
pad = xor(p2,c2)
p1 = xor(c1,pad)
p3 = xor(c3,pad)
print("p1 = ",p1)
print("p2 = ",p2)
print("p3 = ",p3)Flag: uiuctf{burn_3ach_k3y_aft3r_us1ng_1t}
At Home
Mom said we had food at home
Attachment: chal.py
chal.txt
Thoạt nhìn thì đây giống một bài liên quan tới RSA, với những dữ kiện được cung cấp sẵn là n, e và c. Mình không tìm ra được ý tưởng gì về những thứ đề bài cho về a, b, a_, b_, nên mình đã đọc kĩ lại code thì đây không phải RSA :v. n, e, c chỉ đơn giản là tên biến. Vì vậy, mình sẽ brute-force dựa trên công thức của c
Code đơn giản để brute-force:
Flag: uiuctf{W3_hav3_R5A_@_h0m3}
crack_the_safe
"I found this safe, but something about it seems a bit off - can you crack it?"
Attachment: chal.py
Đây là một bài liên quan tới AES ECB. Ở đây đã có sẵn cipher, việc của chúng ta là tìm key. Dữ kiện duy nhất có liên quan tới key là hàm crack_safe.
Nhìn qua, mình nhận thấy có thể sử dụng Logarit rời rạc để tính được key. Mình thử sử dụng sage math để làm việc này
Tuy nhiên xem chừng sử dụng logarith rời rạc có sẵn trong sage có vẻ mất khá nhiều thời gian nên mình phải tự implement nó:
Kết quả trả về:
Tuy nhiên, mình thử lấy kết quả trả về làm key thì bị lỗi về số bits. Check thử thì mình thấy giá trị trả về mới có 108-bits. Đối với AES, mình sẽ cần 128-bits. Vì vậy ở đây mình sẽ brute-force key thật như sau:
Để hiểu đống code trên, hãy nhìn vào nguyên tắc cơ bản của Thuật toán Phần dư Trung Quốc (Chinese Remainder Theorem - CRT).
CRT được sử dụng để giải hệ phương trình dạng x ≡ a (mod m), trong đó a và m là các số nguyên. Nếu m là các số nguyên tố cùng nhau, thì có một giải pháp duy nhất cho hệ phương trình này modulo M, trong đó M là tích của tất cả m.
Trong trường hợp của thuật toán Pohlig-Hellman, m chính là tích của các số nguyên tố q (crt_moduli), và x là giải pháp tìm được thông qua thuật toán Pohlig-Hellman.
Tuy nhiên, do dữ liệu vấn đề, có thể có nhiều giải pháp x khác nhau thỏa mãn g^x ≡ y (mod p). Những giải pháp này có thể được biểu diễn dưới dạng x + k*m, với k là một số nguyên không âm. Điều này xuất phát từ sự thực rằng nếu x là một nghiệm của g^x ≡ y (mod p), thì x + k*m cũng sẽ là một nghiệm, vì m chia hết cho p - 1.
Do vậy, mình brute-force các x có thể và tìm ra x thỏa mãn pow(7,x,p) == y. Giờ đây, việc còn lại là giải mã AES thoi
Flag: uiuctf{Dl0g_w/__UnS4F3__pR1Me5_}
© 2023,Pham Quoc Trung. All rights reserved.
Last updated