Tải bản đầy đủ (.pdf) (57 trang)

Luận văn thạc sỹ : Cơ sở toán học của hệ mật mã khóa công khai RSA

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (465.53 KB, 57 trang )

Mục lục
Chương 1.KIẾN THỨC CHUẨN BỊ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.1.Quan hệ chia hết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.2.Ước chung lớn nhất . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.3.Quan hệ Đồng dư . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.4.Vành Zm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.5.Phương trình đồng dư bậc 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

Chương 2.HỆ MẬT KHÓA CÔNG KHAI RSA . . . . . . . . . . . . . . . . . . . . . . .

7

2.1.Công thức Euler và nghiệm modulo pq . . . . . . . . . . . . . . . . . . . . . . . . .


7

2.2.Hệ mật khóa công khai RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.3.Kiểm tra tính nguyên tố của một số nguyên . . . . . . . . . . . . . . . . . . .

12

2.3.1. Phân bố của tập số nguyên tố . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2. Chứng minh tính nguyên tố và kiểm tra xác suất Versus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15
16

2.4.Thuật toán Pollard:phân tích nhân tử của p − 1 . . . . . . . . . . . . . . . .

17

2.5.Phân tích thông qua hiệu bình phương . . . . . . . . . . . . . . . . . . . . . . . .

19

2.6.Số mịn, sàng, xây dựng mối quan hệ cho nhân tử . . . . . . . . . . . . .

24

2.6.1. Số mịn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6.2. Sàng bậc 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.6.3. Sàng trường số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24
26
32

2.7.Thặng dư bậc 2 và thuận nghịch bậc 2 . . . . . . . . . . . . . . . . . . . . . . . .

35

2.8.Mã hóa theo xác suất và hệ mật Goldwasser-Micali . . . . . . . . . . . .

40

Chương 3.CHỮ KÝ SỐ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

3.1.Chữ ký số là gì ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

3.2.Chữ ký số RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

3.3.Chữ ký số Elgamal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48


3.3.1. Hệ mật khóa công khai Elgamal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.2. Hệ chữ ký Elgamal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48
50

3.4.Chữ ký số DSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

Kết Luận . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

1


Chương 1

KIẾN THỨC CHUẨN BỊ
1.1.

Quan hệ chia hết

Định nghĩa 1.1.1. Số nguyên a được gọi là chia hết cho một số nguyên b, hay b chia
hết a nếu tồn tại một số nguyên c sao cho a = bc, khi a chia hết cho b ta viết b | a và
b được gọi là một ước của a, còn a được gọi là một bội của b.
Nhận xét rằng
1. Nếu a và b chia hết cho nhau thì hoặc a = b hoặc a = −b.
2. Nếu b = 0 và a | b thì |a| ≤ |b|.

3. Nếu a | b và b | c thì a | c.
n

4. Nếu a | ai thì a |

ai xi với mọi xi ∈ Z.
i=1

1.2.

Ước chung lớn nhất

Định nghĩa 1.2.1. Cho các số nguyên a1 , a2 , . . . , an . Số nguyên k được gọi là một
ước chung của các ai nếu d | ai , với moi i = 1, 2, . . . , n. Số nguyên d được gọi là ước
chung lớn nhất của các ai nếu d là một ước chung của các ai và d chia hết cho mọi
ước chung của chúng.
Người ta ký hiệu số lớn nhất trong tập các ước chung của các ai là gcd(a1 , a2 , . . . , an ).
Nếu gcd(a1 , a2 , . . . , an ) = 1 thì a1 , a2 , . . . , an được gọi là các số nguyên tố cùng nhau.
Dễ thấy rằng các số nguyên a1 , a2 , . . . , an nguyên tố cùng nhau nếu và chỉ nếu tồn tại
n

các số nguyên x1 , x2 , . . . , xn sao cho

aj xj = 1.
j=1

Bổ đề 1.2.2 (Bổ đề Euclide). Cho các số nguyên a, b, c. Khi đó nếu gcd(a, b) = 1
và a chia hết bc thì a chia hết c.

2



Chứng minh. vì gcd(a, b) = 1 nên tồn tại x, y ∈ Z sao cho ax + by = 1, nhân cả hai vế
với c ta được cax + (cb)y = c chia hết cho a.
Định nghĩa 1.2.3 (Số nguyên tố, hợp số, số chính phương). Một số nguyên
p được gọi là một số nguyên tố nếu p > 1 và p không có một ước nguyên dương nào
ngoài 1 và chính nó. Một số nguyên m được gọi là hợp số nếu m = 0 và |m| có ít nhất
một ước nguyên dương khác 1 và khác m. Số tự nhiên n được gọi là một số chính
phương nếu tồn tại một số nguyên a sao cho a2 = n.
Nhận xét rằng nếu số nguyên tố p chia hết tích ab thì hoặc p | a hoặc p | b.
Định lý 1.2.4 (Định lý cơ bản của số học). Mọi số tự nhiên lớn hơn 1 đều phân
tích được thành tích hữu hạn các số nguyên tố, phân tích này là duy nhất nếu không
kể đến thứ tự các thừa số.
Định nghĩa 1.2.5. Số các số thuộc dãy 1, 2, . . . , n nguyên tố với n được ký hiệu là
ϕ(n), người ta gọi hàm ϕ(n) là hàm Euler.
Nếu p là một số nguyên tố thì ϕ(p) = p − 1 và các số nguyên tố với p là 1, 2, . . . , p − 1.

1.3.

Quan hệ Đồng dư

Định nghĩa 1.3.1. Cho số nguyên dương m, hai số nguyên a và b được gọi là đồng
dư modulo m nếu hiệu a − b chia hết cho m.Nếu a đồng dư với b modulo m, ta viết
a ≡ b (mod m) và gọi đó là một đồng dư thức.
Quan hệ đồng dư modulo m là một quan hệ tương đương trên Z, các lớp tương
đương theo quan hệ này được gọi là các lớp đồng dư modulo m, số các lớp thặng dư
modulo m đúng bằng m.
Chúng ta chú ý rằng
1. Nếu ai ≡ bi (mod m), với mọi i = 1, 2, . . . , n thì
n


n

ai ≡

a)
i=1
n

bi (mod m)
i=1
n

ai ≡

b)
i=1

bi (mod m).
i=1

2. Nếu a ≡ b (mod m) thì gcd(a, m) = gcd(b, m).

1.4.

Vành Zm

Ký hiệu lớp thặng dư modulo m chứa số nguyên a là a hoặc a (mod m). Tập
Zm = {a : a ∈ Z} là tập các lớp lớp thặng dư modulo m, ta định nghĩa các phép toán
cộng và nhân như sau

3




a+b=a+b

a.b = a.b.

Tập Zm cùng với hai phép toán trên lập thành một vành giao hoán có đơn vị 1 và
phần tử không là 0 mà ta gọi là vành các lớp thặng dư modulo m.
Định lý 1.4.1. Lớp thặng dư a ∈ Zm khả nghịch nếu và chỉ nếu gcd(a, m) = 1.
Chứng minh. a ∈ Zm khả nghịch khi và chỉ khi tồn tại b ∈ Zm sao cho a.b = 1 hay tồn
tại b ∈ Z sao cho ab ≡ 1 (mod m). Tức là, tồn tại số nguyên a và x sao cho ab + mx = 1,
điều này xảy ra khi và chỉ khi gcd(a, m) = 1.
Nhận xét rằng nếu p là một số nguyên tố thì mọi phần tử khác lớp tương đương
của 0 (mod p) đều khả nghịch , do đó Zp là một trường.
Có thể kiểm tra rằng tập hợp tất cả các phần tử khả nghịch modulo m với phép
nhân trong Zm lập thành một nhóm có cấp ϕ(m) . Do đó aϕ(m) ≡ 1 (mod m) với mọi
số nguyên a nguyên tố với m. Khi m = p là số nguyên tố và gcd(a, p) = 1 thì ta có
ap−1 ≡ 1

(mod p)

Định nghĩa 1.4.2. Cho số nguyên m > 1 và số nguyên a sao cho gcd(a, m) = 1, khi
đó số nguyên dương d nhỏ nhất sao cho ad ≡ 1 (mod m) được gọi là bậc của a modulo
m. Dễ thấy rằng d tồn tại và là một ước của ϕ(m).
Định nghĩa 1.4.3. Cho một số nguyên m > 1. Số nguyên g được gọi là một căn
nguyên thủy modulo m nếu g có số mũ ϕ(m). Trường hợp tồn tại căn nguyên thủy
modulo m thì m được gọi là có căn nguyên thủy.

