Phương pháp xác suất

Một phần của tài liệu Vấn đề kiểm tra các số nguyên tố lớn (Trang 50)

2.3.2.1. Thuật toán Fermat

1). Cơ sở lý thuyết của giải thuật: ap1 1(mod p)

Định lý 2.8. (Định lý nhỏ Fermat)

Nếu p là số nguyên tố và 1a<p thì

Hệ quả.

Nếu p là số nguyên tố, a là số nguyên, thì ap a (mod p) Ví dụ: a = 2 thì

Với p= 3: a3-1 = 4 = 1 mod 3 Với p = 4: a4-1 = 8 = 0 mod 4 Với p= 5: a5-1 = 16 = 1 mod 5 Với p = 6: a6-1 = 32 = 2 mod 6 Với p= 7: a7-1 = 64 = 1 mod 7 Với p = 8: a8-1 = 128 = 0 mod 8 Với p= 9: a9-1 = 256 = 1 mod 9

Kết quả trên xác nhận khi p là số nguyên tố thì 2p-1 1 (mod p), và cũng cho một phỏng đoán rằng p không phải là số nguyên tố khi 2p-11(mod p). Tuy nhiên phỏng đoán này lại không đúng, chẳng hạn như n = 341 không phải là số nguyên tố nhưng nó vẫn thỏa 2341 -1 1 (mod 341).

Các số mà thỏa mãn định lý Fermat mà không phải là số nguyên tố gọi là số giả nguyên tố và được định nghĩa như sau:

Định nghĩa 2.2

2). Giải thuật:

Nếu số giả nguyên tố cơ sở a không tồn tại thì định lý Fermat cho một cách rất đơn giản để kiểm tra số nguyên tố. Đáng tiếc số giả nguyên tố cơ sở a lại tồn tại với mọi cơ sở vì vậy định lý Fermat chỉ cho một cách kiểm tra thiên về hợp số và thuật toán như sau:

Boolean pseudoprime (n, b) {

If (b^(n-1) % n == 1) return true; Else return false;

}

Thuật toán Fermat được xây dựng trên cơ sở thuật toán kiểm tra thiên về hợp số ở trên. Nó sẽ kiểm tra một số n là giả nguyên tố với số lần kiểm tra là k, kết luận n là số nguyên tố với xác suất nào đó nếu nó vượt qua k lần kiểm tra. Thuật toán như sau:

Thuật toán pseudoprime có độ phức tạp là O(log n). Thuật toán kiểm tra Fermat thực hiện pseudoprime k lần vì vậy độ phức tạp sẽ là O(k.log n). Do vậy nó là thuật toán xác suât kiểm tra số nguyên tố hiệu quả.

Boolean fermat (n, k) {

For (i from 1 to k) {

b = random(2, n-1); //inclusive

if (!pseudoprime(n,b)) return false; }

return true; //probably prime }

2.3.2.2. Thuật toán Miller - Rabin 1). Cơ sở lý thuyết của giải thuật:

Cho p là một số nguyên tố, a là số nguyên không chia hết cho p, ta có :

ap-1  1 (mod p) (1)

a2  1 (mod p)  a  1 (mod p) hoặc a  -1 (mod p). (2).

Hai tính chất trên khá quen thuộc trong số nguyên tố, ta có thể dễ dàng chứng minh.

Với p-1 = q.2t trong đó q là một số nguyên dương lẻ. Theo (1) và (2) mọi số a không chia hết cho p ta đều có :

-aq  1 (mod p) hoặc -

t

q

a .2

 -1 (mod p) với một số nguyên r nào đó thoả 0  r < t. (*)

Như vậy, một số n là nguyên tố thì nó phải thoả mãn điều kiện trên với mọi 1  a  n-1, ngược lại nếu tồn tại một a không thoả mãn tính chất trên thì chắc chắn n không phải là số nguyên tố.

Mặt khác, ta có thể chứng minh được rằng, nếu n là một hợp số lẻ > 3 thì có không quá

4 1

n

giá trị a trong khoảng 1 đến n-1 thoả mãn (*). Do đó, với một số a

