Thuật toán xác suất Miller-Rabin kiểm tra tính nguyên tố

Một phần của tài liệu Báo cáo tóm tắt Chuẩn Chữ ký số và ứng dụng (Trang 29 - 32)

Đây là một thuật toán kiểm tra tính nguyên tố mạnh, được sử dụng trong quá trình tạo và kiểm chứng các số p, q được tạo ra bằng giải thuật tạo như ở trên. Một thuật toán kiểm tra tính nguyên tố mạnh được lựa chọn sao cho khả năng kết luận nhầm một số không phải là nguyên tố thành nguyên tố là vô cùng thấp, không vượt quá 2-100.

Thuật toán xác suất kiểm tra tính nguyên tố Miller-Rabin được xây dựng dựa trên chuẩn Miller-Rabin như sau: cho n là số nguyên lẻ thỏa mãn n-1 = 2e.u, với u là số nguyên tố.

• Nếu n là số nguyên tố, thì với mọi số nguyên dương a với 0 ≤ an -1: (au≡ 1 mod n) hoặc ∃k < e sao cho a2k.u ≡ -1 mod n (*)

• Nếu n là hợp số thì

{a: 1 ≤ an-1, au ≡ 1 mod n hoặc ∃k < e(a2k.u ≡ -1 mod n)} ≤

4 1 −

n

Tức là khi số nguyên lẻ n có dạng thỏa mãn n-1 = 2e.u với u là số nguyên tố thì nếu n là số nguyên tố, nó luôn thỏa mãn tính chất(*) còn khi n là hợp số thì chỉ có thể tìm được tối đa là

4 1 −

n

số nguyên a để thỏa mãn tính chất(*). Tính chất(*) đó là hoặc

au≡ 1 mod n, nếu không thì sẽ tồn tại một số k thỏa mãn a2k.u ≡ -1 mod n.

Dựa trên tiêu chuẩn Miller-Rabin, thuật toán xác suất kiểm tra tính nguyên tố Miller-Rabin được xây dựng như sau:

Đầu vào:

1. w Số nguyên (lẻ) cần kiểm tra tính nguyên tố. Đây chính là số

p hoặc q. Đầu ra:

1. status Trạng thái trả về của thủ tục kiểm chứng, trong đó status có thể nhận 1 trong 2 giá trị là PROBABLY PRIME(có thể nguyên tố) hoặc COMPOSITE (hợp).

Qui trình:

1. Đặt a là số nguyên lớn nhất thỏa mãn: w-1M = 2a.

/ Như vậy, w có dạng w-1 = 2a.m, trong đó m là một số lẻ. / 2. m = (w-1) / 2a.

3. wlen = len(w).

4. For i = 1 to iteration do

4.1Gán một chuỗi wlen bít bất kì cho b. 4.2If (b ≤ 1) or (bw-1), then go to step 4.1.

/*Nếu b không thỏa mãn 1 < b < w-1 thì quay lại bước 4.1 để sinh lại chuỗi b khác*/

4.3z = bm mod w.

Báo cáo tóm tắt Chuẩn Chữ ký số và ứng dụng

/*Theo tiêu chuẩn Miller-Rabin thì vẫn chữa thể kết luận được w

nguyên tố hay phức. Do đó cần quay lại bước 4.7 để thử với vòng lặp tiếp tiếp của for */

4.5For j = 1 to a -1 do 4.5.1 z = z2 mod w.

/z =z2 mod w ↔ z2 = bm.2jmod w trong đó j <a / 4.5.2 If (z= w -1), then goto step 4.7.

4.5.3 If (z = 1) then goto step 4.6 (adsbygoogle = window.adsbygoogle || []).push({});

/* Ta đi chứng minh w là số phức bằng phương pháp phản chứng. Xét chuỗi

bm, bm.2, …, bm.2j, …, ba-1. Ta có:

- bm ≠ 1 mod w. (1)

- bm.2, …, bm.2j−1đều ≠ -1 mod w (theo kết quả của vòng lặp) (2) - Mà bm.2j = -1 mod w, nên mọi phần tử còn lại của dãy từ bm.2j+1,…, bm.

12a− 2a

đều = 1 mod w. (3)

- Từ (2) và (3) ⇒không tồn tại một số j < a-1 nào thỏa mãn bm.2j=-1

mod(w) (4)

- Giả sử w là nguyên tố. Vậy theo định lý Miller-Rabin, với mọi số nguyên b

bất kỳ ta luôn có bm ≡ 1 mod w (ngược với tính chất 1), hoặc nếu không thì cũng luôn tồn tại một số nguyên j < a -1 sao cho bm.2 j=-1 mod w

(ngược với tính chất 4). Như vậy điều giả sử là vô lý, tức là w là số

phức.*/

4.6Return composite. /kết quả là hợp số/

4.7Continue.

5. Return PROBABLY PRIME

2.4.2. Tạo sốg

a. Tạo sốg

Số g được tạo ra dựa trên các giá trị của p, q và tham số domain_parameter_seed

trả về từ thủ tục tạo p, q tương ứng. Số g ở đây có thể kiểm chứng được bằng thủ tục

kiểm chứng nêu trong phần b. Phương pháp này có thể giúp tạo ra nhiều giá trị g cho

cùng một cặp (p, q) xác định. Việc sử dụng các giá trị khác nhau của g có thể hỗ trợ

cho việc phân biệt khóa. Ví dụ: ta sử dụng số g được tạo ra với index =1 cho chữ ký số và với index = 2 cho việc thiết lập khóa.

Đặt Hash() là hàm băm được lựa chọn cho cặp (L, N). Qui trình tạo g sẽ như sau: Đầu vào:

2. domain_parameter_seed Là tham số gốc được sử dụng trong thủ tục tạo p, q.

3. index Chỉ số được sử dụng để tạo g. Chỉ số index

biểu diễn bởi một số nguyên 8 bít không dấu. Đầu ra:

1. status Trạng thái trả về của hàm tạo, trong đó status có thể nhận 1 trong 2 giá trị VALID và INVALID.

2. g Giá trị của số g tạo được.

Qui trình:

1. If (index is incorrect) then return INVALID. 2. N = len(q); (adsbygoogle = window.adsbygoogle || []).push({});

3. e = (p-1) / q; 4. count = 0;

5. count = count+1;

6. If count = 0 then return INVALID.

7. U = domain_parameter_seed || “ggen” || index || count. 8. W = Hash(U).

9. g = We mod p.

/* Ta có: g = We mod p

g = Hash(U)(p-1)/q

gq =Hash(U)p-1 (1)

Mà 0 < Hash(U) < pp nguyên tố ⇒(Hash(U), p) =1.

Theo Ferma tao có được (Hash(U))p-1 ≡ 1(mod p) (2)

Từ (1) và (2) ta có gq ≡ 1 mod p

Như vậy số g thỏa mãn tính chất là căn bậc q của 1 theo modulo p.

*/

10.If (g < 2) then goto step 5.

11.Return VALID and the value of g.

Một phần của tài liệu Báo cáo tóm tắt Chuẩn Chữ ký số và ứng dụng (Trang 29 - 32)