easy factoring
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
server.py
- Tóm tắt lại đoạn code thì ta thấy đơn giản server sẽ tạo 2 số nguyên tố p và q, sau đó cho ta giá trị
p**2 + q**2
và bắt chúng ta tìm ra 2 số p,q ban đầu.
- Để tìm 2 số khi biết tổng bình phương 2 số đó thì mình sẽ dùng một hàm có sẵn trong sagemath là
two_square
. Docs nói về hàm đó mình để ở đây
- Tuy nhiên hàm này chỉ tìm được 1 cặp giá trị (a,b) sao cho tổng bình phương của nó = n chứ không đảm bảo được a và b là 2 số nguyên tố, thậm chí mình thử thì có một vài số nó còn không tìm được a,b 😐. Vậy nên mình sẽ cho chương trình kết nối server nhiều lần và thử tìm được đúng cặp (a,b) cần tìm, mình sẽ cần tí nhân phẩm để lấy được flag.
solve.py
- Kết quả:
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
Lưu ý do mình in kết quả dạng bytes nên dấu nháy đơn (') sẽ có dấu \ ở trước, vì vậy khi nộp flag ta phải loại bỏ nó.
squareRNG
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
server.py
- Tóm tắt đoạn code:
- Server yêu cầu ta nhập 2 số sb1 và sb2, sau đó random một số sa trong khoảng từ 1 đến p (là một số nguyên tố ngẫu nhiên). Tiếp theo server cho ta 2 số random1 và random2, nếu ta convert nó ra một số binary 32 bit thì bit thứ i của random1 là giá trị của hàm
isSquare
của , tương tự đối đối với random2 (thực ra bản chất hàm isSquare là hàm check xem 1 số có là quadratic residue mod p hay không).
- Sau đó server bắt chúng ta đoán giá trị của hàm isSquare của giá trị (*)
- Ta cần đoán đúng 77 lần liên tiếp để nhận được flag 😥
- Thoạt nhìn thì mình thấy biểu thức chẳng có gì liên quan đến các tổng cả. Tuy nhiên nên nhớ rằng mình có thể chọn số sb1 và sb2. Để đơn giản nhất thì mình chọn 2 số là 1 và -1. Thay vào (*) ta được , mình thử phân tích thừa số nó ra thì được .Tới đây để ý một tí thì mình sẽ thấy sa+1 chính là bit đầu của random1, cục dài dài phía sau là bit cuối của random2. Vậy ta chỉ cần "nhân lại" là có được kết quả.
Tại sao mình nói "nhân lại" thì ra được kết quả. Vì trong hàm isSquare(a,p) thì họ check điểu kiện pow(a, (p-1)//2, p) != p-1
, thực ra vế trái chính là giá trị của Legendre symbol (những ai có làm các challenge đầu mục Mathematics trên Cryptohack thì chắc chắn biết :)) ). Nó chỉ nhận 3 giá trị là 1,-1,0 (chỉ xảy ra khi a là bội của p và nó chắc chắn không thể xảy ra). Nếu gọi L(a) = pow(a, (p-1)//2, p))
thì ta có L(ab) = L(a).L(b)
và do đó L(ab) = 1 (tức hàm isSquare ra kết quả True) khi và chỉ khi L(a) = L(b) = 1 hoặc L(a) = L(b) = -1
- Ý tưởng có rồi, bây giờ chỉ cần viết script để tự động hóa mọi thứ.
solve.py