chọn ngẫu nhiên trong khoảng 1 đến n-1, thì xác suất a thoả mãn (*) không quá

4 1,

và nếu k lần chọn thì xác suất để mọi lần chọn đều thoả mãn là không quá k

4 1

. Từ đó, người ta đã đưa ra một thuật toán xác suất cho phép kiểm tra một số n có phải nguyên tố hay không trong thời gian đa thức với độ chính xác rất cao thuật toán (Miller - Rabin).

Thuật toán Miller – Rabin thực hiện về bản chât nó tính ar mod n bằng phương pháp bình phương liên tiếp. Thuật toán Miller – Rabin thực hiện k lần tính ar mod n với xác suất phân loại sai là k

4 1

 .

Phần quan trọng nhất là kiểm tra a có thoả mãn tính chất (*) hay không. Trước hết, ta phải tính aq mod n, nếu ta tính bằng thực hiện tuần tự các phép nhân q lần thì chi phí sẽ rất lớn (q có thể tỉ lệ với n). Vì ta chỉ cần tính luỹ thừa modulo n nên ta có một phương pháp rất hay : Phương pháp bình phương liên tiếp.

Ý tưởng cơ bản của nó như sau : phân tích q dạng nhị phân, q sẽ có dạng tổng của các luỹ thừa của 2.

Ta xây dựng dãy {u} như sau : - u0 = a

- uk+1 = uk2 mod n  k  N.

Khi đó, ta dễ dàng chứng minh uk = a2k

mod n.

Khi đó, aq mod n sẽ được tính bằng tích theo modulo n của các uk tương ứng với các luỹ thừa của 2 trong phân tích nhị phân của q.

2). Giải thuật:

Thuật toán được trình bày như sau:

Algorithm for the Miller-Rabin Probabilistic Primality Test

Miller-Rabin(n,t)

INPUT: An odd integer n>1 and a positive security parameter t

OUTPUT: the answer “COMPOSITE” or “PRIME” Write n-1 = 2sr such that r is odd

Repeat from 1 to t

Choose a random integer a which satisfies 2<a<n- 1

Compute y=ar mod n

If y<>1 and y<>n-1 then DO j:=1

while j<s and y<>n-1 then DO y:= y2 mod n

if y=1 then return(“COMPOSITE”) j:=j+1

if y<>n-1 then return(“COMPOSITE”) return(“PRIME”)

3). Xác suất trả lời sai Định lý 2.9.

Nếu n là hợp số dương lẻ thì trong các số a {2,..,n-1} tồn tại không quá

4 1

n cơ sở a để n là số giả nguyên tố mạnh Fermat.

Gọi A là biến cố "Số n là hợp số". B là biến cố "Kiểm tra Miller-Rabin trả lời n là số nguyên tố". Khi đó xác suất sai của kiểm tra này là xác suất để số n là hợp số trong khi thuật toán cho câu trả lời TRUE, nghĩa là xác suất điều kiện P(A|B).

Theo định lý trên nếu n là hợp số thì khả năng kiểm tra này trả lời TRUE xảy ra với xác suất không vượt quá

4 1

, nghĩa là P(B|A)

4 1

 . Tuy nhiên để tính xác suất sai của kiểm tra Miller -Rabin cần tính xác suất diều kiện P(A|B). Dựa trên định lý về ước lượng số các số nguyên tố ta đưa ra ước lượng

