Khi sinh khoá RSA, nếu hai số nguyên tố p,q được chọn quá gần nhau (∣p−q∣ nhỏ so với n), môđun n=p⋅q có thể bị phân tích rất nhanh bằng phương pháp Fermat, bất kể n lớn cỡ nào.
Ý tưởng: vì p,q gần nhau nên a=2p+q và b=2p−q đều là số nguyên, và
n=p⋅q=a2−b2
Thuật toán Fermat: bắt đầu với a=⌈n⌉, kiểm tra a2−n có phải là số chính phương không; nếu chưa, tăng a lên 1 và thử lại, cho đến khi tìm được b=a2−n nguyên. Khi đó:
p=a−b,q=a+b
Vì p,q gần nhau nên thuật toán hội tụ chỉ sau rất ít vòng lặp, dù p,q có hàng trăm chữ số.
Sau khi phân tích được n=p⋅q, ta tính φ(n)=(p−1)(q−1), khoá riêng d=e−1modφ(n), rồi giải mã bản mã c:
m=cdmodn
m, 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) (với n được sinh từ hai số nguyên tố p,q gần nhau) và bản mã c, hãy phân tích n, 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) ở input mẫu, bản rõ khôi phục là "RSAFERMAT".
Một dòng gồm 3 số nguyên cách nhau bởi khoảng trắng: n e c.
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...