Một hệ thống RSA cẩu thả dùng chung một môđun n cho hai người dùng khác nhau, chỉ khác số mũ công khai: người A có khoá (n,e1), người B có khoá (n,e2), với gcd(e1,e2)=1.
Cùng một bản rõ m (0<m<n, gcd(m,n)=1) được mã hoá gửi cho cả hai:
c1=me1modn,c2=me2modn
Vì gcd(e1,e2)=1, dùng thuật toán Euclid mở rộng ta tìm được u,v∈Z sao cho
u⋅e1+v⋅e2=1
Khi đó, không cần biết khoá riêng, kẻ tấn công vẫn khôi phục được m nhờ:
c1u⋅c2v≡mue1+ve2≡m1≡m(modn)
(nếu u hoặc v âm, thay ciu bằng (ci−1modn)−u, với ci−1 là nghịch đảo modulo n).
Bản rõ m, khi biểu diễn thành chuỗi byte lớn-đứng-trước (big-endian) với độ dài tối thiểu (tức số byte =⌈(soˆˊ bit của m)/8⌉), chính là một chuỗi văn bản UTF-8 hợp lệ.
Yêu cầu: Cho n,e1,c1,e2,c2, hãy khôi phục lại bản rõ m và in ra dưới dạng chuỗi văn bản gốc.
Ví dụ: với bộ số cho trước mô tả ở trên (xem input mẫu), bản rõ khôi phục được là văn bản "CTF{RSA}".
5 dòng, mỗi dòng một số nguyên: n, e1, c1, e2, c2 (đều là số nguyên không âm, có thể rất lớn).
Một dòng duy nhất: chuỗi văn bản (UTF-8) là bản rõ m đã giải mã được (không có ký tự thừa ở đầu/cuối).
Ví dụ:
Đầu vào:
827970649725430329095702574338281295552278247495092534130659
17
214095739840806742009749525892021437779494717238500813713704
19
754356386446996293965479538913939851148957641131119545535756
Đầu ra:
CTF{RSA}
Đầu vào:
1067059259328029885238977161901727036121423937328744614206640917
3
274625
5
1160290625
Đầu ra:
A
Đang tải editor...