n n n A P ln 2 ln ln 2 1 ) (    

Theo định lý Bayes trong lý thuyết xác suất ta có công thức để tính xác suất sai của kiểm tra Miller - Rabin là:

P(A|B) = ) ( ) ( ). | ( B P A P A B P = ) ( ). | ( ) ( ). | ( ) ( ). | ( _ _ A P A B P A P A B P A P A B P

Trong công thức này P(A) đã biết ở trên, P(B|A)

4 1  , còn P(B|A_)= 1 vì khi n là số nguyên tố thì chắc chắn mệnh đề Q(n,a) là đúng và n A P A P ln 2 ) ( 1 ) (_    . Từ đó P(A|B)= ) ( ) ( ). | ( ) ( ). | ( _ A P A P A B P A P A B P  2 ) 2 ).(ln | ( ) 2 ).(ln | ( ) | (     n A B P n A B P B A P

Theo công thức tính xác suất sai trên đây, với n lớn (cỡ 130 chữ số thập phân), nếu thực hiện phép thử Miller - Rabin chỉ một lần, xác suất sai là khá lớn, tới trên 90%.

Để giảm xác suất sai, ta lặp lại phép thử k lần với k số ngẫu nhiên a khác nhau, nếu n vượt qua 50 lần thử thì P(B|A) k

4 1

 , khi thay vào công thức với 50 lần

thử nếu cả 50 lần, phép thử đều "dương tính" thì xác suất sai giảm xưống chỉ còn là một số rất nhỏ không vượt quá 9.10-29.

Ví dụ 1: Lấy n = 101, n-1 = 100 = 25.22. Chú ý n là số nguyên tố.

Chọn ngẫu nhiên cơ sở a = 10. Bắt đầu với b = 1025 mod 101 = 10 nên vào vòng lặp 102 mod 101 = 100. Thuật toán cho kết luận là số nguyên tố.

Chọn ngẫu nhiên cơ sở a = 29. Bắt đầu với b = 2925 mod 101 = 91 nên vào vòng lặp 912 mod 101 = 100. Thuật toán cho kết luận là số nguyên tố.

Chọn ngẫu nhiên cơ sở a = 2. Bắt đầu với b = 225 mod 101 = 10. Do đó thuật toán cho kết luận là số nguyên tố.

Chọn ngẫu nhiên cơ sở a = 17. Bắt đầu với b = 1725 mod 101 = 100. Do đó thuật toán cho kết luận là số nguyên tố.

Ở đây 4 lần kiểm tra đều cho kết quả là số nguyên tố (với xác suất nào đó). Xác suất cho kết quả sai là 

256 1

. Vậy theo thuật toán 101 là số nguyên tố với xác

suất đúng là 1 -

256 1

Ví dụ 2: Lấy n = 91, n-1 = 90 = 45.21. Chú ý n là hợp số.

Chọn ngẫu nhiên cơ sở a = 10. Bắt đầu với b = 1045 mod 91 = 90. Do đó thuật toán cho kết luận là số nguyên tố. Vậy 10 là cơ sở cho kết quả sai.

Chọn ngẫu nhiên cơ sở a = 29. Bắt đầu với b = 2945 mod 91 = 1. Thuật toán cho kết luận là số nguyên tố. Vậy 29 là cơ sở cho kết quả sai.

Chọn ngẫu nhiên cơ sở a = 2. Bắt đầu với b = 245 mod 91 = 57. Ở đây thuật toán không thể vào vòng lặp (1<1 là sai). Vậy 2 là cơ sở cho kết quả sai.

2.3.2.3. Thuật toán AKS

1). Cơ sở lý thuyết của giải thuật:

Tháng 8 năm 2002, ba tác giả Manindra Agrawal, Neeraj Kayal va Nitin Xaxena (Viện công nghệ Kanpur Ấn Độ) công bố thuật toán kiểm tra tính nguyên tố với độ phức tạp đa thức (thường gọi là thuật toán AKS). Nó thoả mãn ba tính chất:

- Xác định: Luôn cho câu trả lời chính xác.

- Không điều kiện: Không bác bỏ bất cứ giả thiết không được chứng minh nào chẳng hạn như giả thiết Riemann.

- Thời gian đa thức: Độ phức tạp thời gian của thuật toán là đa thức. Thuật toán xuất phát từ ý tưởng sau:

Số nguyên tố p là nguyên tố khi và chỉ khi đẳng thức sau đúng với một số nguyên a nào đó mà nguyên tố cùng nhau với p:

(x-a)p xp – a (mod p) (*)

Như việc kiểm tra đẳng thức trên không phải đơn giản (khi p đủ lớn), cho rút gọn hai vế của đẳng thức trên theo modulo đa thức xr -1 (với r là một số nguyên có tính chất “đặc biệt”), sau đó lại rút gọn các hệ số của kết quả thu được theo modulo p. Tức là hệ thức sau:

(x-a)p xp – a (mod xr -1,p) (**)

Biểu thức (**) có thể xảy ra trong một số trường hợp p là hợp số, nhưng người ta đã chứng minh được rằng không hợp số p nào thoả mãn (**) với mọi a nằm trong vùng 1arlogp. Như vậy việc kiểm tra (**) cho các số a nằm trong vùng này sẽ tương đương với việc kiểm tra tính nguyên tố của p và thuật toán có độ phức tạp là đa thức.

2). Giải thuật:

