6.5.2.1 Một số thuật toán phát sinh số khả nguyên tố ngẫu nhiên
Theo định lý số nguyên tố, tỷ lệ của các số nguyên ≤ 𝑥 là số nguyên tố xấp xỉ 1
ln 𝑥. Do một nửa số nguyên ≤ 𝑥 là chẵn, tỷ lệ của các số nguyên lẻ ≤ 𝑥 là số nguyên tố xấp xỉ
2
ln 𝑥. Ví dụ, tỷ lệ của tất cả số lẻ ≤ 2512 là số nguyên tố xấp xỉ 2
512 ln 2 ≈ 1
177. Điều này gợi ý một chiến thuật hợp lý cho việc chọn một số nguyên tố ngẫu nhiên 𝑘-bit bằng cách lặp lại việc chọn số nguyên 𝑘-bit 𝑛 đến khi nó là số nguyên tố do vượt qua kiểm tra Miller-Rabin với giá trị thích hợp của tham số an toàn 𝑡 [40, tr.145-146]
Random-Search(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố 𝑘-bit
(1) Chọn ngẫu nhiên một số nguyên lẻ 𝑘-bit 𝑛.
(2) Nếu Miller-Rabin(𝑛, 𝑡) ≠ “số nguyên tố” thì trở về bước (1). (3) Xuất 𝑛.
Thuật toán 6.6. Phát sinh số khả nguyên tố kiểu tìm kiếm ngẫu nhiên
Thuật toán 6.6 có một biến thể tìm kiếm tăng (incremental search). Thuật toán này khác với thuật toán trên ở một điểm là khi số 𝑛 không phải là số nguyên tố thì thuật toán sẽ kiểm tra số lẻ tiếp theo [40, tr.148].
Incremental-Search(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố 𝑘-bit
(1) Chọn ngẫu nhiên một số nguyên lẻ 𝑘-bit 𝑛. (2) Trong khi Miller-Rabin(𝑛, 𝑡) ≠ “số nguyên tố”
𝑛 ← 𝑛 + 2
(3) Xuất 𝑛.
Thuật toán 6.7. Phát sinh số khả nguyên tố kiểu tìm kiếm tăng
Thuật toán 6.7 được cải tiến bằng cách chọn giá trị bắt đầu 𝑛 là số nguyên tố cùng nhau với các số nguyên tố nhỏ [31, tr.3-4]. Thông thường, ta định nghĩa 𝛱 = 2 × 3 × 5 × 7 × … × 29 và chọn ngẫu nhiên một số 𝑛 𝑘-bit thỏa 𝑔𝑐𝑑(𝑞, 𝛱) = 1. Nếu 𝑛 không phải là số nguyên tố thì 𝑞 = 𝑞 + 𝛱.
Improvement-Incremental-Search(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố 𝑘-bit
(1) Chọn ngẫu nhiên một số nguyên lẻ 𝑘-bit n. (2) Nếu𝑔𝑐𝑑(𝑛, 𝛱) ≠ 1thì quay lại bước (1). (3) Trong khi Miller-Rabin(𝑛, 𝑡) ≠ “số nguyên tố”
𝑛 ← 𝑛 + 𝛱
(4) Xuất n.
Thuật toán 6.8. Phát sinh số khả nguyên tố kiểu tìm kiếm tăng cải tiến
6.5.2.2 Một số thuật toán phát sinh số khả nguyên tố mạnh
Trước các phương pháp phân tích trường hợp đặc biệt, hàng loạt các đề xuất liên quan đến số nguyên tố được chọn để lập mã có một số tính chất đặc biệt đã được đưa ra. Do những tính chất đặc biệt đó đó, cơ hội để các phương pháp phân tích như trình bày ở trên thành công là rất nhỏ. Những số nguyên tố có những tính chất đặc biệt đó được gọi là số “nguyên tố mạnh”. Lý do lịch sử cho sự cần thiết này là để bảo vệ trước các thuật toán phân tích đặc biệt như thuật toán “rho” và 𝑝 – 1 của Pollard,
𝑝 + 1 của Williams (đã được trình bày ở Chương 5).
Một số nguyên tố 𝑝 được xem là một số nguyên tố mạnh nếu nó thỏa mãn các điều kiện sau:
𝑝 là một số nguyên tố lớn.
Thừa số nguyên tố lớn nhất của 𝑝 – 1, gọi là 𝑝−, lớn.
Nghĩa là 𝑝 = 𝑎−𝑝−+ 1 với số nguyên 𝑎− và số nguyên tố lớn 𝑝−.
Thừa số nguyên tố lớn nhất của 𝑝−− 1, gọi là 𝑝−−, lớn.
Nghĩa là 𝑝− = 𝑎−−𝑝−−+ 1 với số nguyên 𝑎−− và số nguyên tố lớn 𝑝−−.
Thừa số nguyên tố lớn nhất của 𝑝 + 1, gọi là 𝑝+, lớn.
Nghĩa là 𝑝 = 𝑎+𝑝+– 1 với số nguyên 𝑎+ và số nguyên tố lớn 𝑝+.
“Lớn” ở đây tùy thuộc vào các phương pháp phân tích hiện tại. Thường thì kích thước của 𝑝 trên 256 bit còn kích thước của các thừa số 𝑝−, 𝑝−−, 𝑝+ trên 100 bit. Đôi khi, một số nguyên tố gọi là mạnh nếu nó chỉ cần thỏa mãn chỉ một tập con của các điều kiện trên, ví dụ 𝑝−–mạnh nếu 𝑝− lớn, 𝑝−−–mạnh nếu 𝑝−− lớn, 𝑝+–mạnh nếu 𝑝+ lớn, 𝑝−, 𝑝+ –mạnh nếu cả 𝑝− và 𝑝−− đều lớn, 𝑝−, 𝑝−−, 𝑝+ –mạnh, hoặc gọn hơn là mạnh, nếu cả 𝑝−, 𝑝−− và 𝑝+ đều lớn.
Williams và Schmid gọi 𝑝−–siêu mạnh (hoặc 𝑝−−–siêu mạnh hoặc 𝑝+–siêu mạnh) nếu 𝑎− = 2 (hoặc 𝑎−− = 2 hoặc 𝑎+ = 2) [62].
Năm 1984, Hellman và Bach còn đề nghị thêm 𝑝+− 1 chứa một thừa số nguyên tố lớn (gọi là 𝑝+−). Tuy nhiên, các ông chưa đưa ra chứng minh nào cho đề xuất đó [29]. Năm 1978, các tác giả của hệ mã RSA đã đề xuất việc sử dụng số nguyên tố
𝑝−−–mạnh [50], và được tìm dễ dàng như sau:
Simple-StrongPrime(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố mạnh 𝑘-bit
(1) Tìm một số nguyên tố ngẫu nhiên lớn 𝑝−− bằng cách kiểm tra tính nguyên tố một số nguyên ngẫu nhiên lớn.
(2) Tính 𝑝− là số nguyên tố nhỏ nhất có dạng:
𝑝− = 𝑎−−𝑝−−+ 1
với số nguyên với số nguyên 𝑎−− nào đó. Có thể tính bằng cách thế 𝑎−−= 2, 4, 6, … đến khi 𝑝− là số nguyên tố. Sử dụng phép thử tính nguyên tố bằng xác suất như phép thử Rabin-Miller để kiểm tra tính nguyên tố của mỗi 𝑝−.
(3) Tính 𝑝 là số nguyên tố nhỏ nhất có dạng:
𝑝 = 𝑎−𝑝−+ 1
với số nguyên 𝑎− nào đó giống như cách tìm 𝑎−− ở bước (2).
Thuật toán 6.9. Phát sinh số khả nguyên tố mạnh đơn giản
Thời gian cần thiết để tìm 𝑝 khá lâu, gấp khoảng 3 lần thời gian cần thiết để tìm một số nguyên tố ngẫu nhiên có cùng kích thước (do kiếm tra tính nguyên tố 3 lần). Hơn nữa, số nguyên tố 𝑝 nhận được ở thuật toán trên là chỉ là số 𝑝−−–mạnh.
Năm 1979, Williams và Schmid đề xuất thuật toán tìm số nguyên tố mạnh như sau [62]:
Williams-Schmid(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố mạnh 𝑘-bit
(1) Tìm 𝑝−− và 𝑝+ là các số nguyên tố ngẫu nhiên lớn. (2) Tính 𝑟 = – 𝑝−− −1 𝑚𝑜𝑑 𝑝+.
(3) Tìm 𝑎 nhỏ nhất sao cho:
𝑝−= 2𝑎𝑝−−𝑝++ 2𝑟𝑝−−+ 1
và 𝑝 = 4𝑎𝑝−−𝑝++ 4𝑟𝑝−−+ 3 = 2𝑝−+ 1
là số nguyên tố.
Dễ thấy rằng 𝑝+ chính là thừa số của 𝑝 + 1 và 𝑝 là 𝑝−–siêu mạnh do 𝑎− = 2. Độ dài của 𝑝 và 𝑝− khoảng gấp đôi độ dài của 𝑝−− và 𝑝+ với quy trình trên. Quy trình này không hiệu quả bằng việc tìm một số nguyên tố ngẫu nhiên, do việc tìm 𝑎 đồng thời làm cho 𝑝− và 𝑝 là số nguyên tố trong bước (3) phức tạp hơn rất nhiều so với việc tìm
𝑎− để tạo 𝑝 là số nguyên tố trong bước (3) của Thuật toán 6.9. Tuy nhiên đây cũng là một cách để tìm các số nguyên tố mạnh.
Năm 1984, J. Gordon đề xuất quy trình khác để tìm các số nguyên tố mạnh [26], [25]. Gordon cho rằng việc tìm số nguyên tố mạnh chỉ khó hơn một chút so với việc tìm số nguyên tố ngẫu nhiên có cùng kích thước. Thuật toán của ông hiệu quả hơn thuật toán của Williams/ Schmid nhiều bởi vì thuật toán không tạo ra số nguyên tố
𝑝−–siêu mạnh (giá trị của 𝑎− sẽ lớn hơn 2 với thuật toán của Gordon).
Gordon(k, t)
Đầu vào: số nguyên 𝑘 > 0 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: số khả nguyên tố mạnh 𝑘-bit
(1) Tìm 𝑝−− và 𝑝+ là các số nguyên tố ngẫu nhiên bằng thuật toán tìm kiếm tăng. (2) Tính 𝑝− là số nguyên tố nhỏ nhất có dạng:
𝑝−= 𝑎−−𝑝−−+ 1
với số nguyên 𝑎−− = 2, 4, 6, … nào đó.
(3) Đặt 𝑝0 = 𝑝+ 𝑝−−1− 𝑝− 𝑝+−1 𝑚𝑜𝑑 𝑝−𝑝+
(4) Tính 𝑝 là số nguyên tố nhỏ nhất có dạng:
𝑝 = 𝑝0+ 𝑎𝑝−𝑝+
với số nguyên 𝑎 = 2, 4, 6, … nào đó.
Thuật toán 6.11. Phát sinh số khả nguyên tố mạnh Gordon
Bằng cách điều chỉnh độ dài (theo bit) của các số nguyên tố 𝑝−− và p+ và các giá trị
𝑎−− và 𝑎, chúng ta sẽ có thể điều chỉnh được kích thước mong muốn của số nguyên tố 𝑝. Lưu ý rằng độ dài theo bit của 𝑝− và 𝑝+ sẽ xấp xỉ một nửa của 𝑝 trong khi độ dài theo bit của 𝑝−− sẽ ít hơn độ dài theo bit của 𝑝− một chút.
Gordon chứng minh được thuật toán của ông chỉ chậm hơn 19% so với thuật toán tìm số nguyên tố ngẫu nhiên cùng kích thước. Tuy nhiên, Gordon mô tả thuật toán tìm số nguyên tố trong bước (1) là thuật toán tìm kiếm tăng (Thuật toán 6.7) nên khi sử dụng phiên bản cải tiến của thuật toán tìm kiếm tăng (Thuật toán 6.8) thì tốc độ tổng thể của thuật toán phát sinh số khả nguyên tố mạnh Gordon sẽ tăng lên đáng kể.