Nếu m có căn nguyên thủy là g thì g là phần tử sinh của nhóm các phần thử khả
nghịch modulo m tức nhóm này sẽ là một nhóm cyclic cấp ϕ(m), hơn nữa phần tử g s
với gcd(s, ϕ(m)) = 1 cũng là một căn nguyên thủy modulo m. Nói thêm rằng chỉ khi
m là các số 2, 4 hoặc các số có dạng pn , 2pn với p nguyên tố lẻ và n nguyên dương, là
có căn nguyên thủy.

1.5.

Phương trình đồng dư bậc 2

Cho phương trình
x2 ≡ a (mod p),

(1.1)

với p nguyên tố lẻ và gcd(a, p) = 1. Nếu tồn tại số nguyên x0 thỏa mãn x20 ≡ a (mod p)
thì x0 được gọi là nghiệm đúng của phương trình trên. Lớp a (mod p) được gọi là
nghiệm của phương trình trên nếu mọi phần tử trong lớp tương đương của nó đều là
nghiệm đúng. Dễ thấy rằng nếu x0 là nghiệm đúng thì x0 (mod p) sẽ là nghiệm.
Định nghĩa 1.5.1. Số nguyên a được gọi là thặng dư bậc 2 hay thặng dư toàn phương
modulo p nếu phương trình x2 ≡ a (mod p) có nghiệm.
Định lý 1.5.2. Nếu a là thặng dư bậc hai modulo p thì phương trình x2 ≡ a (mod p)
có đúng hai nghiệm.
4


Chứng minh. Do a là thặng dư bậc hai modulo p nên tồn tại số nguyên x0 sao cho
x20 ≡ a (mod p), do đó x ≡ x0 (mod p) là nghiệm. Từ (−x0 )2 = x20 ≡ a (mod p) nên
x ≡ −x0 (mod p) cũng là nghiệm. Nếu x0 ≡ −x0 (mod p) thì 2x0 ≡ 0 (mod p), do p là
số nguyên tố lẻ nên x0 ≡ 0 (mod p) (mâu thuẫn vì gcd(a, p) = 1), phương trình bậc

hai trên trường Zp có tối đa hai nghiệm, do đó phương trình x2 ≡ a (mod p) có hai
nghiệm phân biệt x0 (mod p) và −x0 (mod p).

5


6


Chương 2

HỆ MẬT KHÓA CÔNG KHAI RSA
2.1.

Công thức Euler và nghiệm modulo pq

Cho p là một số nguyên tố, từ Định lý Fermat nhỏ ta có
ap−1 ≡ 1 (mod p), nếu gcd(a, p) = 1.

Định lý Fermat nhỏ đã chỉ ra một tính chất đẹp của số nguyên tố, nhưng chuyện
gì sẽ xảy ra nếu ta thay p bởi một số nguyên m không nguyên tố? Liệu công thức
am−1 ≡ 1 (mod m) với gcd(a, m) = 1 vẫn còn đúng chứ? Ví dụ sau chỉ ra câu trả
lời nói chung là "không". Với m = 15485207, a = 2 ta có 2m−1 = 215485206 ≡ 4136685
(mod 15485207) ≡ 1 (mod 15485207).
Tuy nhiên, chúng ta sẽ xem xét khái quát cho trường hợp m = pq với p, q là hai số
nguyên tố phân biệt. Ta bắt đầu với một ví dụ đơn giản. Với m = 3.5 = 15, xét các số
mũ modulo 15 ta nhận thấy có rất nhiều số mũ 4 đồng dư với 1 (mod 15). Cụ thể
a4 ≡ 1

với

a4 ≡ 1 (mod 15) với
(mod 15)

a = 1, 2, 4, 7, 8, 11, 13, 14



a = 3, 5, 6, 9, 10, 12.

Các số 1, 2, 4, 7, 8, 11, 13, 14 đều là các số nguyên tố cùng nhau với 15. Điều này gợi ý
cho ta một phiên bản của định lý Fecmat nhỏ có thể sẽ đúng với số nguyên a nguyên
tố với m nhưng số mũ ở đây có thể không phải là (m − 1). Ta dễ ràng chứng minh
rằng
a4 ≡ 1

(mod 15) ⇔

a4
a4

≡1
≡1

(mod 3)
(mod 5)

và 4 là một bội chung của (3 − 1) và (5 − 1), ta đi đến một phát biểu về công thức cơ
bản làm nền tảng cho hệ mật khóa công khai RSA.
Định lý 2.1.1. Cho p và q là hai số nguyên tố phân biệt và đặt g = gcd(p − 1, q − 1).
Khi đó

(p−1)(q−1)
a

g

≡1

với mọi a thỏa mãn gcd(a, pq) = 1.

7

(mod pq),


Chứng minh. Từ gcd(a, pq) = 1 ta có gcd(a, p) = 1 với gcd(a, q) = 1. Do đó
a
a

Do đó a

(p−1)(q−1)
g

(p−1)(q−1)
g
(p−1)(q−1)
g

≡ a(p−1)
≡a


( q−1
)
g

p−1
(q−1) ( g )

≡1
≡1

q−1
g
p−1
g

≡1

(mod p),

≡1

(mod q).

≡ 1 (mod pq).

Nếu p = q là các số nguyên tố lẻ thì ta có 2 | (p − 1) và 2 | (q − 1), do đó 2 | g . Vì
(p−1)(q−1)
(p−1)(q−1)
vậy (p−1)(q−1)

≡ 1 (mod pq).
|
. Do đó a 2
g
2
Hệ mật RSA mà ta nghiên cứu ở phần tới có độ bảo mật phụ thuộc vào độ khó
của việc giải phương trình dạng xe ≡ c (mod N ), trong đó e, c, N đã biết, x là ẩn.
Nếu N là số nguyên tố thì phương trình trên tương đối dễ tìm nghiệm, và được mô
tả trong mệnh đề sau.
Mệnh đề 2.1.2. Cho p là số nguyên tố, e ≥ 1 là số nguyên thỏa mãn gcd(e, p − 1) = 1.
Khi đó tồn tại d để ed ≡ 1 (mod p − 1) và phương trình xe ≡ c (mod p) (∗) có nghiệm
duy nhất cd (mod p).
Chứng minh. Chúng ta xét hai trường hợp sau.
Trường hợp 1 :Giả sử gcd(c, p) = 1. Khi đó p là một ước của c, do đó c ≡ 0 (mod p) và
phương trình xe ≡ c (mod p) trở thành xe ≡ 0 (mod p). Tức là, x ≡ 0 (mod p). Vậy cd
(mod p) là nghiệm của phương trình (∗).
Trường hợp 2 :Giả sử gcd(c, p) = 1. Bởi Định lý Fermat nhỏ ta có
(cd )e = cde ≡ c1+(p−1)k ≡ c.1k ≡ c (mod p).

Do đó cd là nghiệm đúng của phương trình xe ≡ c (mod p). Bây giờ chúng ta sẽ chỉ
ra cd (mod p) là nghiệm duy nhất của (∗). Thật vậy, giả sử (∗) còn có nghiệm đúng
x1 , nghĩa là xe1 ≡ c (mod p). Khi đó xe1 d ≡ cd (mod p). Do x1 là nghiệm đúng của (∗)
1+(p−1)k
nên gcd(x1 , p) = 1. Vì vậy xp−1
≡ 1 (mod p), và suy ra xde
≡ x1 (mod p).
1 = x1
1
ed
d

Do đó x1 ≡ x1 ≡ c (mod p). Vậy mọi nghiệm đúng của (*) đều thuộc lớp đồng dư cd
(mod p). Ngược lại, nếu y ≡ cd (mod p) thì y cũng là một nghiệm đúng của (*). Vậy
phương trình (*) có nghiệm duy nhất cd (mod p).
Từ mệnh đề trên, ta thấy phương trình xe ≡ c (mod N ) có thể giải được dễ dàng
nếu N là một số nguyên tố. Bây giờ xét trường hợp N có dạng đơn giản là tích của
hai số nguyên tố phân biệt N = p.q thì nghiệm của phương trình xe ≡ c (mod N ) được
cho bởi mệnh đề sau.
Mệnh đề 2.1.3. Cho p = q là hai số nguyên tố, số nguyên e ≥ 1 thỏa mãn gcd(e, (p −
1)(q − 1)) = 1, nghĩa là, tồn tại d ∈ Z để de ≡ 1 (mod (p − 1)(q − 1)). Khi đó phương
trình xe ≡ c (mod pq)(∗∗) có nghiệm duy nhất cd (mod pq).

8


Chứng minh. Do de ≡ 1 (mod (p−1)(q −1)) nên tồn tại k ∈ Z để de = 1+(p−1)(q −1)k .
Trường hợp 1:Giả sử gcd(c, pq) = 1. Khi đó x1 := cd là nghiệm đúng của (**), bởi vì
(cd )e = cde = c1+(p−1)(q−1)k ≡ c (mod pq).