Thuật toán được trình bày như sau:

Input: integer n>1;

1. If (n is of the form ab, b>1) output COMPOSITE; 2. r=2;

3. While (r<n) {

4. If (gcd(n,r) ≠ 1) output COMPOSITE; 5. If (r is prime)

6. Let q be the largest prime factor of r-1;

7. If (q 4r log n) and (n^((r-1)/2)  1 (mod r)) break;

8. r r + 1; 9. }

10. For a= 1 to 2 r log n

11. if ((x-a)n  (xn – a)(mod xr – 1, n)) output COMPOSITE;

12. Output PRIME;

Thuật toán AKS trên đây được chứng tỏ là có độ phức tạp thời gian là đa thức cỡ O(log12n) khi thử trên số n bất kỳ, nhưng nếu thử với số nguyên có dạng Sophie German (dạng 2p+1) thì độ phức tạp sẽ chỉ cỡ O(log12n).

Chương 3. ỨNG DỤNG CỦA SỐ NGUYÊN TỐ VÀ THỬ NGHIỆM CHƯƠNG TRÌNH

3.1. MÃ HÓA

3.1.1 Hệ mã hóa RSA

1). Sơ đồ (Rivest, Shamir, Adleman đề xuất năm 1977)

*Tạo cặp khóa (bí mật, công khai) (a, b) :

Chọn bí mật số nguyên tố lớn p, q, tính n = p * q, công khai n, đặt P = C = Zn

Tính bí mật (n) = (p-1).(q-1). Chọn khóa công khai b < (n), nguyên tố với (n). Khóa bí mật a là phần tử nghịch đảo của b theo mod (n): a*b  1 (mod (n). Tập cặp khóa (bí mật, công khai) K = (a, b)/ a, b  Zn , a*b  1 (mod (n)). Với Bản rõ x  P và Bản mã y  C, định nghĩa:

* Hàm Mã hoá: y = ek (x) = x b mod n * Hàm Giải mã: x = dk (y) = y a mod n

2). Ứng dụng số nguyên tố.

Độ an toàn của Hệ mật RSA dựa vào khả năng giải bài toán phân tích số nguyên dương n thành tích của 2 số nguyên tố lớn p và q.

Phải chọn số nguyên tố n, p đủ lớn sao cho bài toán tách n thành 2 thừa số p, q là khó giải (Tại USA, phải chọn p, q > 10150).

3.1.1 Hệ mã hóa Elgamal

1). Sơ đồ (Elgamal đề xuất năm 1985)

*Tạo cặp khóa (bí mật, công khai) (a, h) :

Chọn số nguyên tố p sao cho bài toán logarit rời rạc trong Zp là “khó” giải. Chọn phần tử nguyên thuỷ g  Zp* . Đặt P = Z p*, C = Z p*  Z p*. Chọn khóa bí mật là a  Zp* . Tính khóa công khai h  g a mod p.

Định nghĩa tập khóa:  = {(p, g, a, h): h  g a mod p}. Các giá trị p, g, h được công khai, phải giữ bí mật a.

Với Bản rõ x  P và Bản mã y  C, với khóa k  định nghĩa: * Lập mã: Chọn ngẫu nhiên bí mật r  Zp-1, bản mã là y = ek (x, r) = (y1, y2) Trong đó y1 = g r mod p và y2 = x * h r mod p

* Giải mã: dk (y1, y2) = y2 (y1 a) -1 mod p.

