4. MÃ HÓA KHÓA CÔNG KHAI
4.2. Các thuật toán cho bài toán Logarit rời rạc
Trong phần này ta xem rằng p là số nguyên tố, α là phần tử nguyên thuỷ theo mođun p. Ta thấy rằng p và α là các số cố định. Khi đó bài toán logarith rời rạc có thể được phát biểu dưới dạng sau: tìm một số mũ a duy nhất, 0 ≤ a ≤ p-2 sao cho αa ≡β (mod p), với β∈ Zp* cho trước.
Đặc trưng của bài toán: I = (p,α,β) trong đó p là số nguyên tố, α ∈ Zp là phần tử nguyên thủy, β∈ Zp*
Mục tiêu: Hãy tìm một số nguyên duy nhất a, 0 ≤ a ≤ p-2 sao cho: αa≡β (mod p)
Ta sẽ xác định số nguyên a bằng logαβ
Trang 44 Rõ ràng là bài toán logarith rời rạc (Discrete Logarith-DL) có thể giải bằng một phép tìm kiếm vét cạn với thời gian cỡ O(p) và không gian cỡ O(1) (bỏ qua các thừa số logarith). Bằng cách tính toán tất cả các giá trị αa có thể và sắp xếp các cặp có thứ tự (a, αa mod p) có lưu ý đến các toạ độ thứ hai của chúng, ta có thể giải bài toán DL với thời gian cỡ O(1) bằng O(p) phép tính toán trước và O(p) bộ nhớ (vẫn bỏ qua các thừa số logarith). Có một số thuật toán cho bài toán logarith rời rạc như: Shanks, Pohlig-Hellman, phương pháp tính toán chỉ số… Chúng ta sẽ mô tả một thuật toán có tên là Shanks, một thuật toán tối ưu hóa thời gian - bộ nhớ của Shanks.
• Nếu cần, các bước 1 và 2 có thể tính toán trước (tuy nhiên, điều này không ảnh hưởng tới thời gian chạy tiệm cận)
• Tiếp theo cần để ý là nếu (j,y) ∈ L1 và (i,y) ∈ L2 thì αmj = y = βα-i
Bởi vậy αmj+i = β như mong muốn.
Ngược lại, đối với β bất kì ta có thể viết: logαβ = mj+i
trong đó 0 ≤ j,i ≤ m-1. Vì thế phép tìm kiếm ở bước 5 chắc chắn thành công. Có thể áp dụng thuật toán này chạy với thời gian O(m) và với bộ nhớ cỡ O(m) (bỏ qua các thừa số logarith). Chú ý là bước 5 có thể thực hiện một cách (đồng thời) qua từng danh sách L1 và L2.
Sau đây là một ví dụ nhỏđể minh hoạ:
Giả sử p=809 và ta phải tìm log3525. Ta có α = 3, β = 525 và m = √808 = 29. Khi đó: α29 mod 809 = 99
Trước tiên tính các cặp được sắp (j,99j mod 809) với 0 ≤ j≤28. Ta nhận được danh sách sau:
(0,1) (1,99) (2,93) (3,308) (4,559)
1. Đặt m = √p-1
2. Tính αmj mod p, 0 ≤ j ≤ m-1
3. Sắp xếp m cặp thứ tự (j,αmj mod p) có lưu ý tới các toạ độ thứ hai của các cặp này, ta sẽ thu được một danh sách L1
4. Tính βα-i mod p, 0 ≤ i ≤ m-1
5. Sắp xếp m cặp thứ tự (i, βα-i mod p) có lưu ý tới các tọa độ thứ hai của các cặp được sắp này, ta sẽ thu được một danh sách L2
6. Tìm một cặp (j,y) ∈ L1 và một cặp (i,y) ∈ L2 (tức là một cặp có toạ độ thứ hai như nhau)
Trang 45 (5,329) (6,211) (7,664) (8,207) (9,268) (10,644) (11,654) (12,26) (13,147) (14,800) (15,727) (16,781) (17,464) (18,314) (19,275) (20,582) (21,496) (22,564) (23,15) (24,676) (25,586) (26,575) (27,295) (28,81)
Danh sách này sẽ được sắp xếp để tạo L1. Danh sách thứ hai chứa các cặp được sắp (i,525×(3i)-1 mod 809), với 0 ≤ i ≤ 28. Danh sách này gồm:
(0,525) (1,175) (2,328) (3,379) (4,396) (5,132) (6,44) (7,554) (8,724) (9,511) (10,440) (11,686) (12,768) (13,256) (14,,355) (15,388) (16,399) (17,133) (18,314) (19,644) (20,754) (21,496) (22,564) (23,15) (24,676) (25,356) (26,658) (27,489) (28,163)
Sau khi sắp xếp danh sách này, ta có L2 . Bây giờ nếu xử lý đồng thời qua cả hai danh sách, ta sẽ tìm được (10,644) trong L1 và (19,644) trong L2. Bây giờ ta có thể tính:
log3525 = 29×10+19 = 309
Có thể kiểm tra thấy rằng quả thực 3309 ≡ 525 (mod 809).