Giả sử (**) còn có nghiệm x2 , thì ta có x2 ≡ x1 (mod pq). Thât vậy, do x2 là nghiệm
của (**) nên xe2 ≡ c (mod pq) và suy ra c = xe2 + pqk . Lại do gcd(c, pq) = 1 nên tồn tại
x, y ∈ Z để cx + pqy = 1. Do đó (xe2 + pqk)x + pqy = 1 hay xe2 .x + pq(kx + y) = 1. Suy ra
gcd(xe2 , pq) = 1 và gcd(x2 , pq) = 1. Vì vậy gcd(x2 , p) = 1 và gcd(x2 , q) = 1. Tương tự, ta
cũng có gcd(x1 , p) = 1 và gcd(x1 , q) = 1. Do đó ta có
x2 ≡ x2 de−(p−1)(q−1)l ≡ x2 de .x2 (p−1)(q−1)(−l) ≡ x2 de .1−l ≡ cd ≡ x1

(mod pq).

Vậy cd (mod pq) là nghiệm duy nhất của (**).
Trường hợp 2:Giả sử gcd(c, pq) = pq . Khi đó (**) trở thành xe ≡ 0 (mod pq). Từ
gcd(c, pq) = pq suy ra c ≡ 0 (mod pq). Do đó cd ≡ 0 (mod pq). Vậy x ≡ cd ≡ 0 (mod pq)

là nghiệm của (**).
Giả sư xe ≡ 0 (mod pq) còn có nghiệm u. Khi đó pq | ue hay pq | u. Do đó u ≡ 0
(mod pq). Vậy trong trường hợp này x ≡ 0 ≡ cd (mod pq) là nghiệm duy nhất của
phương trình xe ≡ 0 (mod pq).
Trường hợp 3:Giả sử gcd(c, pq) = p. Từ gcd(c, pq) = p, ta có p | c nhưng q c. Do đó cd
là nghiệm đúng của (**), bởi vì
cde = c1+(p−1)(q−1)k ≡ c.c(p−1)(q−1)k

(mod pq).

Do gcd(c, pq) = p nên gcd(c, q) = 1. Bởi định lý Fermat nhỏ, ta có cq−1 ≡ 1 (mod q) và
c(q−1)(p−1)k ≡ 1 (mod q). Vì vậy q | (c(q−1)(p−1)k − 1). Do đó pq | c.(c(q−1)(p−1)k − 1) hay
e
c.(c(q−1)(p−1)k − 1) ≡ 0 (mod pq). Từ đó c1+(q−1)(p−1)k − c ≡ 0 (mod pq) và cd = cde ≡ c
(mod pq). Vậy cd là nghiệm đúng của (**) và x1 ≡ cd (mod pq) là nghiệm của (**).
d
Giả sử (**) còn có nghiệm x2 , tức là xe2 ≡ c (mod pq). Do đó xde
2 ≡ c ≡ x1 (mod pq).
Mặt khác pq | (xe2 − c) và do đó p | (xe2 − c). Vì vậy p | xe2 và p | x2 (vì p | c). Do q x2
nên lập luận tương tự như đã làm với c để có được cde ≡ c (mod pq). Ở đây, ta cũng có
d
xde
2 ≡ x2 (mod pq) và do đó x2 ≡ x1 (mod pq). Vậy trong trường hợp này, c (mod pq)
là nghiệm duy nhất của (**).
Trường hợp 4:Giả sử gcd(c, pq) = q . Lập luận tương tự trường hợp 3 với p và q đổi vai
trò cho nhau, ta cũng có x ≡ cd (mod pq) là nghiệm duy nhất của (**).
Từ quá trình chứng minh định lý trên và kết quả ở Định lý 2.1.1 cùng với nhận
xét rằng nếu gcd(e, (p − 1)(q − 1)) = 1 thì gcd(e, (p−1)(q−1)
) = 1 với g = gcd(p − 1, q − 1),
g

). Khi đó nghiệm duy nhất
ta có thể thay d bởi d thỏa mãn d e ≡ 1 (mod (p−1)(q−1)
g
của (**) là cd ≡ cd (mod pq). Ta sẽ minh họa kết quả trên bằng một ví dụ đơn giản
sau.

Ví dụ 2.1.4. Giải phương trình : x17389 ≡ 43927 (mod 64349).
9


Lời giải. Ta biết N = 64349 = 229.281 và p = 229, q = 281, c = 43927, e = 17389.
Hơn nữa gcd(e, (p − 1)(q − 1)) = gcd(e, 228.280) = 1. Vì vậy ta sẽ tính được d ≡ 53509
(mod 228.280) ( hoặc d ≡ 5629 (mod 15960) ). Do đó nghiệm của phương trình trên là
x ≡ 4392753509 ≡ 14458 (mod 64349) ( hoặc x ≡ 439275629 ≡ 14458 (mod 64349))
Ở ví dụ trên, nếu ta tìm nghiệm dựa vào việc tính d thì chỉ mất 80% của số bước
tính để tìm nghiệm thông qua việc tính d.

2.2.

Hệ mật khóa công khai RSA

Bob và Alice gặp phải vấn đề thường lệ của việc bảo mật các thông tin nhạy cảm
trên một kênh giao tiếp không an toàn. Ta biết có những cách khác nhau để giải
quyết vấn đề này. Ví dụ như trao đổi khóa Diffie-Hellman và hệ mật khóa công khai
Elgamal mà độ bảo mật dựa trên độ khó của bài toán logarit rời rạc.
Trong phần này ta sẽ trình bày về hệ mật khóa công khai RSA mà độ bảo mật
dựa vào độ khó của việc giải phương trình xe ≡ c (mod N ) trong đó N là tích của hai
số nguyên tố phân biệt.

Alice


Bob
Tạo khóa
Chọn hai số nguyên tố phân biệt p và q .
Chọn số mũ e sao cho
gcd(e, (p − 1)(q − 1)) = 1.

Công khai cặp (N, e) với N = pq .
Mã hóa
Chọn thông điệp m cần mã hóa
Sử dụng khóa (N, e) của Bob
để tính c ≡ me (mod N )
Gửi c cho Bob
Giải mã
Tính d ≡ e−1 (mod ((p − 1)(q − 1)))
Tính m ≡ cd (mod N )
( m ≡ m (mod N )
Ở bảng trên, Bob chọn 2 số nguyên tố p = q , khóa công khai là cặp (N, e) với
N = p.q và gcd(e, (p − 1)(q − 1)) = 1. Alice chọn thông điệp mà cô ấy muốn gửi cho Bob
và biến nó thành một số nguyên m nằm giữa 1 và N mà ta gọi là bản hiện, mã hóa
10


m bởi c ≡ me (mod N ), số nguyên c được gọi là bản mã ứng với bản hiện m. Cô ấy sẽ
gửi c cho Bob. Do Bob biết p và q nên để giải mã c, đơn giải Bob chỉ cần giải phương
trình xe ≡ c (mod N ) và khôi phục lại bản hiện m và biết được thông diệp của Alice.
Eve có thể biết c, N , e nhưng trừ khi cô ấy biết phân tích của N , tức là biết p và q
hoặc biết giá trị của (p − 1)(q − 1) nếu không việc giải phương trình xe ≡ c (mod N )

đối với cô ấy là không dễ dàng.

Chúng ta mô tả hệ mật RSA với các số nhỏ làm ví dụ. Tất nhiên ví dụ này không
đủ tốt bởi nó quá dễ để cho Eve tìm được các thừa số trong phân tích của N , để đảm
bảo tính bảo mật cho hệ mật RSA, ta thường sử dụng những giá trị N lớn (có thể có
đến hàng trăm chữ số).
Ví dụ 2.2.1. Chúng ta có bảng mô tả sau

Alice

Bob
Bob tạo khóa RSA
Bob chọn hai số nguyên tốp = 1223,
q = 1987 và e = 948047.
Khi đó N = 1223.1987 = 2430101 và
gcd(948047, (1223 − 1).(1987 − 1)) = 1.

Bob công khai khóa RSA:
(N, e) = (2430101, 948047).

Mã hóa
Thông điệp cần mã hóa là
m = 1070777. Khi đó Alice có
c ≡ me (mod N ) ≡ 1070777948047
(mod 2430101)

1473513
(mod 2430101)
Gửi 1473513 cho Bob.

Giải mã
Bob biết (p − 1)(q − 1) = 1222.1986 =

2426892, d ≡ e−1 ≡ 1051235
(mod 2426892).
Bob tính m ≡ cd ≡ 14735131051235 ≡
1070777 (mod 2430101).
Ta gọi e là số mũ mã hóa còn d được gọi là số mũ giải mã. Mã hóa có thể thực
11


hiện hiệu quả hơn nếu số mũ mã hóa là nhỏ. Tương tự, giải mã sẽ hiệu quả hơn nếu
số mũ giải mã là nhỏ. Tất nhiên Bob có thể chọn cả hai giá trị e, d là nhỏ trong cùng
một lần tạo khóa với e, d thỏa mãn
de ≡ 1

(mod ((p − 1)(q − 1))).

Tất nhiên, Bob có thể chọn e = d = 1 nhưng khi đó m = c. Do đó e = 1 là ý tưởng
rất tệ. Trong khi đó e = 2 không thỏa mãn điều kiện gcd(e, (p − 1)(q − 1)) = 1 vì một
trong hai số p, q là lẻ. Giá trị tốt có thể chọn là e = 3, với e = 3 thì độ bảo mật tương
tự một giá trị lớn hơn của e nhưng có một vài điều lo lắng rằng khi e là quá nhỏ
thì giá trị c ≡ me (mod N ) có thể nhỏ hơn N . Khi đó không xảy ra rút gọn modulo
N và m có thể được tìm ra bằng cách tính căn bậc e của c. Do đó ta thường lấy
e = 216 + 1 = 65537. Khi đó để tính lũy thừa mũ e, ta chỉ mất 16 phép bình phương
và một phép nhân.
Chú ý 2.2.2. Nếu Eve biết được giá trị của (p + q) thì từ đẳng thức (p − 1)(q − 1) =
pq − (p + q) + 1 = N − (p + q) + 1 cho phép Eve tính được (p − 1)(q − 1) và ngược lại.
Hơn nữa, nếu cô ấy biết (p + q) thì cô ấy có thể biết giá trị cụ thể của p và q bằng
cách giải phương trình x2 − (p + q) + pq = 0. Do đó việc tìm giá trị của (p − 1)(q − 1)
so với việc tìm giá trị của p và q là không dễ dàng hơn. Nhưng chú ý rằng những
gì Eve cần làm là giải bản mã c từ phương trình xe ≡ c (mod N ). Nếu cô ấy có một
thuật toán để giải phương trình này mà không cần biết phân tích của N hoặc giá trị

(p − 1)(q − 1) thì cô ấy có thể giả mã c. Nhưng được biết cho đến nay chưa có ai có
thể chỉ ra tồn tại một thuật toán như vậy.
Chú ý 2.2.3. Lưu ý rằng Bob chỉ nên sử dụng một số mũ mã hóa duy nhất. Giả sử
Bob sử dụng cùng lúc hai số mũ mã hóa e1 , e2 để mã hóa cùng một m. Khi đó ta có
hai bản mã
c1 ≡ me1 (mod N ),

c2 ≡ me2 (mod N ).
Do Eve biết c1 , c2 , e1 , e2 , N và giả sử gcd(e1 , e2 ) = e1 .u + e2 .v . Khi đó Eve có
cu1 .cv2 ≡ me1 .u .me2 .v ≡ me1 .u+e2 .v ≡ mgcd(e1 ,e2 )

(mod N ).

Nếu gcd(e1 , e2 ) = 1 thì Eve có được m.

2.3.

Kiểm tra tính nguyên tố của một số nguyên

Theo thứ tự tạo một cặp khóa RSA, Bob cần chọn 2 số nguyên tố phân biệt đủ
lớn. Vì vậy, Bob phải đối mặt với bài toán tìm các số nguyên tố lớn. Chính xác hơn,
Bob cần một cách để kiểm tra một số lớn được chọn là số nguyên tố hay hợp số. Ví
dụ như Bob muốn biết số
n = 3198793773747935332620068643713101490952335301

có là số nguyên tố hay không? Đầu tiên Bob thử tìm các thừa số nguyên tố nhỏ của
n nếu có , nhưng Bob không tìm thấy bất kỳ số nguyên tố nào nhỏ hơn 1 triệu là ước
của n. Cách khác, Bob tính
2n−1 ≡ 1281265953551359064133601216247151836053160074
12


(mod n).


Điều này chỉ ra n không phải số nguyên tố mặc dù Bob không biết bất kỳ một ước
nào của n. Trước khi tiếp tục câu chuyện tìm kiếm số nguyên tố lớn của Bob, ta nhắc
lại định lý Fermat nhỏ.
Định lý 2.3.1. Nếu p là một số nguyên tố thì ap ≡ a (mod p), với mọi a ∈ Z.
Từ Định lý 2.3.1, nếu tồn tại a ∈ Z sao cho an ≡ a (mod n) thì n là hợp số. Trong
trường hợp này, ta nói a là một bằng chứng hợp số dạng Fermat của n, hay nói gọn là
bằng chứng Fermat. Thật đáng tiếc, ngay cả khi n không có một bằng chứng Fermat
nào cũng không đủ để kết luận n là số nguyên tố. Ví dụ n = 561 thì a561 ≡ a (mod n),
với mọi a ∈ Z. Nhưng từ n = 561 = 3.11.17 chỉ ra rằng n không phải số nguyên tố.
Tuy vậy, để đánh giá khả năng n là một số nguyên tố, ta có thể thử các giá trị a = aj ,
với mọi j = 1, 2, . . . , k. Nếu có bất kỳ một trong số các aj là bằng chứng Fermat của
n thì n là hợp số. Ngược lại nếu n không có bất cứ một bằng chứng Fermat nào thì
n có khả năng là một số nguyên tố.
Một hợp số mà không có bất kỳ bằng chứng Fermat nào được gọi là số Carmichael.
Mặc dù số Carmichael khá hiếm nhưng người ta đã chỉ ra được có vô hạn số như vậy.
Phương pháp kiểm tra số nguyên tố dựa vào định lý Fermat nhỏ không hiệu quả đối
với các số này, do đó Bob cần một công cụ mạnh hơn nữa để kiểm tra tính nguyên
tố của một số nguyên bao gồm cả số Carmichael.
Mệnh đề 2.3.2. Cho p là một số nguyên tố lẻ và viết p − 1 = 2k .q (với q lẻ). Cho
a ∈ Z thỏa mãn gcd(a, p) = 1. Khi đó một trong hai điều sau là đúng.
a) aq ≡ 1 (mod p).
b) Một trong các số aq , a2q , . . . , a2

