Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [An toàn thông tin] Phá RSA khi p, q gần nhau (Fermat Factorization)

    Khi sinh khoá RSA, nếu hai số nguyên tố p,qp, qp,q được chọn quá gần nhau (∣p−q∣|p - q|∣p−q∣ nhỏ so với n\sqrt{n}n​), môđun n=p⋅qn = p \cdot qn=p⋅q có thể bị phân tích rất nhanh bằng phương pháp Fermat, bất kể nnn lớn cỡ nào.

    Ý tưởng: vì p,qp, qp,q gần nhau nên a=p+q2a = \dfrac{p+q}{2}a=2p+q​ và b=p−q2b = \dfrac{p-q}{2}b=2p−q​ đều là số nguyên, và

    n=p⋅q=a2−b2n = p \cdot q = a^2 - b^2n=p⋅q=a2−b2

    Thuật toán Fermat: bắt đầu với a=⌈n⌉a = \lceil \sqrt{n} \rceila=⌈n​⌉, kiểm tra a2−na^2 - na2−n có phải là số chính phương không; nếu chưa, tăng aaa lên 111 và thử lại, cho đến khi tìm được b=a2−nb = \sqrt{a^2 - n}b=a2−n​ nguyên. Khi đó:

    p=a−b,q=a+bp = a - b, \qquad q = a + bp=a−b,q=a+b

    Vì p,qp, qp,q gần nhau nên thuật toán hội tụ chỉ sau rất ít vòng lặp, dù p,qp, qp,q có hàng trăm chữ số.

    Sau khi phân tích được n=p⋅qn = p \cdot qn=p⋅q, ta tính φ(n)=(p−1)(q−1)\varphi(n) = (p-1)(q-1)φ(n)=(p−1)(q−1), khoá riêng d=e−1 mod φ(n)d = e^{-1} \bmod \varphi(n)d=e−1modφ(n), rồi giải mã bản mã ccc:

    m=cd mod nm = c^{d} \bmod nm=cdmodn

    mmm, biểu diễn thành chuỗi byte lớn-đứng-trước với độ dài tối thiểu, là một chuỗi văn bản UTF-8.

    Yêu cầu: Cho khoá công khai (n,e)(n, e)(n,e) (với nnn được sinh từ hai số nguyên tố p,qp, qp,q gần nhau) và bản mã ccc, hãy phân tích nnn, khôi phục khoá riêng và giải mã, in ra bản rõ dạng văn bản.

    Ví dụ: Với bộ (n,e,c)(n, e, c)(n,e,c) ở input mẫu, bản rõ khôi phục là "RSAFERMAT".

    • Định dạng đầu vào:

      Một dòng gồm 3 số nguyên cách nhau bởi khoảng trắng: n e cn\ e\ cn e c.

    • Định dạng đầu ra:

      Một dòng duy nhất: chuỗi văn bản (UTF-8) là bản rõ giải mã được.

    Ví dụ:

    Đầu vào:

    839162940128777173103611947830887989558941328297917104375138479957054215533762433837860109 65537 70026283521975035023184059232712302259602872722062275486542332264227287343266190506279906
    

    Đầu ra:

    RSAFERMAT
    

    Đầu vào:

    848745978775668094633829840971680358746271273542234985556116557671382586888337702925038092204198233301 65537 296977540223040934455786457209827681330035072982074559306023921321318592591226714960091025102645459737
    

    Đầu ra:

    X
    

    Đang tải editor...