Chúng ta đã thấy là tương đối dễ để kiểm tra một số lớn liệu có phải là số nguyên tố không. Điều này là tốt vì hệ thống mã hóa RSA cần những số nguyên tố lớn để thực hiện.
Ngược lại, tính bảo mật của RSA dựa trên độ khó rõ ràng trong việc tính toán với những số lớn. Nghiên cứu về phép nhân tử hóa đã có từ thời kỳ Hy Lạp cổ đại nhưng nó chỉ dành cho máy tính khi mà mọi người bắt đầu phát triển những thuật toán có khả năng phân tích những số lớn. Nghịch lý RSA là để khiến RSA hoạt động hiệu quả hơn, chúng ta muốn dùng modun N = pq càng nhỏ càng tốt. Mặt khác, nếu nếu đối phương có thể có phân tích N thì thông tin được mã hóa của chúng ta sẽ không còn bảo mật. Do vậy rất quan trọng khi hiểu được khó khăn như thế nào để phân tích những số lớn, và đặc biệt là để hiểu được tiềm năng của những thuật toán khác nhau mà hiện nay được dùng để phân tích thừa số.
Trong vài phần tiếp theo chúng ta sẽ thảo luận một cách chi tiết hơn về một số phương pháp được biết đến để phân tích những số nguyên lớn.
Chúng ta bắt đầu với thuật toán có tên gọi phương pháp Pollard p−1. Mặc dù phương pháp này không có ích với mọi số nhưng vẫn có vài số mà chắc chắn nó có hiệu quả. Phương pháp của Pollard chứng minh rằng có những modun RSA không an toàn mà thoạt nhìn có vẻ là bảo mậ.
Chúng ta đang xét số N = pq và nhiệm vụ là xác định các số nguyên tố p và q. Giả sử ta tìm ra số nguyên L có tính chất
p−1 chia hết L và q −1 không chia hết L.
Điều này có nghĩa là có vài số nguyên i, j và k với k 6= 0 thỏa mãn L = i(p−1)và L = j(q−1) +k.
Xét chuyện gì sẽ xảy ra nếu chúng ta lấy những số nguyên a được chọn ngẫu nhiên và tính aL. Định lý Ferrnat nhỏ cho biết
aL = ai(p−1) = (ap−1)i ≡1i ≡ 1 (mod p),
aL = aj(q−1)+k = ak(aq−1)j ≡ak ã1j ≡ ak (mod q).
Số mũ k không bằng 0, vì vậy ak sẽ không đồng dư với 1 modun q. Do đó, với những lựa chọn tối ưu của a, ta thấy
p chia hết aL −1và q −1không chia hết aL −1.
Từ đây ta có thể khôi phục p qua phép tính UCLN đơn giản p = UCLN(aL −1,N).
Đây là một cách tối ưu nhưng trong đó ta có thể hỏi, liệu ta có thể tìm được số mũ L mà chia hết cho p−1 và không chia hết cho q−1? Quan sát của Pollard là nếu p−1 là tích của những số nguyên tố nhỏ thì nó sẽ chia hết cho n! với vài giá trị không quá lớn của n. Vì vậy đây coi là ý tưởng. Với mỗi số n= 2,3,4. . . ta chọn một giá trị a và tính
UCLN(an! −1,N).
(Để đơn giản ta có thể lấy a = 2). Nếu UCLN bằng 1thì ta tiếp tục giá trị tiếp theo của n. Nếu UCLN bằng N thì ta thật không may mắn, nhưng một giá trị a khác có thể sẽ đúng. Và nếu ta lấy số nằm trong khoảng từ 1 đến N thì ta có thừa số không tầm thường của N và ta sẽ thực hiện được.
Nhận xét 1.4.1. Có hai nhận xét quan trọng cần làm trước khi chúng ta đưa ý tưởng của Pollard vào thực hành. Vấn đề đầu tiên liên quan đến giá trị an!−1.
Thậm chí với a = 2 và với những giá trị trung bình của n, cho n = 100 và sẽ không khả thi để tính chính xác được an! −1. Thực chất, số 2100! có hơn 10157 chữ số, con số mà lớn hơn số lượng các hạt cơ bản trong vũ trụ được biết đến!
May mắn là không cần phải tính toán nó một cách chính xác. Chúng ta chỉ quan tâm đến UCLN của an!−1 và N, vì vậy chỉ cần thoản mãn việc tính
an! −1 (mod N).
sau đó thì lấy UCLN với N. Như vậy chúng ta chưa bao giờ phải làm việc với các con số lớn hơn N.
Thứ hai, chúng ta thậm chí không cần tính số mũ n!. Thay vào đó, giả sử rằng ta đã tính an! ở bước trước, chúng ta có thể tính giá trị tiếp theo như sau
a(n+1)! ≡(an!)n+1 (mod N).
Điều này dẫn đến thuật toán được trình bày ở Bảng 1.3.
Đưa vào. Số nguyên N để phân tích.
1. Đặt a = 2 (hoặc một số giá trị khác thuận tiện).
2. Vòng lặp j = 2,3,4, ... lên đến một giới hạn nhất định.
3. Đặt a = aj mod n.
4. Tính d = UCLN(a−1,N)†.
5. Nếu 1 < d < N thì thành công, trả lại d.
6. Tăng dần j và lặp lại từ Bước 2.
† Để hiệu quả hơn chọn k thích hợp và tính UCLN trong Bước 4 chỉ có mỗi lần lặp thứ k.
Bảng 1.3: Thuật toán phân tích thừa số Pollard p−1
Ví dụ 1.4.2. Ta sử dụng phương pháp Pollard p−1 cho N = 13927189. Bắt
đầu với UCLN(29!−1,N) và lấy giai thừa lớn dần ở số mũ, chúng ta thấy rằng 29!−1≡ 13867883 (mod 13927189), UCLN(29!−1,13927189) = 1, 210!−1≡ 5129508 (mod 13927189), UCLN(210!−1,13927189) = 1, 211!−1≡ 4405233 (mod 13927189), UCLN(211!−1,13927189) = 1, 212!−1≡ 6680550 (mod 13927189), UCLN(212!−1,13927189) = 1, 213!−1≡ 6161077 (mod 13927189), UCLN(213!−1,13927189) = 1, 214!−1≡ 879290 (mod 13927189), UCLN(214!−1,13927189) = 3823.
Dòng cuối cùng cho ta một thừa số không tầm thường p = 3823 của N. Thừa số này là số nguyên tố, và thừa số q = N/p = 13927189/3823 = 3643 cũng là số nguyên tố. Lý do số mũ 14! được làm trong ví dụ này là thừa số p−1 phân tích được thành tích của các số nguyên tố nhỏ,
p−1 = 3822 = 2ã3ã72 ã13.
Cỏc thừa số khỏc thỏa món p−1 = 3642 = 2ã 3ã607, mà khụng phải là tớch của các số nguyên tố nhỏ.
Ví dụ 1.4.3. Chúng ta trình bày một ví dụ khác sử dụng các số lớn. Cho N = 168441398857. Khi đó
250! −1≡ 114787431143 (mod N), UCLN(250! −1,N) = 1, 251! −1≡ 36475745067 (mod N), UCLN(251! −1,N) = 1, 252! −1≡ 67210629098 (mod N), UCLN(252! −1,N) = 1,
253! −1≡ 8182353513 (mod N), UCLN(253! −1,N) = 350437.
Vì vậy, sử dụng 253! −1 ta được kết quả thừa số nguyên tố p= 350437 của N, và thừa số (nguyên tố) khác là 480661.Tất nhiên, p−1 là tích của các thừa số nhỏ,
p−1 = 350436 = 22 ã3ã19::20õ20::53.