k−1

.q


sẽ đồng dư với −1 (mod p).

Chứng minh. Do gcd(a, p) = 1 nên ap−1 ≡ 1 (mod p). Do đó cấp của a trong nhóm các
phần tử khả nghịch modulo p phải là ước của 2k .q . Vì vậy, trong danh sách
k−1

aq , a2q , . . . , a2

.q

k

, a2

.q

(∗ ∗ ∗)

phải có ít nhất một giá trị đồng dư với 1 modulo p. Giả sử aq ≡ 1 (mod p). Khi đó,
trong danh sách (∗ ∗ ∗), số sau là bình phương của số đứng trước. Gọi ki là số nhỏ
k
nhất để a2 i q ≡ 1 (mod p), (1 ≤ ki ≤ k). Khi đó từ
(a2

ta có a2

ki −1
.q


ki −1
q

)2 ≡ 1

(mod p)



ki −1

a2

q

≡1

(mod p),

≡ −1 (mod p). Vậy một trong các số aq , a2q , . . . , a2

k−1

.q

phải đồng dư với

−1 (mod p).

Mệnh đề trên cho ta một cách kiểm tra tính nguyên tố của một số n-lẻ được cho

trong bảng sau.

13


Đầu vào:Số nguyên n, số nguyên a.
1. Nếu n chẵn hoặc 1 < gcd(a, n) < n, trả kết quả :n là hợp số.
2. Viết n − 1 = 2k q với q lẻ
3. Đặt a := aq (mod n)
4. Nếu a ≡ 1 (mod n) thì trả kết quả:kiểm tra thất bại.
5. Vòng lặp i = 0, 1, 2, . . . , k − 1.
6. Nếu a ≡ −1 (mod n) thì trả kết quả:kiểm tra thất bại.
7. Đặt a := a2 (mod n).
8. Kết thúc vòng lặp.
9. Trả kết quả :n là hợp số.
Định nghĩa 2.3.3. Cho n là một số lẻ và viết n − 1 = 2k .q với q lẻ và số nguyên a
thỏa mãn gcd(a, n) = 1, a được gọi là một bằng chứng Miller-Rabin nếu cả hai điều
sau là đúng.
a) aq ≡ 1 (mod n).
i