2). Ứng dụng số nguyên tố.

Trong sơ đồ mã hóa, số nguyên tố p được chọn sao cho bài toán logarit rời rạc trong Zp là “khó” giải.

3.1.1 Hệ mã hóa Rabin

1). Sơ đồ hệ mã hóa Rabin a/. Tạo khóa:

- Hệ mã hóa là bộ gồm 5 thành phần {P, C, K, E, D}.

- Chọn hai số nguyên tố lớn khác nhau p, q: p = 3 (mod 4), q = 3 (mod 4). (Tức là p = 3 + 4t, q = 3 + 4m). Tính n = p *q.

- Chọn P = C = Zn . Chọn 0 ≤ b ≤ n-1.

- Chọn khóa công khai là n và b. Chọn khóa bí mật là p, q.

b/. Mã hóa:

Với bản r x  P, định nghĩa bản mã là y = ek (x) = x (x + b) (mod n). c /. Giải mã: Với bản mã y  C, bản r là x = dk (y) = 2 4 2 b b y  (mod n) 2). Ứng dụng số nguyên tố.

Chọn hai số nguyên tố lớn khác nhau p, q: p = 3 (mod 4), q = 3 (mod 4). Việc lựa chọn p, q đủ lớn, đảm bảo khi thám mã biết n, để tính lại p, q là bài toán khó.

3.2. KÝ SỐ

Sơ đồ chữ ký số

Sơ đồ chữ ký là bộ năm (P, A, K, S, V ), trong đó:

P là tập hữu hạn các văn bản có thể.

A là tập hữu hạn các chữ ký có thể.

K là tập hữu hạn các khoá có thể.

S là tập các thuật toán ký.

V là tập các thuật toán kiểm thử.

Với mỗi khóa k K, có thuật toán ký Sig k S, Sig k : P A, có thuật toán kiểm tra chữ ký Ver k V, Ver k : PAđúng, sai, thoả mãn điều kiện sau với mọi x P, y A:

Đúng, nếu y = Sig k (x) Ver k (x, y) =

3.2.1. Chữ ký RSA

1). Sơ đồ (Đề xuất năm 1978).

Tạo cặp khóa (bí mật, công khai) (a, b) :

Chọn bí mật số nguyên tố lớn p, q, tính n = p*q, công khai n, đặt P = C = Zn Tính bí mật (n) = (p-1).(q-1). Chọn khóa công khai b < (n), nguyên tố với

(n).

Khóa bí mật a là phần tử nghịch đảo của b theo mod (n): a*b  1 (mod (n). Tập cặp khóa (bí mật, công khai) K =(a, b)| a, b  Zn , a*b  1 (mod (n)). * Ký số: Chữ ký trên x  P là y = Sig k (x) = x a (mod n), y  A. (R1) * Kiểm tra chữ ký: Verk (x, y) = đúng  x  y b (mod n). (R2)

2). Ứng dụng số nguyên tố.

Bài toán căn bản bảo đảm độ an toàn của Sơ đồ chữ ký RSA: Bài toán tách số nguyên n thành tích của 2 số nguyên tố: n = p*q

Vì nếu giải được bài toán này thì có thể tính được khóa mật a từ khóa công khai b và phần tử công khai n.

3.2.2. Chữ ký Elgamal

1). Sơ đồ chữ ký Elgamal

*Tạo cặp khóa (bí mật, công khai) (a, h) :

Chọn số nguyên tố p sao cho bài toán logarit rời rạc trong Zp là “khó” giải. Chọn phần tử nguyên thuỷ g  Zp* . Đặt P = Z p*, A = Z p* x Z p-1. Chọn khóa bí mật là a  Zp* . Tính khóa công khai h  g a mod p. Định nghĩa tập khóa:  = {(p, g, a, h): h  g a mod p}.

Các giá trị p, g, h được công khai, phải giữ bí mật a.

* Ký số: Dùng 2 khóa ký: khóa a và khóa ngẫu nhiên bí mật r  Zp-1* .

Một phần của tài liệu Vấn đề kiểm tra các số nguyên tố lớn (Trang 50)