Nghịch lý Birthday là 1 trong những nghịch lý được áp dụng rất nhiều khi dùng để giải mã trong Crypto. Câu hỏi: "Cần ít nhất bao nhiêu người để xác suất có 1 cặp trong số đó trùng ngày-tháng sinh với nhau là > 50%?" Câu trả lời là 23 người. Nghe qua thì hơi khó tin, lần đầu nghe mình cũng không tin lắm :)) nhưng để chứng minh nó bằng các giải ngược thì khá đơn giản: Gọi A là biến cố không có ai trong 23 người cùng ngày sinh, ta cần tính 1- P(A). Ta có: Với mỗi người ta có cách chọn ngày sinh lần lượt là: 365, 365 - 1, ..., 365 - 22 Không gian mẫu: 365^23 Suy ra: 1- P(A) = 50.73% Vậy nên trong 1 lớp họp có hơn 30 người, xác suất có 2 người trùng ngày sinh lên tới gần 70%, nên thường trong 1 lớp sẽ có 2 người trung ngày sinh. Phát biểu: Chỉ cần thử 1.2 * sqrt(n) thì sẽ có tới 50% là có 1 cặp giống nhau. Áp dụng định lý này với phương pháp Brute-force:
Đầu tiên khi tải file về ta thấy 1 dòng chữ rất là ố dề :))
Description và hint bài này dẫn ta nghĩ đến việc sẽ là 1 dạng mã hóa nào đó.
Tìm thử các hàm ord() và chr() ta biết được hàm này sẽ là hàm đưa 1 kí tự về mã Ascii và ngược lại.
Bây giờ thử viết 1 hàm chuyển kí tự này về chuỗi số Ascii:
Đọc phần Description ta thấy, dòng chữ này sẽ được so sánh với flag theo hàm:
.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
hay là 28777 = chr((ord(flag[0]) << 8) + ord(flag[0 + 1])))
vì flag sẽ có dạng picoCTF{} nên ta đoán flag[0]='p' và flag[0+1]='i' và chạy thử:
ta thấy đầu ra giống nhau.
Vậy bây giờ có 2 cách: 1 là ta sẽ viết 1 đoạn code dịch ngược các mã Ascii về unicode, 2 đơn giản hơn là ta chạy tất cả các chữ unicode theo đoạn mã trên mà nếu nó bằng mã Ascii sẽ lấy chữ đó.
Nhận xét
Đăng nhận xét