b) a2 q ≡ −1 (mod n), với mọi i = 0, 1, . . . , k − 1.
Mệnh đề 2.3.4. Cho n là một hợp số lẻ. Khi đó có ít nhất 75% các số giữa 1 và n − 1
là bằng chứng Miller-Rabin cho n.
Bây giờ, Bob muốn kiểm tra tính nguyên tố của một số n (lẻ). Anh ấy thử với 10
giá trị khác nhau của a. Nếu có bất kỳ giá trị nào của a là bằng chứng Miller-Rabin
(bằng chứng M-R) thì n chắc chắn là hợp số. Ngược lại, nếu không có giá trị nào của
a là bằng chứng M-R thì từ Mệnh đề 2.3.4, khi n là hợp số , xác xuất để cả 10 lần
đều không cho ta bằng chứng M-R không quá (25%)10 (cỡ 10−6 ). Tương tự, xác suất
để sau k lần thử không chỉ ra được bằng chứng M-R của n là (25%)k , ta có thể nói

nếu sau k lần thử mà không chỉ ra được bằng chứng M-R thì xác suất để n thực sự
là hợp số chỉ là (25%)k .
Ví dụ 2.3.5. Với n = 561 và a = 2, ta có n − 1 = 560 = 24 .35. Khi đó ta có
235 ≡ 263 ≡ ±1

(mod 561),

22.35 ≡ 2632 ≡ 166 ≡ −1

(mod 561),

2

22

.35
3

22

≡ 1662 ≡ 67 ≡ −1

.35

≡ 672 ≡ 1 ≡ −1

(mod 561),
(mod 561).

Vậy a = 2 là một bằng chứng M-R của 561, do đó 561 là hợp số. Lưu ý rằng a = 2

không là bằng chứng Fermat của 561 (số carmichael).
Ví dụ 2.3.6. Cho n = 172947529. Khi đó n − 1 = 23 .21618441. Với a ∈ {17, 3, 23} ta có
thể kiểm tra được rằng a = 3, a = 17 không là bằng chứng M-R của n nhưng a = 23
là bằng chứng M-R của n. Do đó n = 172947529 là hợp số.

14


2.3.1.

Phân bố của tập số nguyên tố

Định nghĩa 2.3.7. Cho số nguyên n ≥ 2, ta định nghĩa
π(n) = {số các số nguyên tố từ 2 đến n}.

Ví dụ 2.3.8. π(10) = 4, vì các số nguyên tố từ 2 đến 10 gồm 4 số là 2, 3, 5, 7.
Định lý 2.3.9 (Định lý số nguyên tố).
lim

π(n)

n→∞ n
ln(n)

=1

hay

π(n) ∼


n
ln(n)

khi n lớn.

Định lý 2.3.9 được chứng minh độc lập bởi Hadamard và De la Valle’e Poussin
năm 1986.
Ví dụ 2.3.10. Số các số nguyên tố từ 900000 đến 1000000 là
π(1000000) − π(900000) ≈

1000000
900000

≈ 6737, 62.
ln(1000000) ln(900000)

Thực tế có chính xác là 7224 số nguyên tố nằm giữa 900000 và 1000000.
Trong mã hóa chúng ta cần những số nguyên tố lớn cỡ 300 chữ số thập phân.
Những số đó có độ dài khoảng 1024 bit. Vậy có bao nhiêu số nguyên tố trong khoảng
từ 21023 đến 21024 ? Ta có
π(21024 ) − π(21023 ) ≈

22013
21024

≈ [21013.53 ]
ln(21024 ) ln(22013 )

số nguyên tố. Định lý 2.3.9 nói rằng, với n đủ lớn, khi ta chọn 1 số nguyên từ 1 đến n
1

thì tỷ lệ để ta chọn được một số nguyên tố là xấp xỉ ln(n)
. Vì vậy, ta có nói rằng việc
1
chọn một số ngẫu nhiên N thì xác suất N là số nguyên tố là ln(N
. Lưu ý rằng một
)
số N hoặc là một số nguyên tố hoặc là hợp số, phát biểu trên muốn mô tả tỷ lệ tìm
được số nguyên tố xung quanh N . Ví dụ khi ta chọn x thuộc N2 đến 3N
2 , xác suất để
1
x là số nguyên tố khoảng ln(N ) .
Ví dụ 2.3.11. Ta minh họa trong ví dụ này việc tìm kiếm số nguyên tố có khoảng
1024 bit. Phát biểu trên nói rằng xác suất để một số N ≈ 21024 là số nguyên tố là
1
1
1
=
=
≈ 0.14%.
1024
ln(2
)
1024 ln(2)
709, 78

Vậy trung bình ta cần thử khoảng 700 lần một số ngẫu nhiên cỡ 21024 để có được một
số nguyên tố.
Nếu ta chọn không thử các số chia hết cho 2, 3, 5, 7, 11 thì xác xuất có thể
cao hơn. Cụ thể ta làm như sau. Đặt m = 2.3.5.7.11 = 2310. Chọn k = 1139 (ta có
gcd(1139, 2310) = 1). Khi đó k nguyên tố với 2, 3, 5, 7, 11. Đặt N = 2.3.5.7.11.n + 1139

15


hay N = 2310n + 1139. Khi đó N không chia hết cho 2, 3, 5, 7, 11. Xác suất để
N = 2310n + 1139 là số nguyên tố xấp xỉ khoảng
2 3 5 7 11 1
4, 8
p= . . . . .
=
≈ 0.67%.
1 2 4 6 10 ln(N )
ln(N )

Nghĩa là ta chỉ cần thử khoảng 150 số ngẫu nhiên quanh 22014 có dạng 2310n + 1139
sẽ có cơ hội có được một số nguyên tố. Dùng "Miller-Rabin test" với 1000 giá trị
ngẫu nhiên của N để kiểm tra tính nguyên tố của mỗi số dạng 2310n + 1139. Với
22013 ≤ n ≤ 22013 + 1000 hay n = 22013 + j với 0 ≤ j ≤ 1000, kết quả là tìm được 12 giá
trị của j . Cụ thể {41, 148, 193, 251, 471, 585, 606, 821, 851, 865, 910, 911} có khả năng làm
cho N = 2310(21013 + j) + 1139 là số nguyên tố với xác xuất cao. Số nhỏ nhất trong số
đó là 2310(21013 + 41) + 1139 có 308 chữ số.
2.3.2.

Chứng minh tính nguyên tố và kiểm tra xác suất Versus

Thuật toán Miller-Rabin là một thuật toán mạnh và tiện lợi cho việc tìm kiếm các
số nguyên lớn có khả năng là số nguyên tố. Ta biết rằng nếu một số n là hợp số thì
n có thể có rất nhiều bằng chứng Miller-Ranbin. Sau chừng 50 đến 100 lần thử nếu
không chỉ ra được bằng chứng Miller-Rabin thì có thể gần chắc rằng n là số nguyên
tố. Tuy nhiên có sự khác biệt giữa "gần như chắc chắn" và "chắc chắn". Nếu Bob
muốn kiểm tra chính xác rằng n là một số nguyên tố, về nguyên tắc, Bob phải

kiểm

tra các giá trị mà n không chia hết cho nó, tức là kiểm tra các số 1, 2, 3, . . . , [ n]. Nếu
không có giá trị nào là ước của n thì chắc chắn n là số nguyên tố.
Tuy nhiên√nếu n

1000
lớn cỡ 2
thì số lần thực hiện các bước tính sẽ là một bội của n, tức là θ( n) để
hoàn thành (chạy với thời gian mũ). Nhưng ta mong muốn có một thuật toán chứng
minh tính nguyên tố chạy trong thời gian đa thức.
Nhắc lại giả thiết Riemann:Hàm số Zeta-Riemann ζ(s) được định nghĩa bởi


ζ(s) =
n=1

1
ns

trong đó s ∈ C. Chuỗi này hội tụ với phần thực của s lớn hơn 1 và mở rộng bởi tính
liên tục giải tích lên toàn mặt phẳng phức với một điểm kỳ dị tại s = 1. Giả thiết
Riemann nói rằng nếu σ + iτ là không điểm với 0 ≤ σ ≤ 1 thì σ = 12 .
(1 −

Người ta đã chứng minh được ζ(s) =

1 −1
) và công thức phỏng đoán
ps


p nguyên tố

sau

x

π(x) =
2


dt
+ θ( x. ln(x)).
ln(t)

Công thức này mạnh hơn định lý về số nguyên tố, khi x lớn ta suy ra π(x) ∼ lnxx .
Trong suốt khoảng 150 năm nay, kể từ khi phát biểu vẫn chưa có ai chứng minh được
giả thiết này.

16


Mệnh đề 2.3.12. Nếu giả thiết Riemann là đúng thì mỗi hợp số n có một bằng chứng
Miller-Rabin a thỏa mãn
a ≤ 2(ln(n))2 .

Ứng dụng 2.3.13. Chúng ta có hai trường hợp sau.
1. Nếu tồn tại a với a ≤ 2(ln(n))2 là bằng chứng Miller-Rabin thì n là hợp số.
2. Nếu không tồn tại a với a ≤ 2(ln(n))2 là bằng chứng Miller-Rabin thì n là số
nguyên tố.

Thuật toán AKS chỉ ra rằng nếu cho một số > 0 tùy ý, có một thuật toán xác
định liệu N có là số nguyên tố hay không trong thời gian không quá O(ln(N ))6+ )
bước. Thực tế thuật toán này chậm hơn nhiều so với thuật toán Miller-Rabin. Hầu
hết mọi người sẽ chấp nhận một số nguyên n là số nguyên tố nếu sau khoảng 50 đến
100 phép thử các giá trị của a theo cách kiểm tra Miller-Rabin mà không chỉ ra được
một bằng chứng Miller-Rabin nào của n.

2.4.

Thuật toán Pollard:phân tích nhân tử của p − 1

Cho một số nguyên dương N , N = p.q với p, q là các số nguyên tố. Công việc của
Eve là tìm ra các số p, q . Chú ý rằng nếu có số nguyên L thỏa mãn
(p − 1)|L

và (q − 1) L (∗)

khi đó tồn tại i, j ∈ Z để L = (p − 1).i và L = (q − 1).j + k với 1 ≤ k ≤ q − 2.
Giả sử số nguyên a có tính chất
aL = a(p−1)i ≡ 1

Khi đó

(mod p)



aL = a(q−1)j+k = ak .a(q−1)j ≡ 1

(mod q).


(**)

gcd(aL − 1, N ) = p

Nếu may mắn Eve chọn được số nguyên a nguyên tố với p và q và thỏa mãn ak ≡ 1
(mod q) thì (**) được thỏa mãn . Nhưng nhớ rằng từ ban đầu, Eve chỉ biết N có dạng
tích của 2 số nguyên tố p và q mà chưa biết giá trị của p, q . Nên cô ấy sẽ không biết
trước giá trị L và a mà cô ấy chọn có đủ tốt hay không. Vậy nếu Eve muốn theo cách
này để tìm ra p và q thì trước hết cô ấy bằng cách thức nào đó phải tìm được một
cặp (L, a) với L và a có nhiều khả năng sẽ thỏa mãn (*) và (**). Và thử cho đến khi
nào gcd(aL − 1, N ) = p (nếu có thể xảy ra ) thì cô ấy sẽ thành công.
Nhờ quan sát của Pollard rằng nếu p − 1 phân tích được thành tích các số nguyên
tố nhỏ thì rất có thể p − 1 là ước của n!. Điều này gợi ý cho Eve thử các số L có
dạng L = n!. Trong thực hành, Eve có thể khởi đầu với việc chọn a = 2 hoặc một
vài giá trị dễ tính toán. Nếu gcd(an! − 1, N ) = 1 thì ta thay n! bởi (n + 1)! và nếu
gcd(an! − 1, N ) = N thì xem như ta không may mắn (lúc này dù có thử với L = (n + 1)!
cũng cho kết quả như vậy). Nhưng Eve có thể thay giá trị khác cho a và bắt đầu làm
lại.
17


Một vấn đề gặp phải trong quá trình tính an! là ngay cả khi gắn cho a giá trị nhỏ
chỉ bằng 2, thì với n lớn, an! có thể rất lớn. Thay vì làm việc với các số lớn như vậy,
ta có thể rút gọn chúng theo modulo N và chỉ phải làm việc với các số không lớn quá
N bởi nhận xét nếu aL ≡ h (mod N ) và gcd(aL − 1, N ) = p thì gcd(h − 1, N ) = p.
Ta mô tả thuật toán phân tích thừa số p − 1 của Pollard trong bảng sau với a = 2.
Đầu vào:số nguyên N được phân tích
1. Đặt a = 2 ( hoặc giá trị thuận tiện nào đó)
2. Vòng j = 2, 3, 4, . . . ( tăng tới một giới hạn nhất định).

3. Đặt a :≡ aj (mod N ).
4. Tính d = gcd(a − 1, N ).
5. Nếu 1 < d < N thì thành công, trả về giá trị d.
6. Tăng j , quay lại ở bước 2.
.
Để tính được an! (mod N ), ta mất không quá 2n log2 (n) bước. Đồng thời cũng tính
được ak! (mod N ) với k = 1, 2, . . . , n. Để thêm hiệu quả, đôi khi ta có thể chọn một số
k thích hợp và bắt đầu tính từ gcd(ak! − 1, a). Ví dụ sau minh họa cho điều này.
Ví dụ 2.4.1. Phân tích N = 13927189.
Lời giải. Ta bắt đầu từ việc tính gcd(29! − 1, N ). Cụ thể ta có
29! − 1 ≡ 13867883

(mod N ),

gcd(29! − 1, N ) =1

210! − 1 ≡ 5129508

(mod N ),

gcd(210! − 1, N ) =1

211! − 1 ≡ 4405233

(mod N ),

gcd(211! − 1, N ) =1

212! − 1 ≡ 6680550


(mod N ),

gcd(212! − 1, N ) =1

213! − 1 ≡ 6161077

(mod N ),

gcd(213! − 1, N ) =1

214! − 1 ≡ 879290

(mod N ),

gcd(214! − 1, N ) =3823.

Ta được một phân tích không tầm thường của N = p.q , với p = 3823, q = N : p = 3643.
Trong ví dụ này, n = 14! làm việc, vì p − 1 = 3822 = 2.3.72 .13 là tích các số nguyên tố
nhỏ.
Chú ý 2.4.2. Ta không bàn về khả năng thành công của phương pháp này. Tuy
nhiên dễ thấy răng phương pháp này hiệu quả nếu ít nhất một trong hai số p − 1 hoặc
q − 1 có phân tích là tích các số nguyên tố nhỏ với số mũ nhỏ. Điều này sẽ dễ dàng
cho Bob và Alice tránh mối nguy hiểm từ phương pháp phân tích p − 1 của Pollard
khi tạo khóa RSA. Đơn giản là kiểm tra những số bí mật p và q và đảm bảo rằng cả
p − 1 và q − 1 đều không có phân tích là tích các số nguyên tố nhỏ.
Định nghĩa 2.4.3. Một số nguyên mà các thừa số nguyên tố của nó nhỏ hơn hoặc
bằng B được gọi là một số B -mịn.
Ta sẽ nghiên các số B -mịn (hay B -phẳng, B -trơn ) ở các phần tiếp theo.
18



2.5.

Phân tích thông qua hiệu bình phương

Phương pháp này được biết dựa vào một trong những sự phát hiện đơn giản nhất
trong toán học là
X 2 − Y 2 = (X + Y )(X − Y ).

Một hiệu của các số chính phương có thể viết thành một tích. Điều này giợi ý rằng,
nếu ta tìm được một số nguyên b sao cho N + b2 là một số chính phương, tức là
N + b2 = a2 thì N = a2 − b2 = (a + b)(a − b). Do đó ta có phân tích của N thành tích
hai nhân tử. Tuy nhiên, nếu N lớn thì ta khó có thể đảm bảo tìm được một giá trị b
ngẫu nhiên làm cho N + b2 là số chính phương. Ta cần một cách khéo léo để chọn b.
Lưu ý rằng ta không cần phải viết chính N như là một hiệu của hai số chính phương,
thay vào đó ta có thể viết một vài bội của N như là hiệu hai số chính phương. Từ đó
nếu kN = a2 − b2 thì có một cơ hội hợp lý để ta có được một phân tích không tầm
thường của N . Đơn giản là tính gcd(a + b, N ) và gcd(a − b, N ), và hi vọng có thể tìm
thấy thừa số của N .
Ví dụ 2.5.1. Với N = 203299, ta tạo một bảng số N + b2 với b từ 1 dến 100 nhưng
không tìm thấy một giá trị chính phương nào của N + b2 . Bây giờ, ta thử danh sách
với 3N + b2 . Cụ thể ta có
3N + 12 = 609898

3N + 22 = 609901

2

2


3N + 4 = 609913

2

3N + 5 = 609922

3N + 62 = 609933

3N + 72 = 609946

3N + 82 = 609961 = 7812 .

3N + 3 = 609906

(2.1)
(2.2)
(2.3)
(2.4)

Từ lần thử cuối cùng ta có 3.203299 = (781 + 8)(781 − 8) = 789.773. Do đó ta có
gcd(203299, 789) = 263, và gcd(203299, 773) = 773. Vậy 263 và 773 đều là các số nguyên
tố và 263.773 = 203299 = N .
Trong thực hành ta không dễ dàng tìm kiếm được a, b thỏa mãn a2 ≡ b2 (mod N ).
Thay vào đó ta sử dụng một chương trình 3 bước, ở dạng này hay dạng khác, được
coi là phương pháp hiện đại nhất của việc phân tích N . Ta sẽ mô tả trong bảng sau.

19


Cho N là số cần phân tích

Bước 1:Xây dựng mối quan hệ
Tìm các giá trị nguyên a1 , a2 , . . . ., ar có tính chất
ci ≡ (ai )2 (mod N ),
trong đó ci có phân tích là tích của các số nguyên tố nhỏ.
Bước 2:Loại bỏ
Nếu ci1 ci2 . . . cis
biểu diễn dưới dạng tích của các số nguyên tố nhỏ có số mũ chẵn thì
ci1 ci2 . . . cis = b2 là một số chính phương.
Bước 3 :Tính ước chung lớn nhất
Tính d = gcd(N, a − b) với a, b xác định từ
a2 = (ai1 ai2 . . . ais )2 ≡ (ai1 )2 (ai2 )2 . . . (ais )2 ≡ ci1 ci2 . . . cis ≡ b2 (mod N ).
d có cơ hội là 1 thừa số trong phân tích không tầm thường của N .
.
Ví dụ 2.5.2. Với N = 636683, sau khi tìm kiếm ta có
13872 ≡ 13720

(mod N ),

13720 = 23 .5.73

27742 ≡ 54880

(mod N ),

54880 = 25 .5.73

(2.5)
(2.6)

Từ đó ta có

2

13872 .27742 ≡ 13720.54880 ≡ (24 .5.73 ) ≡ 274402

(mod N ).

Nhưng gcd(N, 1387.2774 − 2774) = 636683 = N không cho ta một phân tích không tầm
thường của N. Tuy nhiên ta có thể tìm thêm các giá trị ai bổ xung vào danh sách cũ,
phát hiện rằng
33592 ≡ 459270

(mod N ),

12872 .33592 ≡ 13720.459270
2

459270 = 2.38 .5.7

(mod N )

≡ (22 .34 .5.72 ) ≡ 793802

(mod N ).

Từ đó ta có gcd(N, 1387.3359 − 79380) = 787 và N có phân tích N = 787.809.
Chú ý 2.5.3. Phương trình a2 ≡ b2 (mod N ) có bao nhiêu nghiệm a, b để ta có thể
thử cho đến khi có được một phân tích không tầm thường của N . Trường hợp khó
nhất xảy ra khi√ N = p.q là tích của hai số nguyên tố cùng cỡ. Khi đó số nguyên tố
nhỏ nhất là O( N ). Trong các trường hợp khác, số nguyên tố nhỏ nhất là O(N )α với
α < 1/2. Giả sử chúng ta có thể tìm thấy nhiều hoặc ít các giá trị ngẫu nhiên a, b

thỏa mãn a2 ≡ b2 (mod N ). Cơ hội trong việc tìm kiếm phân tích không tầm thường
của N khi tính gcd(N, a − b) là bao nhiêu?
Ta biết rằng nếu (a − b)(a + b) = a2 − b2 = kN = k.p.q với số nguyên k nào đó, thì
p và q là ước của ít nhất một trong hai số (a − b) hoặc (a + b). Ta sẽ thành công nếu
20


(a − b) chỉ chia hết cho một trong hai số p hoặc q mà không chia hết cho số còn lại.
Điều này xảy ra với xác suất 50%, nghĩa là không mất quá nhiều lần thử.

Ta sẽ phát triển phương pháp ba bước một cách hợp lý hơn như sau.
Bước 1: Ta lập một danh sách các số a1 , a2 , . . . , ar thỏa mãn (ai )2 ≡ ci (mod N ),
trong đó ci là các số nguyên dương nhỏ hơn N và là tích của t số nguyên tố nhỏ đầu
tiên (cố định thứ tự tăng dần) {p1 , p2 , . . . , pt }.
t
e

pj ij với 1 ≤ i ≤ r và 1 ≤ j ≤ t. Cụ thể

Bước 2: Ta viết ci =
j=1

c1 = pe111 .pe212 . . . pet 1t
c2 = pe121 .pe222 . . . pet 2t
...
cr = pe1r1 .pe2r2 . . . pet rt .
r

cui i = cu1 1 .cu2 2 . . . .cur r là số chính


và tìm các số mũ u1 , u2 , . . . , ur ∈ {0, 1} sao cho
i=1

phương. Dễ thấy

r
r

pj i=1

cui i =
i=1

eij ui )

(

t

j=1
r

cui i là

do đó ta cần chọn (u1 , u2 , . . . , ur ) sao cho số mũ của pj trong phân tích của
i=1

chẵn. Điều này tương đương với giải hệ

e11 u1 + e21 u2 + . . . + er1 ur ≡ 0 (mod 2)





e12 u1 + e22 u2 + . . . + er2 ur ≡ 0 (mod 2)
....



....




e1t u1 + e2t u2 + . . . + ert ur ≡ 0

(2.7)

(mod 2)

Hệ 2.7 được giải trên trường F2 với ma trận tương ứng là :


e11 e21 . . . er1
e12 e22 . . . er2 

A =  ..

.


..
.

...

.. 
.

e1t e2t . . . ert

trong đó eij là số mũ của pj trong phân tích của ci được rút gọn theo modulo 2. Chúng
ta có thể sử dụng phương pháp khử Gauss để giải hệ thặng dư 2.7 trên trường F2 .
Ví dụ 2.5.4. Cho N = 9788111 là số cần phân tích. Khi đó ta tìm kiếm các số nguyên
a với tính chất a2 (mod N ) là các số 50-mịn. Các số nguyên tố nhỏ hơn 50 gồm 15 số
21



{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}.

Ta tìm được 20 số a1 , a2 , . . . , a20 nằm giữa 3139 và 4700 có tính chất này.
t

Số thứ tự

a2i

≡ ci (mod N )

e


pj ij , 1 ≤ i ≤ r, 1 ≤ j ≤ t

ci =
j=1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

31292
31302
31312

31662
31742
32152
33132
34492
34812
35612
43942
44252
44262
44322
44422
44682
45512
45952
46512
46842

≡ 2530 (mod N )
≡ 8789 (mod N )
≡ 15050 (mod N )
≡ 235445 (mod N )
≡ 286165 (mod N )
≡ 548114 (mod N )
≡ 1187858 (mod N )
≡ 2107490 (mod N )
≡ 2329250 (mod N )
≡ 2892610 (mod N )
≡ 9519125 (mod N )
≡ 4403 (mod N )

≡ 13254 (mod N )
≡ 66402 (mod N )
≡ 155142 (mod N )
≡ 386802 (mod N )
≡ 1135379 (mod N )
≡ 1537803 (mod N )
≡ 2055579 (mod N )
≡ 2363634 (mod N )

2530 = 2.5.11.23
8789 = 11.17.47
15050 = 2.52 .7.43
235445 = 5.72 .312
286165 = 5.113 .43
548114 = 2.73 .17.47
1187858 = 2.72 .17.23.31
2107490 = 2.5.72 .11.17.23
2329250 = 2.53 .7.113
2892610 = 2.5.7.312 .43
9519125 = 53 .7.11.23.43
4403 = 7.17.37
13254 = 2.3.472
66402 = 2.32 .7.17.31
155142 = 2.33 .132 .17
386802 = 2.33 .13.19.29
1135379 = 72 .17.29.47
1537803 = 32 .17.19.232
2055579 = 3.23.313
2363634 = 2.33 .7.132 .37


Để tìm các u1 , u2 , . . . , u20 sao cho
r

cui i = cu1 1 .cu2 2 . . . .cur r
i=1

là số chính phương, ta giải hệ phương trình tuyến tính thuần nhất trên F2 đã mô tả
ở 2.7. Ma trận hệ số của hệ tương ứng là

22

























1
0
1
0
1
0
0
0
1
0
0
0
0
0
0

0
0
0
0
1
0
1
0
0
0

0
0
0
0
1

1
0
0
1
0
0
0
0
0
0
0
0
0
1
0

0
0
1
0
0
0
0
0

0
0
0
0
0
0
0

0
0
1
0
1
0
0
0
0
0
0
0
0
1
0

1
0
0
1
0
0

1
0
0
0
0
0
0
0
1

1
0
0
0
0
0
1
0
1
0
1
0
0
0
0

1
0
1
0

1
0
1
0
1
0
0
0
0
0
0

1
0
1
1
1
0
0
0
0
0
0
0
0
0
0

1
0

1
1
0
0
0
0
0
0
0
0
0
1
0

0
0
1
1
1
0
0
0
1
0
0
0
0
1
0


0
0
0
1
0
0
1
0
0
0
0
1
0
0
0

1
1
0
0
0
0
0
0
0
0
0
0
0
0

0

1
0
0
1
0
0
1
0
0
0
1
0
0
0
0

1
1
0
0
0
0
1
0
0
0
0
0

0
0
0

1
1
0
0
0
1
0
1
0
1
0
0
0
0
0

0
0
0
0
0
0
1
0
0
1

0
0
0
0
1

0
0
0
0
0
0
1
1
0
0
0
0
0
0
0

0
1
0
0
0
0
0
0

1
0
1
0
0
0
0

1
1
0
1
0
0
0
0
0
0
0
1
0
0
0
























Hệ này có thể được giải bằng phương pháp khử Gauss, tập nghiệm là một không gian
véc tơ trên F2 có chiều 8 với cơ sở là
v1 = {0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
v2 = {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
v3 = {0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
v4 = {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
v5 = {1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}
v6 = {1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}
v7 = {1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0}
v8 = {1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1}.

Mỗi véc tơ v1 đến v8 cho ta một đồng dư thức a2 ≡ b2 (mod N ). Ví dụ với v1 nói
rằng nếu ta lấy tích các số thứ 3, thứ 5, thứ 9 sẽ được một số chính phương. Cụ thể
31312 .31742 .34812 ≡ (2.52 .7.43)(5.113 .43)(2.53 .7.113 )

2

≡ (2.53 .7.113 .43) ≡ 1001577502

(mod N ).

Tiếp theo ta tính gcd(9788111, 3131.3174.3481 − 100157750) = N . Thât không may!
Nhưng ta vẫn còn 7 nghiệm độc lập khác để thử. Kết quả sẽ cho ta 7 trong số 8
nghiệm không mang lại cho ta một phân tích không tầm thường của N . Nhưng có
nghiệm v7 cho ta đồng dư thức
2

31292 .33132 .34492 .44262 .46512 ≡ (22 .3.5.72 .11.17.232 .312 .47)
≡ 131360821145402

(mod N )

Tiếp theo ta tính gcd(9788111, 3129.3313.3449.4426.4651 − 13136082114540) = 2741. Do
đó cho ta phân tích không tầm thường của N là N = 9788111 = 2741.3571. Cả hai số
2741 và 3571 đều là các số nguyên tố. Do đó đây là phân tích đầy đủ của N thành
tích các thừa số nguyên tố.

23


Chú ý 2.5.5. Ở ví dụ trên, hệ phương trình tuyến tính thuần nhất có tất cả 15
phương trình. Trong nhiều trường hợp, số các số nguyên tố p1 , p2 , . . . , pt có thể rất
lớn, cỡ hàng nghìn,hàng triệu số, khi đó hệ phương trình tuyến tính thuần nhất ở 2.7
có tới hàng nghìn, hàng triệu phương trình . Chúng ta sẽ rất khó để giải tổng quát
hệ này. Tuy nhiên số các số nguyên tố xuất hiện trong phân tích của ci là giải rác.

Điều này muốn nói rằng hầu hết các số mũ của các số nguyên tố trong biểu diễn của
ci là 0, tức là ma trận hệ số sẽ chứa rất nhiều số 0. Thực tế có một kỹ thuật đặc biệt
để giải hệ phương trình tuyến tính dạng này hiệu quả hơn nhiều so với phương pháp
khử Gauss thông thường. Có một phỏng đoán rằng nếu một số ci là tích của các số
ln(ci )
nhỏ hơn B thì nó sẽ là tích của các lũy thừa của khoảng ln(B)
các số nguyên tố phân
biệt.

2.6.

Số mịn, sàng, xây dựng mối quan hệ cho nhân tử

2.6.1.

Số mịn

Định nghĩa 2.6.1. Cho B ∈ Z, B ≥ 2. Khi đó, một số nguyên n được gọi là một số
B -mịn nếu mọi thừa số nguyên tố trong phân tích của nó đều nhỏ hơn hoặc bằng B .
Sau đây, nếu không nói gì thêm, ta luôn coi một số B -mịn là số lớn hơn 1.
Ví dụ 2.6.2. Một vài số đầu tiên là 5 mịn và 5 không mịn.
Các số 5 mịn là 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, . . ..
Các số 5 không mịn là 7, 11, 13, 14, 17, 19, 21, 22, 23, 26, 28, 29, 31, 33, 34, 35, 37 . . ..
Định nghĩa 2.6.3. Cho số nguyên x ≥ 2. Hàm ψ(x, B) tính toán các số B -mịn từ 2
đến x
ψ(x, B) = #{n ∈ Z | n là B -mịn sao cho 2 ≤ n ≤ x}.
Ví dụ như ψ(25, 5) = 15 vì có tất cả 15 số 5 mịn từ 2 đến 25. Cụ thể là các số
2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25.
Định lý 2.6.4. Cho 0 < < 21 , x và B thỏa mãn
(ln x) < ln B < (ln x)1− .


Đặt u =

ln x
ln B .

Khi đó số các số B mịn nhỏ hơn hoặc bằng x thỏa mãn
ψ(x, B) = x.u−u(1+o(1)) .

Chú ý 2.6.5. Chúng ta sử dụng ký hiệu o(1) để chỉ một hàm f (x) → 0 khi x → ∞.
(x)
Tổng quát hơn, ta viết f (x) = o(g(x)) nếu tỷ số fg(x)
→ 0 khi x → ∞. Định nghĩa này
khác với định nghĩa O(g(x)), ta viết f (x) = O(g(x)) để chỉ hàm f (x) nhỏ hơn một bội
của g(x) khi x đủ lớn.


Nếu ta đặt L(x) = e
có ngay hệ quả sau.

(ln x)(ln ln x)

và B = L(x)c với 0 < c < 1 thì từ Định lý 2.6.4, ta

24


Hệ quả 2.6.6. Cho c bất kỳ thỏa mãn 0 < c < 1. Khi đó
1


ψ(x, L(x)c ) = x.L(x)(− 2c )(1+o(1))

Chứng minh. Đặt B = L(x)c . Lấy 0 < < 12 . Khi đó
ln B = c ln(L(x)) = c

thỏa mãn (ln x) < ln B < (ln x)1− . Với u =

ln x
ln B

ln(x)(ln ln x)
ln x
(ln x)(ln ln x)

= √
c

=

1
c

ln x
ln ln x

ta có

1

ψ(x, L(x)c ) = x.u−u(1+o(1)) = x.L(x)− 2c (1+o(1)) .


Định nghĩa 2.6.7. Cho f (x) và g(x) là các hàm biến x nhận giá trị dương. Ký hiệu
f (x) = O(g(x)) hoặc f (x)
g(x) nếu tồn tại hằng số dương c và C sao cho
f (x) ≤ cg(x),

với mọi x ≥ C.

Tương tự, ta ký hiệu f (x) = Ω(g(x)) hoặc f (x)

g(x) nếu tồn tại các hằng số dương

c và C sao cho
f (x) ≥ cg(x),

với mọi x ≥ C.

Nếu f vừa là O(g(x)) vừa là Ω(g(x)) thì ta nói rằng f (x) = Θ(g(x)) hoặc f (x)

g(x).

Định nghĩa 2.6.8. Một hàm f (x) được gọi là tăng theo hàm mũ nếu có các số dương
α, β sao cho


f (x)

xβ .

Một hàm f (x) được gọi là tăng theo hàm đa thức nếu có các số dương α, β sao cho

(ln x)α

f (x)

ln(x)β .

Một hàm f (x) được gọi là dưới mũ nếu có các số dương α, β sao cho
(ln x)α

f (x)

xβ .



Chú ý 2.6.9. Với L(x) = e ln x. ln ln x thì (ln x)α L(x)) xβ do đó L(x) là hàm dưới
mũ. Bảng sau cho ta ước tính L(x) tăng nhanh như thế nào khi x tăng.
x
2100
2250
2500
21000
22000

ln L(x)
17, 171
29, 888
45, 020
67, 335
100, 145


L(x)
224,73
243,12
264,95
297,14
2114,48

Trong hệ 2.7, ta cần số ẩn (số các ci là các số B -mịn) không ít hơn số phương trình
(số các số nguyên tố nhỏ hơn B ), tức là cần ít nhất π(B) số B -mịn nằm giữa 1 và N .
Ta sẽ xét trường hợp B = L(N )c và đưa ra một vài giá trị thích hợp của c.
25


×