Bài Toán Logarit Rời Rạc Và Diffie-Hellman: Ban Cơ Yếu Chính Phủ Viện Khoa Học-Công Nghệ Mật Mã

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 55

BAN CƠ YẾU CHÍNH PHỦ

VIỆN KHOA HỌC-CÔNG NGHỆ MẬT MÃ

PHẠM HOÀNG MINH

BÀI TOÁN LOGARIT RỜI RẠC VÀ


DIFFIE-HELLMAN

Hà Nội - 2020
BAN CƠ YẾU CHÍNH PHỦ
VIỆN KHOA HỌC CÔNG NGHỆ MẬT MÃ

PHẠM HOÀNG MINH

BÀI TOÁN LOGARIT RỜI RẠC VÀ


DIFFIE-HELLMAN

Hà Nội - 2020
Mục lục

0.1 Một số định lý cơ bản trong Lý thuyết số . . . . . . . . . . . . . . . . . 3


0.2 Bài toán logarit rời rạc . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.3 Trao đổi khóa Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . 5
0.4 Hệ mã hóa công khai ElGamal . . . . . . . . . . . . . . . . . . . . . . 7
0.5 Tổng quan về lý thuyết nhóm . . . . . . . . . . . . . . . . . . . . . . . 11
0.6 Bài toán logarit rời rạc khó đến đâu? . . . . . . . . . . . . . . . . . . . 14
0.7 Thuật toán va chạm cho bài toán logarit rời rạc . . . . . . . . . . . . . 18
0.8 Định lý thặng dư Trung Hoa . . . . . . . . . . . . . . . . . . . . . . . . 20
0.8.1 Giải các phương trình đồng dư với các modulo tổng hợp . . . 23
0.9 Thuật toán Pohlig-Hellman . . . . . . . . . . . . . . . . . . . . . . . . 24
0.10 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
0.10.1 Bài tập 2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
0.10.2 Bài tập 2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
0.10.3 Bài tập 2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
0.10.4 Bài tập 2.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
0.10.5 Bài tập 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
0.10.6 Bài tập 2.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
0.10.7 Bài tập 2.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
0.10.8 Bài tập 2.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
0.10.9 Bài tập 2.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
0.10.10 Bài tập 2.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
0.10.11 Bài tập 2.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
0.10.12 Bài tập 2.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
0.10.13 Bài tập 2.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
0.10.14 Bài tập 2.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
0.10.15 Bài tập 2.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

1
MỤC LỤC MỤC LỤC

0.10.16 Bài tập 2.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45


0.10.17 Bài tập 2.19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
0.10.18 Bài tập 2.21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
0.10.19 Bài tập 2.23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
0.10.20 Bài tập 2.26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
0.10.21 Bài tập 2.28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

2
0.1. MỘT SỐ ĐỊNH LÝ CƠ BẢN TRONG LÝ THUYẾT SỐ MỤC LỤC

0.1 Một số định lý cơ bản trong Lý thuyết số

Dưới đây là một số mệnh đề, định lý cần thiết sẽ sử dụng ở phần sau của báo cáo.
Định lý 0.1.1 (Thuật toán Euclid mở rộng). Cho a và b là các số nguyên dương. Khi đó
phương trình
au + bv = gcd( a, b)
luôn có ít nhất một nghiệm nguyên u và v.
Nếu (u0 , v0 ) là một nghiệm bất kỳ, thì khi đó mọi nghiệm đều có dạng
b.k a.k
u = u0 + và v = v0 − với k ∈ Z.
gcd( a, b) gcd( a, b)
Định lý 0.1.2 (Định lý nhỏ Fermat). Cho p là một số nguyên tố và a là một số nguyên bất
kỳ. Khi đó (
1 ( mod p) nếu p - a,
a p −1 =
0 ( mod p) nếu p| a.
Định lý 0.1.3 (Định lý nghiệm nguyên thủy). Cho p là một số nguyên tố. Khi đó, tồn tại
một phần tử g ∈ F∗p mà các lũy thừa của nó là các phần tử của F∗p , nghĩa là
F∗p = {1, g, g2 , . . . , g p−2 }.
Các phần tử với tính chất này được gọi là các nghiệm nguyên thủy của F∗p hoặc các
phần tử sinh của F∗p . Chúng đều là các phần tử trong F∗p và có cấp p − 1.

0.2 Bài toán logarit rời rạc

Bài toán logarit rời rạc là một bài toán toán học nổi lên trong quá trình mã hóa
của mật mã học, bao gồm phiên bản mod p được mô tả trong phần này và phiên
bản đường cong elliptic. Phép xây dựng khóa công khai được đề xuất bởi Diffie-
Hellman, nó dựa trên bài toán logarit rời rạc trong một nhóm hữu hạn F p . Ta nhắc
lại rằng F p là một trường với số phần tử là số nguyên tố. Để thuận tiện, ta sẽ sử
dụng ký hiệu F p thay cho Z/pZ cho trường này, và ta sử dụng ký hiệu bằng nhau
cho các phần tử của F p và ký hiệu đồng dư cho các phần tử của Z/pZ.
Cho p là một số nguyên tố (đủ lớn). Định lý 0.1.3 cho ta biết rằng tồn tại một phần
tử nguyên thủy g: Mọi phần tử khác không của F p là một lũy thừa của g. Cụ thể,
g p−1 = 1 theo Định lý nhỏ Fermat (Định lý 0.1.2), và không có lũy thừa nào nhỏ
hơn của g bằng 1. Một cách tương đương, các phần tử
1, g, g2 , . . . , g p−2 ∈ F∗p
3
0.2. BÀI TOÁN LOGARIT RỜI RẠC MỤC LỤC

là toàn bộ phần tử trong F∗p .


Định nghĩa 0.2.1. Cho g là một nghiệm nguyên thủy của F p và h là một phần tử
khác không của F p . Bài toán logarit rời rạc (LRR) là bài toán tìm một lũy thừa x sao
cho
g x ≡ h ( mod p).
Số x được gọi là logarit rời rạc của h cơ số g và được ký hiệu là logg (h).
Nhận xét 0.2.2. Một khái niệm lâu đời hơn cho logarit rời rạc là chỉ số, được ký hiệu
bởi indg (h). Khái niệm chỉ số vẫn thường được dùng trong lý thuyết số. Nó cũng
vẫn thuận tiện nếu có sự nhầm lẫn giữa các logarit thông thường và các logarit rời
rạc. Ví dụ, đại lượng log2 thường được sử dụng trong báo cáo này.
Nhận xét 0.2.3. Bài toán logarit rời rạc là bài toán được biết đến rộng rãi, ta tìm một
số lũy thừa nguyên x sao cho g x = h. Tuy nhiên, nếu có một nghiệm, thì sẽ tồn tại
vô số nghiệm, bởi theo Định lý nhỏ Fermat (Định lý 0.1.2) thì g p−1 ≡ 1( mod p). Do
đó nếu x là một nghiệm của bài toán g x = h thì x + k( p − 1) cũng là một nghiệm
với mọi giá trị của k, bởi
g x+k( p−1) = g x .( g p−1 )k ≡ h.1k ≡ h( mod p).
Do đó logg (h) được định nghĩa duy nhất sai khác một phép cộng trừ một số bội lần
của ( p − 1). Nói cách khác, logg (h) được định nghĩa modulo p − 1. Không khó để
xác thực rằng logg cho ta một hàm được định nghĩa tốt
Z
logg : F∗p → . (0.2.1)
( p − 1)Z
Thật vậy, giả sử rằng
logg h = a và logg h = b,
khi đó, ta suy ra g a = gb (= h). Do đó g a−b = e với e là phần tử trung hòa của nhóm.
Suy ra | g| | a − b.
Tuy nhiên, ta lại có | g| = p − 1, do đó ( p − 1)|( a − b). Vậy
a − b ≡ 0 ( mod p − 1) hay a ≡ b ( mod p − 1).
Vậy ánh xạ trên được xác định duy nhất trong Z/( p − 1)Z. Trong một số trường
hợp, do tính rời rạc, ta nói đến logarit rời rạc là một số nguyên x nằm giữa 0 và p − 2
thỏa mãn đẳng thức đồng dư g x ≡ h( mod p).
Nhận xét 0.2.4. Ta cũng không khó khăn để chứng minh
logg ( ab) = logg ( a) + logg (b) với mọi a, b ∈ F∗p .
4
0.3. TRAO ĐỔI KHÓA DIFFIE-HELLMAN MỤC LỤC

Do đó ta gọi logg ( a) là logarit cũng hợp lý, do nó chuyển phép nhân thành phép
cộng theo cùng một cách như hàm logarit thông thường. Trong thuật ngữ toán học,
logarit rời rạc logg là một đẳng cấu nhóm từ F∗p vào Z/( p − 1)Z.

Nhận xét 0.2.5. Khẳng định của ta về bài toán logarit rời rạc bao gồm giả thiết rằng
g là một phần tử nguyên thủy modulo p, những điều này không thật sự cần thiết.
Về mặt tổng quát, với mỗi g ∈ F∗p và mỗi h ∈ F∗p , bài toán logarit rời rạc là bài toán
xác định một lũy thừa x thỏa mãn g x ≡ h( mod p), nếu x tồn tại.
Tổng quát hơn, thay vì lấy các phần tử khác không của một trường hữu hạn F p
và nhân chúng với nhau để tạo nên lũy thừa, ta có thể lấy các phần tử của nhóm
bất kỳ và sử dụng phép toán nhóm thay vì phép nhân. Điều này dẫn đến dạng tổng
quát nhất của bài toán logarit rời rạc.
Định nghĩa 0.2.6. Cho G là một nhóm và phép toán nhóm được ký hiệu bởi ký hiệu
?. Bài toán logarit rời rạc cho G là ta bài toán với mỗi hai phần tử g và h cho trước
trong G, ta tìm một số nguyên x thỏa mãn

g ? g ? · · · ? g = h.
| {z }
x lần

0.3 Trao đổi khóa Diffie-Hellman

Thuật toán trao đổi khóa Diffie-Hellman giải quyết khó khăn sau. Alice và Bob
muốn chia sẻ một khóa bí mật chung để sử dụng trong mã hóa đối xứng, nhưng
phương pháp liên lạc này không an toàn. Mọi thông tin được trao đổi đều bị lộ
cho một kẻ tấn công Eve. Vậy làm thế nào để Alice và Bob có thể chia sẻ một khóa
chung mà không bị lộ cho Eve? Thoạt nhìn, ta thấy Alice và Bob đang đối diện với
một nhiệm vụ bất khả thi. Tuy nhiên, Diffie và Hellman thấy tính khó của bài toán
logarit rời rạc cho F∗p cho ta một lời giải khả thi.
Bước đầu tiên là Alice và Bob thống nhất một số nguyên tố lớn p và một số nguyên
khác không g lấy modulo p. Alice và Bob cho p và g là kiến thức công khai; ví dụ,
họ có thể đăng các giá trị đó lên các trang web, do đó Eve cũng biết đến chúng. Với
nhiều lý do sẽ được bàn luận sau, cách tốt nhất là ta chọn g là phần tử trong F∗p có
cấp nguyên tố cao nhất.
Bước tiếp theo Alice chọn một số nguyên bí mật a mà không để lộ cho bất kì ai,
cùng lúc đó Bob chọn một số nguyên b và cũng giữ bí mật. Bob và Alice sử dụng

5
0.3. TRAO ĐỔI KHÓA DIFFIE-HELLMAN MỤC LỤC

các số nguyên bí mật đó để tính các giá trị


A ≡ g a ( mod p) và B ≡ gb ( mod p) .
| {z } | {z }
Alice tính Bob tính

Tiếp theo, họ sẽ trao đổi các giá trị được tính, Alice gửi A cho Bob và Bob gửi B cho
Alice. Ta để ý rằng Eve thấy được các giá trị A và B, do chúng bị gửi qua kênh liên
lạc không an toàn.
Cuối cùng, Bob và Alice một lần nữa sử dụng các số nguyên bí mật của họ để
tính
A0 ≡ B a ( mod p) và B0 ≡ Ab ( mod p) .
| {z } | {z }
Alice tính Bob tính
Với các giá trị họ đã tính, A0 và B0 thực ra là bằng nhau do
A0 ≡ B a ≡ ( gb ) a ≡ g ab ≡ ( g a )b ≡ Ab ≡ B0 ( mod p).
Giá trị chung này là khóa được trao đổi.
Ví dụ 0.3.1. Alice và Bob thống nhất sử dụng số nguyên tố p = 491 và nghiệm
nguyên thủy g = 627. Alice chọn khóa bí mật a = 347 và tính A = 390 ≡ 627347 ( mod
941). Tương tự, Bob chọn khóa bí mật b = 781 và tính B = 691 ≡ 627781 ( mod 941).
Alice gửi Bob số 390 và Bob gửi Alice số 691. Cả hai quá trình trao đổi đều bị thực
hiện trên một kênh không an toàn, do đó cả A = 390 và B = 691 đều bị coi là kiến
thức công khai. Các số a = 347 và b = 781 không bị trao đổi và do đó được giữ bí
mật. Khi đó Alice và Bob đều tính được số
470 ≡ 627347.781 ≡ Ab ≡ B a ( mod 941),
do đó 470 là bí mật chung.
Giả sử Eve chứng kiến toàn bộ quá trình trao đổi. Cô ấy có thể khôi phục bí mật
chung của Alice và Bob nếu cô ấy có thể giải một trong hai biểu thức đồng dư
627 ≡ 390 ( mod 941) hoặc 627 ≡ 691 ( mod 941),
khi đó cô ấy sẽ biết một trong hai lũy thừa bí mật. Đến khi bị lộ, đây là cách duy
nhất cho Eve tìm được giá trị bí mật chung mà không có sự trợ giúp của Alice hoặc
Bob.
Tất nhiên ví dụ trên sử dụng các số rất nhỏ để cho Alice và Bob sự an toàn thực
tế, do nó cần rất ít thời gian cho máy tính của Eve kiểm tra mọi lũy thừa có thể của
627 modulo 941. Hướng dẫn trên đề xuất rằng Alice và Bob chọn một số nguyên tố
xấp xỉ 1000 bit (nghĩa là p ≈ 21000 ) và một phần tử g có cấp nguyên tố và xấp xỉ p/2.
Khi đó, Eve phải đối diện với một nhiệm vụ thật sự khó khăn.
6
0.4. HỆ MÃ HÓA CÔNG KHAI ELGAMAL MỤC LỤC

Tổng quát, khó khăn của Eve là như sau. Cô ấy biết các giá trị A và B, do đó biết
các giá trị g a và gb . Cô ấy cũng biết giá trị g và p, do đó nếu có thể giải bài toán
logarit rời rạc, cố ấy có thể tìm a và b, sau đó dễ dàng tính được bí mật chung của
Alice và Bob là g ab . Ta thấy rằng Alice và Bob được cung cấp sự an toàn khi Eve
không thể giải bài toán logarit rời rạc, nhưng điều này không hẳn là đúng. Dĩ nhiên
một phương pháp để tìm giá trị chung của Alice và Bob là giải bài toán logarit rời
rạc, nhưng đó không phải là bài toán thật sự mà Eve cần giải. Tính bảo mật của
khóa chung của Alice và Bob nằm trong tính khó của bài toán được coi là có tiềm
năng dễ giải hơn dưới đây.
Định nghĩa 0.3.2. Cho p là một số nguyên tố và g là một số nguyên. Bài toán Diffie-
Hellman là bài toán tính giá trị của g ab ( mod p) khi biết các giá trị g a ( mod p) và
gb ( mod p).

Dễ thấy rằng bài toán trên không khó hơn bài toán logarit rời rạc. Nếu Eve có thể
giải bài toán logarit rời rạc, thì cô ấy có thể tính các lũy thừa bí mật a và b của Alice
và Bob bằng các lấy các giá trị A = g a và B = gb , và khi dó cô ấy dễ dàng tính được
khóa chung g ab . (Thật ra, Eve chỉ cần tính một trong hai giá trị a hoặc b.) Tuy nhiên
điều ngược lại không hẳn đã chính xác. Giả sử rằng Eve có một thuật toán giải bài
toán Diffie-Hellman một cách hiệu quả, thì liệu cô ấy có thể giải bài toán logarit rời
rạc hiệu quả không? Câu trả lời là điều này chưa được biết chắc.

0.4 Hệ mã hóa công khai ElGamal

Mặc dù thuật toán trao đổi khóa Diffie-Hellman cung cấp một phương pháp chia
sẻ công khai một khóa bí mật ngẫu nhiên, nó không đạt được điều kiện để trở thành
một hệ mã khóa công khai, không chỉ là một xâu bit ngẫu nhiên. Hệ mã hóa công
khai đầu tiên là hệ RSA của Rivest, Shamir, và Adleman được công bố năm 1978.
RSA đã và vẫn đang là một phát hiện quan trọng. Tuy nhiên, mặc dù về mặt lịch sử
thì RSA xuất hiện trước, tuy nhiên sự phát triển tự nhiên nhất của một hệ mã hóa
công khai trong báo cáo của Diffie-Hellman là một hệ thống được mô tả bởi Taher
ElGamal năm 1985. Thuật toán mã hóa công khai ElGamal được dựa trên bài toán
logarit rời rạc và liên hệ chặt chẽ với trao đổi khóa Diffie-Hellman ở phần trước.
Trong phần này ta mô tả một phiên bản của hệ mã hóa công khai ElGamal mà được
dựa trên bài toán logarit rời rạc cho F∗p , nhưng phép xây dựng hoạt động một cách
khá tổng quát khi bài toán logarit rời rạc được áp dụng trên mỗi nhóm.
Hệ mã hóa công khai ElGamal là ví dụ đầu tiên về một hệ mã hóa công khai, sau
đó ta sẽ tiếp tục một cách từ từ và đưa vào mọi chi tiết. Alice bắt đầu bằng cách

7
0.4. HỆ MÃ HÓA CÔNG KHAI ELGAMAL MỤC LỤC

công khai thông tin về một khóa công khai và một thuật toán. Khóa công khai đơn
giản là một số, và thuật toán là phương pháp mà Bob sẽ dùng để mã hóa thông điệp
của anh ấy bằng cách sử dụng khóa công khai của Alice. Alice không công khai một
số khác là khóa bí mật của cô ấy. Khóa bí mật cho phép Alice, và chỉ cô ấy giải mã
được thông điệp mà đã được mã hóa bởi khóa công khai của cô ấy.
Mặc dù điều này nghe vẫn chưa rõ ràng và áp dụng cho mọi hệ mã hóa công
khai. Với hệ mã hóa ElGamal, Alice cần một số nguyên tố lớn p để bài toán logarit
rời rạc trong F∗p là khó, và cũng cần một phần tử g lấy modulo p có cấp nguyên tố
lớn. Cô ấy có thể chọn số p hoặc g, hoặc được chọn trước bởi một bên thứ ba đáng
tin cậy như tổ chức chính phủ.
Alice chọn một số bí mật a, số này được coi là khóa bí mật của cô ấy và tính đại
lượng
A ≡ g a ( mod p).
Để ý rằng bước này tương tự như trao đổi khóa Diffie-Hellman. Alice cho mọi người
biết khóa công khai A và giữ lại khóa bí mật a.
Bây giờ, giả sử rằng Bob muốn mã hóa một thông điệp sử dụng khóa công khai
A của Alice. Ta sẽ giả sử rằng thông điệp của Bob là m, là một số nguyên nằm giữa
2 và p. Để mã hóa m, đầu tiên Bob chọn ngẫu nhiên một số k khác và lấy modulo p.
Bob sử dụng k để mã hóa duy nhất một thông điệp, và sau đó loại bỏ nó. Số k được
gọi là một khóa tức thời, do nó chỉ dùng duy nhất một lần với mục đích là mã hóa
một thông điệp.
Bob lấy bản thông điệp chưa mã hóa m, khóa tức thời ngẫu nhiên k, và khóa công
khai A của Alice và sử dụng chúng để tính hai đại lượng
c1 ≡ gk ( mod p) và c2 ≡ mAk ( mod p).

(Chú ý rằng g và p là các tham số công khai, do đó Bob cũng biết các giá trị của
chúng.) Bản thông điệp m được mã hóa của Bob là cặp số (c1 , c2 ), sẽ được gửi cho
Alice.
Vậy làm thế nào Alice có thể giải mã bản thông điệp được mã hóa (c1 , c2 ) của
Bob? Do Alice biết a, do đó cô ấy có thể tính được đại lượng

x ≡ c1a ( mod p),


và từ đó cũng tính được x −1 ( mod p). Alice sau đó nhân c2 với x −1 , và kết quả thu

8
0.4. HỆ MÃ HÓA CÔNG KHAI ELGAMAL MỤC LỤC

được là bản thông điệp m gốc chưa bị mã hóa. Để biết lý do, ta tính
x −1 .c2 ≡ (c1a )−1 .c2 ( mod p), do x ≡ c1a ( mod p),
≡ ( g ak )−1 .(mAk ) ( mod p), do c1 ≡ gk , c2 ≡ mAk ( mod p),
≡ ( g ak )−1 .(m( g a )k ) ( mod p), do A ≡ g a ( mod p),
≡m ( mod p), do số hạng g ak bị triệt tiêu.

Vậy Eve cần làm gì để có thể giải mã thông điệp? Eve biết tham số công khai p và
g, và cô ấy cũng biết giá trị A ≡ g a ( mod p), do khóa công khai A của Alice là kiến
thức công khai. Nếu Eve có thể giải bài toán logarit rời rạc, cô ấy có thể tìm được a
và giải mã thông điệp. Ngược lại, Eve sẽ rất khó để có thể tìm được bản thông điệp
gốc, mặc dù vẫn có khó khăn, ta sẽ nói về các khó khăn đó sau một vài ví dụ nhỏ.
Ví dụ 0.4.1. Alice dùng số nguyên tố p = 467 và số nguyên thủy g = 2. Cô ấy chọn
a = 153 là khóa bí mật và tính khóa công khai
A ≡ g a ≡ 2153 ≡ 224 ( mod 467).
Bob chọn thông điệp m = 331. Sau đó chọn tiếp một khóa ngắn hạn ngẫu nhiên là
k = 197, và tính các đại lượng
c1 ≡ 2197 ≡ 87 ( mod 467) và c2 ≡ 331.224197 ≡ 57 ( mod 467).
Cặp số (c1 , c2 ) = (87, 57) là bản mã Bob sẽ gửi cho Alice.
Alice biết a = 153, cô ấy sẽ tính
x ≡ c1a ≡ 87153 ≡ 367 ( mod 467), và khi đó x −1 ≡ 14 ( mod 467).
Cuối cùng, Alice tính
c2 x −1 ≡ 57.14 ≡ 331 ( mod 467)
và đây chính là thông điệp m.
Nhận xét 0.4.2. Trong hệ mã hóa ElGamal, thông điệp là một số nguyên m nằm giữa
2 và p − 1, trong khi bản mã chứa hai số nguyên c1 , c2 cũng nằm trong khoảng đó
do c1 và c2 đều được lấy modulo p − 1 sau khi tính.
Do đó, về mặt tổng quát ta mất gấp đôi số bit để viết bản mã hóa so với ta viết
bản gốc. Ta nói rằng ElGamal có một mở rộng thông điệp 2 đến 1.

Một câu hỏi quan trọng được đưa ra là khi Eve tấn công vào hệ ElGamal thì có
khó bằng giải bài toán Diffie-Hellman không? Tuy nhiên, khi ta giới thiệu cách mã
hóa, liệu ta đã vô tình mở một cửa sau để khiến thông điệp dễ giải hơn và thậm chí
9
0.4. HỆ MÃ HÓA CÔNG KHAI ELGAMAL MỤC LỤC

không cần giải bài toán Diffie-Hellman? Một trong các mục tiêu của mật mã hiện
đại là xác thực một bài toán khó đứng đằng sau một hệ mã hóa như bài toán Diffie-
Hellman và chứng minh rằng một phép xây dựng mật mã như ElGamal ít nhất khó
bằng bài toán đã cho
Trong trường hợp này, ta muốn chứng minh rằng bất kì ai có thể giải mã một
bản mã bất kỳ được xây dựng bởi hệ mã hóa ElGamal, cũng phải giải được bài toán
Diffie-Hellman. Cụ thể ta muốn chứng minh điều sau đây:
Mệnh đề 0.4.3. Cố định một số nguyên tố p và một phần tử g được sử dụng trong hệ mã
hóa ElGamal. Giả sử Eve có thể truy cập vào một oracle giải mã một bản mã của hệ mã hóa
ElGamal. Khi đó, cô ấy có thể dùng oracle đó để giải bài toán Diffie-Hellman.

Chứng minh. Thay vì đưa ra một chứng minh mang tính hình thức, ta sẽ đưa ra một
chứng minh dễ hiểu hơn và giải thích cách tiếp cận bài toán bằng cách sử dụng
một oracle ElGamal để giải bài toán Diffie-Hellman. Nhắc lại trong bài toán Diffie-
Hellman, Eve biết các giá trị
A ≡ g a ( mod p) và B ≡ gb ( mod p),

và bài toán là tính giá trị của g ab ( mod p). Cần ghi nhớ rằng Eve biết cả hai giá trị A
và B, tuy nhiên lại không biết các giá trị a và b.
Giả sử Eve có thể tham vấn một oracle ElGamal. Điều này nghĩa là Eve có thể gửi
cho oracle một số nguyên tố p, một phần tử cơ sở g, một khóa công khai A, một bản
mã hóa (c1 , c2 ). Khi đó, oracle sẽ trả lại đại lượng
(c1a )−1 .c2 ( mod p).
Nếu Eve muốn giải được bài toán Diffie-Hellman, thì giá trị của c1 và c2 cần được
chọn là bao nhiêu? Để ý ta thấy rằng c1 = B = gb và c2 = 1 là sự lựa chọn tốt, do
với đầu vào như trên, thì oracle sẽ trả lại giá trị
h i −1
a −1
(c1 ) .c2 = ( g )b a
.1 = ( g ab )−1 ( mod p),

và khi đó Eve chỉ cần lấy nghịch đảo modulo p để thu được g ab ( mod p), và từ đó
giải được bài toán Diffie-Hellman.
Tuy nhiên, oracle có thể đủ thông minh và biết rằng nó sẽ không bao giờ giải mã
thông điệp nếu c2 = 1. Eve vẫn có thể đánh lừa oracle bằng cách gửi một bản mã
ngẫu nhiên như sau. Eve chọn một giá trị c2 bất kì và cho oracle biết khóa công khai
là A và bản mã là ( B, c2 ). Khi đó, oracle sẽ trả lại bản thông điệp gốc m thỏa mãn

m ≡ (c1a )−1 .c2 ≡ ( B a )−1 .c2 ≡ ( g ab )−1 .c2 ( mod p).

10
0.5. TỔNG QUAN VỀ LÝ THUYẾT NHÓM MỤC LỤC

Sau khi oracle cho Eve biết giá trị của m, ta tính tiếp
g ab ≡ c2 .m−1 ( mod p)
để tìm giá trị của g ab ( mod p). Mặc dù, với sự trợ giúp của oracle, Eve đã tính được
g ab ( mod p), Eve vẫn không biết bất kì giá trị nào của a hoặc b, do đó Eve chỉ giải
được bài toán Diffie-Hellman, chứ không phải bài toán logarit rời rạc.
Nhận xét 0.4.4. Một tấn công mà trong đó Eve truy cập vào một oracle giải mã một
bản mã bất kỳ đã biết được gọi là một tấn công chọn bản mã. Mệnh đề trên chỉ ra rằng
hệ ElGamal là an toàn đối với tấn công chọn bản mã. Chính xác hơn, nó bảo mật
nếu bài toán Diffie-Hellman được giả sử là khó.

0.5 Tổng quan về lý thuyết nhóm

Trong phần này, ta giới thiệu ngắn gọn một số khái niệm giúp ta hiểu hơn về
logarit rời rạc.
Ở trên, ta đã nói một chút về lũy thừa của các phần tử trong F∗p . Do lũy thừa chỉ
đơn giản là một phép nhân liên tiếp, đây là một điểm tốt để có thể bắt đầu. Ta muốn
nhấn mạnh một số tính chất quan trọng của phép nhân trong F∗p và chỉ ra những
tính chất này được sử dụng khá nhiều.
Các tính chất gồm có:

• Tồn tại phần tử 1 ∈ F∗p thỏa mãn 1 · a = a với mọi a ∈ F∗p .


• Mọi phần tử a ∈ F∗p có một phần tử nghịch đảo a−1 ∈ F∗p thỏa mãn

a · a−1 = a−1 · a = 1.

• Phép nhân có tính kết hợp:


a · (b · c) = ( a · b) · c
với mọi a, b, c ∈ F∗p .
• Phép nhân có tính giao hoán:
a·b = b·a
với mọi a, b ∈ F∗p .

Giả sử thay vì phép nhân trong F∗p , ta thay bằng phép cộng trong F p . Ta cũng sử
dụng ký hiệu 0 thay cho 1 và − a thay cho ký hiệu a−1 . Khi đó, các tính chất vừa nêu
vẫn đúng.
11
0.5. TỔNG QUAN VỀ LÝ THUYẾT NHÓM MỤC LỤC

Tập hợp và các phép toán thể hiện tương tự như với phép nhân hoặc phép cộng
và được biết đến rộng rãi. Do đó, ta có thể đưa ra một khái niệm tổng quát về nhóm.
Định nghĩa 0.5.1. Một nhóm gồm một tập hợp G, và một phép toán, được ký hiệu là
?, bằng cách kết hợp hai phần tử a, b ∈ G để thu được phần tử a ? b ∈ G. Phép toán
? cần có các tính chất sau đây:
(a) Quy tắc phần tử trung hòa. Tồn tại một phần tử e ∈ G sao cho
e?a = a?e = a
với mọi a ∈ G.
(b) Quy tắc lấy nghịch đảo. Với mỗi a ∈ G, tồn tại (duy nhất) một phần tử a−1 ∈ G
sao cho
a ? a−1 = a−1 ? a = e.
(c) Quy tắc kết hợp. Với mọi a, b, ∈ G, ta có
a ? (b ? c) = ( a ? b) ? c.

Hơn nữa, nếu nhóm phép toán thỏa mãn thêm điều kiện
a?b = b?a
với mọi a, b, ∈ G, thì khi đó nhóm được gọi là nhóm giao hoán hoặc nhóm abel.
Nếu G có hữu hạn phần tử, ta nói G là một nhóm hữu hạn. Cấp của G là số phần
tử trong G, được ký hiệu là | G | hoặc #G.
Ví dụ 0.5.2. (i) Cho G = F∗p và ? là phép nhân modulo thông thường. Khi đó, phần
tử đơn vị là e = 1. Khi đó G là một nhóm hữu hạn cấp p − 1.
(ii) G = Z/nZ, và ? là phép cộng modulo. Khi đó, phần tử đơn vị là e = 0 và
nghịch đảo của a là − a. G là một nhóm hữu hạn cấp n.
(iii) Một ví dụ về một nhóm không giao hoán là
  
a b
G= : a, b, c, d ∈ R và ad − bc 6= 0
c d
 
1 0
với phép nhân ma trận đã biết. Phần tử đơn vị là e = và phép nghịch
0 1
đảo được cho bởi công thức quen thuộc
d −b
 
  −1
a b  − bc ad − bc 
=  ad− c a .
c d
ad − bc ad − bc
12
0.5. TỔNG QUAN VỀ LÝ THUYẾT NHÓM MỤC LỤC

Chú ý G không giao hoán, lấy ví dụ


     
1 1 1 1 1 1 1 1
6=
0 1 1 0 1 0 0 1

Cho g là một phần tử của nhóm G và x là một số nguyên dương. Khi đó g x có


nghĩa là ta áp dụng phép toán nhóm x lần cho phần tử g,
gx = g ? · · · ? g .
| {z }
x lần

Ví dụ, lũy thừa g x trong nhóm F∗p có nghĩa thông thường, nhân g với chính nó x
lần. Nhưng "lũy thừa"g x trong nhóm Z/nZ nghĩa là lấy g cộng với chính nó x lần.
Thông thường, nếu cộng như vậy ta sẽ viết x · g. Ta cũng có thể đưa ra định nghĩa
về g x khi x không phải số dương. Do đó, nếu x là số nguyên âm, ta định nghĩa

g x = ( g −1 ) | x | .
Với x = 0, ta đặt g0 = e, là phần tử trung hòa.
Định nghĩa 0.5.3. Cho G là một nhóm và cho a ∈ G là một phần tử trong nhóm. Giả
sử tồn tại một số nguyên dương d với tính chất ad = e. Số d nhỏ nhất thỏa mãn tính
chất trên được gọi là cấp của a. Nếu không tồn tại số d, ta nói a có cấp vô hạn.

TIếp theo, ta đưa ra hai mệnh đề minh họa các tính chất quan trọng của cấp của
một phần tử trong nhóm.
Mệnh đề 0.5.4. Cho G là một nhóm hữu hạn. Khi đó, mọi phần tử của G đều có cấp hữu
hạn. Hơn nữa, nếu a ∈ G có cấp d và ak = e thì d|k.
Mệnh đề 0.5.5 (Định lý Lagrange.). Cho G là một nhóm hữu hạn và cho a ∈ G. Khi đó,
cấp của a chia hết cấp của G.
Một cách chính xác hơn, cho n = | G | là cấp của G và d là cấp của a. Khi đó
an = e và d|n.

Chứng minh. Ta chỉ chứng minh với trường hợp G là một nhóm giao hoán.
Do G là hữu hạn, ta có thể liệt kê các phần tử của nó
G = { g1 , . . . , g n } .
Nhân mỗi phần tử của G với a và ta thu được tập hợp mới là Sa

S a = { a ? g1 , . . . , a ? g n } .

13
0.6. BÀI TOÁN LOGARIT RỜI RẠC KHÓ ĐẾN ĐÂU? MỤC LỤC

Ta thấy rằng các phần tử của Sa là phân biệt. Thật vậy, giả sử rằng a ? gi = a ? g j .
Khi đó, ta nhân về bên trái của đẳng thức với a−1 ta suy ra gi = g j . Do đó, Sa chứa
n phần tử phân biệt và số lượng phần tử bằng đúng số phần tử của G. Vậy G = Sa .
Khi đó, ta nhân tất cả các phần tử của Sa với nhau và nhân tất cả các phần tử của
G với nhau. Do đó

( a ? g1 ) ? · · · ? ( a ? g n ) = g1 ? · · · ? g n .
Do tính giao hoán, ta có thể sắp xếp lại các thừa số trong phép nhân ở vế trái và thu
được
a n ? g1 · · · ? g n = g1 · · · ? g n .
Tiếp theo, nhân về bên phải của hai vế phần tử ( g1 ? gn )−1 suy ra an = e.

0.6 Bài toán logarit rời rạc khó đến đâu?

Cho một nhóm G và hai phần tử g, h ∈ G, bài toán logarit rời rạc yêu cầu tìm một
lũy thừa x sao cho g x = h. Vậy khi ta nói về tính khó của bài toán này nghĩa là gì?
Làm sao có thể định lượng được tính "khó"? Một phép đo tính khó tự nhiên nhất là
xấp xỉ số lượng phép toán cần thiết để một người hoặc một máy tính giải bài toán
trên sử dụng thuật toán hiệu quả nhất được biết đến hiện nay. Ví dụ, giả sử ta đếm
quá trình tính toán g x như một phép toán. Khi đó bằng cách tiếp cận "vét cạn"để
giải bài toán logarit rời rạc ta sẽ tính g x với mỗi x = 1, 2, 3, . . . và so sánh giá trị đó
với h. Nếu g có cấp n, thì thuật toán này đảm bảo tìm được nghiệm trong nhiều nhất
n phép toán, nhưng nếu n lớn, ví dụ n > 280 , khi đó thuật toán trên là không thực
tế bằng cách tính lũy thừa với những công cụ hiện nay.
Trong thực tế, trừ khi ta có thể xây dựng một chiếc máy đặc biệt chỉ với mục
đích trên, quá trình tính g x sẽ không được đếm như một thuật toán cơ bản. Sử
dụng phương pháp lũy thừa nhanh, ta chỉ mất một bội nhỏ của log2 ( x ) phép nhân
modulo để tính g x . Giả sử n và x là các số có độ lớn k-bit, và do đó chúng xấp xỉ 2k .
Khi đó hướng tiếp cận theo phương pháp "vét cạn"sẽ cần đến k.2k phép nhân. Thật
vậy, do bậc của g là n ≈ 2k , và ta cần log2 ( x ) phép nhân modulo để tính được g x ,
nên số phép toán cần thiết là

log2 ( x ).n ≈ log2 (2k ).2k = k.2k bước.


Tuy nhiên, nếu ta đang làm việc trong nhóm F∗p và nếu ta coi phép nhân modulo
như một phép toán cơ bản, khi đó phép nhân modulo của hai số k-bit sẽ cần (xấp
xỉ) 2k phép toán cơ bản, do đó nó sẽ giải bài toán logarit rời rạc bằng thuật toán "vét

14
0.6. BÀI TOÁN LOGARIT RỜI RẠC KHÓ ĐẾN ĐÂU? MỤC LỤC

cạn"sẽ cần một bội nhỏ của


k2 log(2k ).2k = k3 .2k
các phép toán cơ bản.
Tuy nhiên, cách nói "bội nhỏ"của 2k hoặc k.2k hoặc k2 .2k vẫn chưa chính xác lắm.
Điều này xảy ra khi ta muốn biết một phép tính là thực hiện được, các số như 3.2k và
10.2k và 100.2k có thể được coi là gần như nhau nếu k đủ lớn. Tính chất quan trọng
là hệ số bội được cố định khi k tăng. Ký hiệu cấp được đề xuất để giúp điều nói ở
trên được chính xác hơn.
Định nghĩa 0.6.1. Cho f ( x ) và g( x ) là các hàm của x nhận giá trị dương. Ta nói rằng
" f là O - lớn của g"và viết
f ( x ) = O( g( x ))
nếu tồn tại số dương c và C sao cho
f ( x ) ≤ c.g( x ) với mọi x ≥ C.
Cụ thể, ta viết f ( x ) = O(1) nếu f ( x ) bị chặn với mọi x ≥ C.

Mệnh đề tiếp theo đưa ra một phương pháp có thể sử dụng để chứng minh rằng
f ( x ) = O( g( x )).
Mệnh đề 0.6.2. Nếu giới hạn
f (x)
lim
x →∞ g ( x )

tồn tại và hữu hạn, khi đó f ( x ) = O( g( x )).

Chứng minh. Gọi L là giới hạn trên. Theo định nghĩa của giới hạn, với mọi ε > 0, tồn
tại hằng số Cε sao cho

f (x)

g( x ) − L < ε với mọi x > Cε .

Cụ thể, lấy ε = 1, ta thấy rằng


f (x)
< L+1 với mọi x > C1 .
g( x )
Do đó, theo định nghĩa, f ( x ) = O( g( x )) với c = L + 1 và C = C1 .
Ví dụ 0.6.3. Ta có 2x3 − 3x2 + 7 = O( x3 ) do
2x3 − 3x2 + 7
lim = 2.
x →∞ x3
15
0.6. BÀI TOÁN LOGARIT RỜI RẠC KHÓ ĐẾN ĐÂU? MỤC LỤC

Tương tự, ta cũng có x2 = O(2x ), do


x2
lim =0
x →∞ 2x

bằng cách sử dụng quy tắc L’Hospital 2 lần liên tiếp.


f (x)
Tuy nhiên, ta chú ý rằng ta vẫn có f ( x ) = O( g( x )) kể cả khi giới hạn không
g( x )
tồn tại. Ví dụ, giới hạn
( x + 2) cos2 x
lim
x →∞ x
không tồn tại, tuy nhiên
( x + 2) cos2 x = O( x ), do ( x + 2) cos2 x ≤ x + 2 ≤ 2x với mọi x ≥ 2.

Ký hiệu cấp cũng cho ta định nghĩa một số khái niệm cơ bản được sử dụng để ký
hiệu độ phức tạp tính toán của các bài toán toán học.
Định nghĩa 0.6.4. Giả sử ta đang giải một dạng bài toán toán học nhất định với đầu
vào của bài toán là một số với mọi cỡ. Như một ví dụ, ta xét Bài toán phân tích thừa số
nguyên tố, mà đầu vào là một số N và đầu ra là một phân tích nguyên tố của N. Ta
quan tâm đến việc biết rằng mất bao lâu để giải bài toán dựa vào cỡ đầu vào. Ta đo
cỡ đầu vào bằng số bit của nó, và từ đó xác định độ lớn của bộ nhớ để ghi lại đầu
vào. Giả sử rằng có một hằng số A ≥ 0, độc lập với cỡ đầu vào, sao cho nếu đầu vào
có độ dài O(k ) bit, khi đó sẽ cần O(k A ) bước để giải bài toán. Khi đó bài toán được
gọi là giải được trong thời gian đa thức.
Nếu ta lấy A = 1, khi đó bài toán giải được trong thời gian tuyến tính, và nếu ta
lấy A = 2, khi đó bài toán là giải được trong thời gian toàn phương. Các thuật toán
thời gian đa thức được coi là các thuật toán nhanh.
Mặt khác, nếu tồn tại một hằng số c > 0 sao cho đầu vào có cỡ O(k) bit, và một
thuật toán giải bài toán trong O(eck ) bước, khi đó bài toán được gọi là giải được
trong thời gian lũy thừa. Các thuật toán thời gian lũy thừa được coi là các thuật toán
chậm.
Các thuật toán nằm giữa thời gian đa thức và thời gian lũy thừa là thời gian gần
lũy thừa. Chúng có tính chất là với mọi ε > 0, chúng giải bài toán trong Oε (eεk )
bước. Ký hiệu này nghĩa là các hằng số c và C xuất hiện trong định nghĩa của ký
hiệu cấp cho phép dựa vào ε.
Một luật bất thành văn trong mật mã học là các bài toán giải được trong thời gian
đa thức được coi là bài toán "dễ", và các bài toán cần thời gian lũy thừa được coi là
"khó". Tuy nhiên, cần nhớ rằng các mô tả trên áp dụng được khi số các thể hiện rất
16
0.6. BÀI TOÁN LOGARIT RỜI RẠC KHÓ ĐẾN ĐÂU? MỤC LỤC

lớn. Dựa vào ký hiệu O , khi đó một bài toán thời gian lũy thừa có thể dễ hơn bài
toán thời gian đa thức.
Ví dụ 0.6.5. Ta bắt đầu với bài toán logarit rời rạc g x = h trong G = F∗p . Nếu số
nguyên tố p được chọn giữa 2k và 2k+1 , thì g, h, và p yêu cầu ít nhất k bit, do đó bài
toán được phát biểu trong O(k) bit (Chú ý rằng O(k) cũng tương tự như O(log2 p)
do log2 p ≈ log2 (2k ) = k.)
Nếu ta giải bài toán logarit rời rạc bằng cách sử dụng phương pháp "vét cạn"đã
được nói đến ở trên, thì sẽ cần O( p) bước để giải bài toán.
Thật vậy, do g là một phần tử nguyên thủy nên cấp của nó là p − 1, vậy số lần thử
x sẽ là O( p − 1) ≈ O( p).
Do O( p) = O(2k ), thuật toán này yêu cầu thời gian lũy thừa. (Nếu ta coi phép
cộng và phép nhân là các phép toán cơ bản thì thuật toán mất O(k.2k ) hoặc O(k3 .2k )
bước, nhưng cách phân biệt vẫn không cần thiết; thời gian chạy vẫn là thời gian lũy
thừa, ví dụ là O(3k ).)
Tuy nhiên, có những cách nhanh hơn để giải bài toán logarit rời rạc trong F∗p ,
một vài trong số đó rất nhanh nhưng chỉ áp dụng với một vài số nguyên tố, trong
khi những thuật toán còn lại chậm hơn, nhưng hoạt động với mọi số nguyên tố. Ví
dụ, thuật toán Pohlig-Hellman mô tả trong phần sau chỉ ra rằng nếu p − 1 phân
tích hoàn toàn thành tích của các số nguyên tố nhỏ, thì bài toán logarit rời rạc là
khá dễ giải. Với số nguyên tố bất kỳ, thuật toán va chạm giải bài toán logarit rời

rạc trong O( p log p) bước, nhanh hơn rất nhiều so với O( p), nhưng vẫn là lũy
thừa.√Tốt hơn nữa là thuật toán giải tích chỉ số giải bài toán logarit rời rạc trong
(log p)(log log p)
O(ec ) bước, do đó nó vẫn là một thuật toán thời gian gần lũy thừa.
Ví dụ 0.6.6. Ta xét bài toán logarit rời rạc trong nhóm G = F∗p , với phép toán nhóm
là phép cộng. Bài toán logarit rời rạc trong điều kiện này đòi hỏi một nghiệm x cho
phép đồng dư
x · g ≡ h ( mod p),
với g và h là các phần tử trong Z/pZ. Ta có thể giải phép đồng dư này bằng cách
sử dụng thuật toán Euclid mở rộng (Định lý 0.1.1) để tính g−1 ( mod p) và đặt

x ≡ g−1 .h ( mod p).


Việc tính g−1 ( mod p) sẽ mất O(log p) bước, do khi sử dụng thuật toán Euclid mở
rộng, thuật toán mất 2 log2 ( p) + 3 để tính gcd( g, p), do đó ta mất một bội nhỏ của
log2 ( p) để tính được nghịch đảo của g modulo p, do đó có một thuật toán thời gian
tuyến tính để giải bài toán logarit rời rạc trong nhóm cộng F p . Đây là một thuật toán

17
0.7. THUẬT TOÁN VA CHẠM CHO BÀI TOÁN LOGARIT RỜI RẠC MỤC LỤC

rất nhanh, do đó bài toán logarit rời rạc trong F p với phép cộng không phải là một
ứng cử viên tốt cho hàm một cửa trong mật mã học.

Một lưu ý quan trọng là các bài toán logarit rời rạc trong các nhóm khác nhau thể
hiện mức độ khó khác nhau cho lời giải của nó. Do đó bài toán logarit rời rạc trong
F p với phép cộng có lời giải trong thời gian tuyến tính, trong khi thuật toán tổng
quát tốt nhất được biết đến giải bài toán logarit rời rạc trong F∗p với phép nhân là
thời gian gần lũy thừa. Bài toán logarit rời rạc cho các đường cong elliptic được cho
là thậm chí khó hơn cả bài toán logarit rời rạc trong F∗p . Cụ thể, nếu nhóm đường
cong elliptic được chọn cẩn√ thận và có N phàn tử, thì thuật toán tốt nhất giải bài
toán logarit rời rạc trong O( N ).

0.7 Thuật toán va chạm cho bài toán logarit rời rạc

Trong phần này ta mô tả một thuật toán logarit rời rạc theo Shanks. Nó là một
ví dụ của một va chạm, hoặc thuật toán "gặp ở giữa". Thuật toán của Shanks hoạt
đồng trong mọi nhóm, không chỉ F∗p và chứng minh rằng nó không khó hơn trong
bất kỳ nhóm nào, và ta phát biểu và chứng minh trong tổng quát.
Mệnh đề 0.7.1 (Cận tầm thường cho bài toán logarit rời rạc). Cho G là một nhóm và
g ∈ G là một phần tử cấp n. Khi đó, bài toán logarit rời rạc

gx = h (0.7.1)
có thể được giải trong O(n) bước, vói mỗi bước là phép nhân với g.

Chứng minh. Ta lập một danh sách các giá trị của g x với x = 0, 1, 2, . . . , n − 1. Để ý
rằng mỗi giá trị liên tiếp thu được bằng cách nhân phần tử trước với g. Nếu tồn tại
một nghiệm cho g x = h thì h sẽ xuất hiện trong danh sách trên.
Nhận xét 0.7.2. Nếu ta làm việc trong F∗p , thì mỗi khi tính g x ( mod p) cần O((log p)k )
phép toán trên máy tính, với hằng số k và ký hiệu "O "phụ thuộc vào máy tính và
thuật toán được sử dụng cho phép nhân modulo. Khi đó, tổng số bước mà máy
tính thực hiện, hoặc thời gian chạy, là O(n(log p)k ). Tổng quát, nhân tố được tạo bởi
O((log p)k ) là không đáng kể, do đó ta sẽ bỏ qua nó và đơn giản gọi là thời gian
chạy là O(n).
Ý tưởng đằng sau một thuật toán va chạm là lập hai danh sách và tìm một phần
tử xuất hiện ở cả hai danh sách. Với bài toán logarit rời rạc, thời gian chạy của một

thuật toán va chạm nhiều hơn O( n) một số bước, tiết kiệm được một lượng lớn
so với O(n) nếu n lớn.
18
0.7. THUẬT TOÁN VA CHẠM CHO BÀI TOÁN LOGARIT RỜI RẠC MỤC LỤC

Mệnh đề 0.7.3 (Thuật toán Bước nhỏ-Bước lớn của Shanks). Cho G là một nhóm và
cho g ∈ G là một√phần tử có cấp N ≥ 2. Khi đó thuật toán sau giải bài toán logarit rời rạc
x
g = h trong O( N. log N ) bước.
√ √
(1) Cho n = 1 + b N c, do đó n > N.
(2) Tạo hai danh sách
(i) Danh sách 1: e, g, . . . , gn ,
2 n
(ii) Danh sách 2: h, h ( g−n ) , h. ( g−n ) , . . . , h ( g−n ) .
(3) Tìm một phần tử xuất hiện trong cả hai danh sách, giả sử gi = h.g− jn .
(4) Khi đó x = i + jn là một nghiệm của bài toán g x = h.

Chứng minh. Ta bắt đầu với một vài quan sát. Đầu tiên, khi tạo ra Danh sách 2,
ta bắt đầu bằng việc tính đại lượng u = g−n và lập Danh sách 2 bằng cách tính
h, hu, hu2 , . . . , hun . Do đó tạo nên hai danh sách mất xấp xỉ 2n phép nhân. Tiếp theo,
giả sử tồn tại phần tử trùng nhau ở cả 2 danh sách, ta có thể tìm một cặp trong một
bội của log(n) bằng cách sử dụng các thuật toán sắp xếp tiêu chuẩn và thuật toán
truy tìm, do đó Bước (3)√mất O(log n) bước. Do đó tổng thời gian chạy của thuật
toán là O(n log n) = O( N log N ). Với bước cuối cùng này ta sử dụng n ≈ N, do
đó
√ √ 1√
n log n ≈ N log N = N log N.
2
Để chứng minh tính đúng đắn của thuật toán, ta cần chỉ ra Danh sách 1 và 2 luôn
có ít nhất 1 phần tử trùng nhau. Để chứng minh, giả sử x là nghiệm chưa biết của
g x = h và viết x dưới dạng
x = nq + r với 0 ≤ r < n.
Ta biết rằng 1 ≤ x < N, do đó
x−r N √
q= < <n do n > N.
n n
Do đó, ta có thể viết lại bài toán g x = h thành
gr = h.g−qn với 0 ≤ r < n và 0 ≤ q < n.
Do đó gr nằm trong Danh sách 1 và h.g−qn nằm trong Danh sách 2, do đó 2 danh
sách trên có phần tử trùng nhau.
Ví dụ 0.7.4. Ta sẽ mô tả phương pháp bước nhỏ-bước lớn của Shanks bằng cách sử
dụng thuật toán để giải bài toán logarit rời rạc
gx = h trong F∗p với g = 9704, h = 13896, và p = 17389.
19
0.8. ĐỊNH LÝ THẶNG DƯ TRUNG HOA MỤC LỤC



Số 9704 có cấp 1242 trong F17389 Đặt n = b 1242c + 1 = 36 và u = g−n =
.
9704−36 = 2494. Qua tính toán ta có
97044 = 14567 = 13896.249432 trong F17389 .

Lại có 2494 = 9704−36 nên ta tính được


13896 = 97047 .2494−32 = 97047 .(970436 )32 = 97041159 trong F17389 .

Do đó x = 1159 là nghiệm của bài toán 9704x = 13896 trong F17389 .

0.8 Định lý thặng dư Trung Hoa

Định lý thặng dư Trung Hoa mô tả nghiệm của một hệ phương trình đồng dư
tuyến tính. Trường hợp đơn giản nhất là một hệ hai phương trình đồng dư
x ≡ a ( mod m) và x ≡ b ( mod n), (0.8.1)

với gcd(m, n) = 1. Khi đó, định lý thặng dư Trung Hoa nói rằng tồn tại duy nhất
một nghiệm modulo mn thỏa mãn hệ trên.
Phiên bản đầu tiên của một bài toán có dạng như trên xuất hiện trong một công
trình toán học ở Trung Hoa từ cuối thế kỷ thứ III hoặc đầu thế kỷ thứ IV. Bài toán
ban đầu phải giải quyết với bài toán khó hơn khi phải giải hệ 3 phương trình đồng
dư.

Ta có một số đồ vật, nhưng không biết chính xác là bao nhiêu. Khi đếm chúng theo
3 cái một thì thừa hai cái. Khi đếm 5 cái một thì thừa 3 cái. Nếu ta đếm theo 7 cái
một thì thừa 2 cái. Hỏi có bao nhiêu đồ vật?
[Sun Tzu Suan Ching, khoảng 300 năm sau Công nguyên.]

Định lý thặng dư Trung Hoa và tổng quát hóa của nó có nhiều ứng dụng trong lý
thuyết số và nhiều lĩnh vực khác trong Toán học. Ở Phần 13 ta sẽ chỉ ra nó được sử
dụng như nào để giải một số thể hiện nhất định của bài toán logarit rời rạc. Ta sẽ
bắt đầu với một ví dụ mà ta giải hệ hai phương trình đồng dư. Phương pháp mà ta
mô tả thực tế là một thuật toán cho phép tìm ra nghiệm.
Ví dụ 0.8.1. Ta tìm một số nguyên x mà đồng thời thỏa mãn hai phép đồng dư
x ≡ 1 ( mod 5) và x ≡ 9 ( mod 11). (0.8.2)

20
0.8. ĐỊNH LÝ THẶNG DƯ TRUNG HOA MỤC LỤC

Đẳng thức đồng dư đầu chỉ ra rằng x ≡ 1 ( mod 5), do đó, tập nghiệm của phương
trình đầu là họ các số nguyên
x = 1 + 5y, y ∈ Z. (0.8.3)
Thay (0.8.3) vào phương trình thứ hai của (0.8.2) ta có
1 + 5y ≡ 9 ( mod 11), và do đó 5y ≡ 8 ( mod 11). (0.8.4)
Ta giải ra y bằng cách nhân cả 2 vế của (0.8.4) với nghịch đảo của 5 modulo 11.
Nghịch đảo này tồn tại do gcd(5, 11) = 1 và có thể tính được. Tuy nhiên, trong
trường hợp này việc lấy modulo là số nhỏ nên ta có thể tìm bằng cách "vét cạn"; do
đó 5.9 = 45 ≡ 1 ( mod 11). Trong mọi trường hợp, nhân cả hai vế của (0.8.4) với 9 ta
suy ra
y ≡ 9.8 ≡ 72 ≡ 6 ( mod 11).
Cuối cùng, thay giá trị này của y vào (0.8.3) ta thu được nghiệm
x = 1 + 5.6 = 31
của bài toán ban đầu.

Cách làm ở ví dụ trên có thể sử dụng để suy ra một công thức tổng quát cho
nghiệm của hệ hai phương trình đồng dư.
Định lý 0.8.2 (Định lý thặng dư Trung Hoa). Cho m1 , . . . , mk là họ các số nguyên đôi
một nguyên tố cùng nhau. Điều này nghĩa là
gcd(mi , m j ) = 1 với mọi i 6= j.
Cho a1 , . . . , ak là các số nguyên bất kỳ. Khi đó hệ các phương trình đồng dư
x ≡ a1 ( mod m1 ), x ≡ a2 ( mod m2 ), . . . , x ≡ ak ( mod mk ). (0.8.5)
có nghiệm x = c. Hơn nữa, nếu x = c và x = c0 đều là nghiệm, khi đó
c ≡ c0 ( mod m1 m2 · · · mk ). (0.8.6)

Chứng minh. Giả sử rằng với một giá trị nào đó của i ta đã tìm được nghiệm x = ci
cho hệ phương trình đồng dư
x ≡ a1 ( mod m1 ), x ≡ a2 ( mod m2 ), . . . , x ≡ ai ( mod mi ). (0.8.7)
Ví dụ, nếu i = 1, thì c1 = a1 . Ta sẽ giải thích cách làm để tìm ra nghiệm cho một
phương trình đồng dư nữa
x ≡ a1 ( mod m1 ), x ≡ a2 ( mod m2 ), . . . , x ≡ ai+1 ( mod mi+1 ).
21
0.8. ĐỊNH LÝ THẶNG DƯ TRUNG HOA MỤC LỤC

Ý tường là ta sẽ tìm nghiệm dưới dạng


x = ci + m1 · · · mi y.
Để ý rằng giá trị này của x vẫn thỏa mãn tất cả phương trình trong (0.8.7), do đó ta
cần chọn được y sao cho nó cũng thỏa mãn x ≡ ai+1 ( mod mi+1 ). Nói cách khác, ta
cần tìm một giá trị của y thỏa mãn
ci + m1 m2 · · · mi y ≡ ai+1 ( mod mi+1 ).
Việc gcd(mi+1 , m1 m2 · · · mi ) = 1 chỉ ra rằng ta luôn có thể làm được điều này. Do
đó ta đã chỉ ra sự tồn tại nghiệm của hệ phương trình đồng dư đã cho.

Chứng minh của Định lý thặng dư Trung Hoa dễ dàng chuyển thành một thuật
toán tìm nghiệm của một hệ phương trình đồng dư. Ví dụ dưới đây được dùng để
mô tả phương pháp tổng quát.
Ví dụ 0.8.3. Ta giải hệ phương trình đồng dư
x ≡ 2 ( mod 3), x ≡ 3 ( mod 7), x ≡ 4 ( mod 16). (0.8.8)
Định lý thặng dư Trung Hoa chỉ ra rằng tồn tại duy nhất một nghiệm modulo 336,
do 336 = 3.7.16. Ta bắt đầu với nghiệm x = 2 cho phương trình đồng dư đầu tiên là
x ≡ 2 ( mod 3). Ta sử dụng nó để tìm nghiệm tổng quát dưới dạng x = 2 + 3y và
thày vào phương trình đồng dư thứ 2 ta có
2 + 3y ≡ 3 ( mod 7).
Ta rút gọn còn 3y ≡ 1 ( mod 7), và ta nhân cả hai vế với 5 (do 5 là nghịch đảo của 3
modulo 7) để thu được y ≡ 5 ( mod 7). Khi đó, ta có giá trị
x = 2 + 3y = 2 + 3.5 = 17
là một nghiệm của phương trình đồng dư (0.8.8).
Nghiệm tổng quát cho hai phương trình đầu là x = 21z + 17. Ta thay vào phương
trình đồng dư thứ ba ta thu được
21z + 17 ≡ 4 ( mod 16).
Suy ra 5z ≡ 3 ( mod 16). Ta nhân hai vế với 13, là nghịch đảo của 5 modulo 16, thu
được
z ≡ 3.13 ≡ 39 ≡ 7 ( mod 16).
Cuối cùng, ta tháy x = 17 + 21z để thu được nghiệm
x = 17 + 21.7 = 164.
Các nghiệm khác thu được bằng cách cộng hoặc trừ một số lần bội của 336 với
nghiệm trên.
22
0.8. ĐỊNH LÝ THẶNG DƯ TRUNG HOA MỤC LỤC

0.8.1 Giải các phương trình đồng dư với các modulo tổng hợp

Thông thường cách dễ nhất để giải một phương trình đồng dư với một modulo
tổng hợp bằng cách giải các phương trình đồng dư modulo các số nguyên tố (hoặc
lũy thừa của số nguyên tố) và sau đó kết hợp nghiệm bằng cách sử dụng Định lý
thặng dư Trung Hoa. Ta sẽ minh họa nguyên tắc đó trong phần này bằng cách đưa
ra bài toán tìm căn bậc 2 modulo m. Việc tính căn bậc hai của một số modulo nguyên
tố khá dễ dàng. Thật vậy, với các số nguyên tố đồng dư 3 modulo 4, việc tìm căn bậc
hai rất dễ.
Mệnh đề 0.8.4. Cho p là một số nguyên tố thỏa mãn p ≡ 3 ( mod 4). Cho a là một số
nguyên sao cho x2 ≡ a ( mod p) có nghiệm, nghĩa là a có một căn bậc hai modulo p. Khi đó
p +1
b≡a 4 ( mod p)
là một nghiệm thỏa mãn b2 ≡ a ( mod p).

Chứng minh. Cho g là một phần tử nguyên thủy modulo p. Khi đó a là một lũy thừa
của g, và việc a có căn bậc hai modulo p nghĩa là a là một lũy thừa chẵn của g, giả
sử là a ≡ g2k ( mod p). Khi đó, ta tính
p +1
b2 ≡ a 2 ( mod p) theo định nghĩa của b,
p +1
≡ ( g2k ) 2 ( mod p) do a ≡ g2k ( mod p),
≡ g ( p +1) k ( mod p)
≡ g2k+( p−1)k ( mod p)
≡ a.( g p−1 )k ( mod p) do a ≡ g2k ( mod p),
≡a ( mod p) do g p−1 ≡ 1 ( mod p).
Do đó b là một căn bậc hai của a modulo p.
Ví dụ 0.8.5. Một căn bậc hai của a = 2201 modulo p = 4127 là
p +1 4128
b≡a 4 = 2201 4 ≡ 22011032 ≡ 3718 ( mod 4127).

Để thấy rằng a thật sự có căn bậc hai modulo 4127, ta bình phương b và kiểm tra
lại rằng 37182 = 13823524 ≡ 2201 ( mod 4127).

Giả sử rằng ta muốn tính một căn bậc 2 modulo m, với m không nhất thiết là số
nguyên tố. Một phương pháp hiệu quả là phân tích m, tính căn bậc hai modulo mỗi
số nguyên tố (hoặc lũy thừa nguyên tố) của các thừa số, và kết hợp nghiệm bằng
cách sử dụng Định lý thặng dư Trung Hoa.
23
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

Ví dụ 0.8.6. Ta tìm nghiệm của phép đồng dư


x2 ≡ 197 ( mod 437).
Phép phân tích cho ta 437 = 19.23, do đó, đầu tiên ta giải hệ hai phương trình đồng

y2 ≡ 197 ≡ 7 ( mod 19), và z2 ≡ 197 ≡ 13 ( mod 23).
Do 19 và 23 đều đồng dư 3 modulo 4, nên ta có thể tìm các căn bậc hai của chúng
theo Mệnh đề (0.8.4). Khi đó, ta có
y ≡ ±8 ( mod 19) và z ≡ ±6 ( mod 23).
Ta có thể chọn y bằng 8 hoặc -8, và z bằng 6 hoặc -6. Ta sẽ chọn hai nghiệm dương,
và sử dụng Định lý thặng dư Trung Hoa để giải hệ phương trình đồng dư
x ≡ 8 ( mod 19) và x ≡ 6 ( mod 23).
Ta tìm được x ≡ 236 ( mod 437), do đó tìm được nghiệm của bài toán ban đầu.
Nhận xét 0.8.7. Nghiệm của bài toán trên là không duy nhất. Ban đầu ta hoàn toàn
có thể chọn số âm
−236 ≡ 201 ( mod 437),
để thu được căn bậc hai thứ hai của 197 modulo 437. Nếu các modulo là các số
nguyên tố, thì chỉ có duy nhất hai căn bậc hai như trên. Tuy nhiên, do 437=19.23 là
hợp số, do đó có thêm hai số nữa. Để tìm chúng, ta tháy hoặc 8 hoặc 6 là số âm. Từ
đó tính ra được x = 144 và x = 293, do đó 197 có bốn căn bậc hai modulo 437.
Nhận xét 0.8.8. Ta thấy rằng từ Ví dụ (0.8.6) khá dễ dàng tính được các căn bậc hai
modulo m nếu ta biết cách phân tích m thành tích các lũy thừa của các số nguyên
tố. Tuy nhiên, giả sử rằng m quá lớn và ta không thể phân tích nó. Khi đó bài toán
tìm căn bậc hai modulo m là rất khó. Thật vậy, theo một nghĩa nào đó việc tìm căn
bậc hai modulo m khó tương đương với việc phân tích m thành thừa số nguyên tố.
Thật ra, nếu m là một số nguyên lớn và không biết phân tích thừa số nguyên tố
của nó, khi đó rất khó để xác định một số nguyên a cho trước có căn bậc hai modulo
m, kể cả không yêu cầu tính căn bậc hai.

0.9 Thuật toán Pohlig-Hellman

Ngoài việc là một định lý và một thuật toán, Định lý thặng dư Trung Hoa được
coi là một điều hiển nhiên. Nếu
m = m1 · m2 · · · m t
24
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

là một tích của các số nguyên đôi một nguyên tố cùng nhau, khi đó Định lý thặng
dư Trung Hoa nói rằng việc giải một phương trình modulo m không dễ hơn việc
giải một hệ phương trình modulo mi với mỗi i, do nó cho ta biết cách kết hợp các
nghiệm để thu được nghiệm của phương trình modulo m.
Trong bài toán logarit rời rạc, ta cần giải phương trình

g x ≡ h ( mod p).
Trong trường hượp này, modulo p là số nguyên tố, do đó việc sử dụng Định lý thặng
dư Trung Hoa là không khả thi. Tuy nhiên, nhắc lại rằng nghiệm x được xác định
chỉ với modulo p − 1, do đó ta có thể xem nghiệm nằm ở trong Z/( p − 1)Z. Điều
này gợi ý cho taằng việc phân tích p − 1 thành thừa số nguyên tố có thể đóng một
vai trò quan trọng trong việc xác định tính khó của bài toán logarit rời rạc trong F∗p .
Tổng quát hơn, nếu G là một nhóm bất kỳ và g ∈ G là một phần tử có cấp N, thì
nghiệm của g x = h trong G được xác định duy nhất modulo N, do đó việc phân
tích N thành thừa số nguyên tố là cần tiết. Đây chính là ý tưởng của thuật toán
Pohlig-Hellman.
Định lý 0.9.1 (Thuật toán Pohlig-Hellman). Cho G là một nhóm, và ta có bài toán logarit
rời rạc trong G vói mọi phần tử có cấp là một lũy thừa của một số nguyên tố. Với tính rời
rạc, nếu g ∈ G có cấp qe , giả sử rằng ta có thể giải g x = h trong O(Sqe ) bước.
Cho g ∈ G là một phần tử có cấp N, và giả sử rằng N phân tích được thành tích của các
lũy thừa các số nguyên tố
e
N = q11 · q2e2 · · · qet t .
Khi đó bài toán logarit rời rạc g x = h có thể được giải trong
!
t
∑ Sqii + log N
e
O bước (0.9.1)
i =1

bằng cách sử dụng thủ tục sau:

(1) Với mỗi 1 ≤ i ≤ t, ta đặt


ei ei
gi = g N/qi và hi = h N/qi .
e
Chú ý rằng gi có lũy thừa nguyên tố cấp qi i , do đó sử dụng thuật toán đã cho để giải
bài toán logarit rời rạc
y
gi = h i . (0.9.2)

Cho y = yi là một nghiệm của (0.9.2).

25
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

(2) Sử dụng Định lý thặng dư Trung Hoa để giải hệ phương trình đồng dư
e
x ≡ y1 ( mod q11 ), x ≡ y2 ( mod q2e2 ), . . . , x ≡ yt ( mod qet t ). (0.9.3)
Chứng minh. Thời gian chạy khá rõ ràng, do Bước (1) mất O(∑ Sqei ) bước, và Bước
i
(2), theo Định lý thặng dư Trung Hoa, mất O(log N ) bước. Trong thực hành, việc
tính toán theo Định lý thặng dư Trung Hoa thông thường là không đáng kể so với
các tính toán logarit rời rạc. Ta vẫn phải chỉ ra rằng Bước (1) và (2) cho ta nghiệm
của g x = h. Cho x là một nghiệm của hệ phương trình đồng dư (0.9.3). Khi đó, với
mỗi i ta có thể viết
e
x = yi + qi i zi với zi nào đó. (0.9.4)
Khi đó ta có thể tính
ei ei ei
( g x ) N/qi = ( gyi +qi zi ) N/qi , theo (0.9.4)
ei
= ( g N/qi )yi .g Nzi
ei
= ( g N/qi )yi do g N là phần tử đơn vị,
y
= gi i theo định nghĩa của gi ,
= hi theo (0.9.2)
ei ei
= h N/qi = glogg (h).N/qi theo định nghĩa của hi .
Theo định nghĩa của logarit rời rạc cơ số g, ta có thể viết thành
N N
ei .x ≡ ei . log g ( h ) ( mod N ), i = 1, t (0.9.5)
qi qi
và logarit rời rạc với cơ số g được định nghĩa modulo N, do đó g N là phần tử đơn
vị.
Tiếp theo, ta thấy rằng
N N N
e , e2 , . . . , e t
q11 q2 qt
không có thừa số chung, nghĩa là ước chung lớn nhất của chúng là 1. Áp dụng liên
tiếp định lý Euclid, khi đó ta có thể tìm được các số nguyên c1 , c2 , . . . , ct sao cho
N N
e1 .c1 + · · · + et .ct = 1. (0.9.6)
q1 qt
Nhân cả hai vế của (0.9.5) bởi ci và lấy tổng trên i = 1, 2, . . . , t. Ta suy ra
N N N N
e .c 1 .x + · · · + .c t .x = .c 1 . log ( h ) + · · · + .ct . logg (h)
q11 qet t e
q11 g
qet t
26
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

hay
t t
N N
∑ q ei i
.c .x ≡ ∑ qei .ci . logg (h) ( mod N ),
i =1 i i =1 i
và khi đó (0.9.6) cho ta biết rằng
x = logg (h) ( mod N ).

Đẳng thức này chứng minh rằng x thỏa mãn g x ≡ h.


Nhận xét 0.9.2. Thuật toán Pohlig-Hellman có tính suy dẫn từ bài toán logarit rời
rạc với các phàn tử cấp bất kỳ đến bài toán logarit rời rạc có cấp lũy thừa số nguyên
tố. Chính xác hơn, theo ký hiệu của Định lý (0.9.1), thời gian chạy Sqe với các phần
tử cấp qe có thể suy dẫn về O(e.Sq ). Điều này được đưa ra trong Mệnh đề (0.9.1),
thời gian chạy Sqe với các phần tử có cấp qe có thể suy dẫn về O(e.Sq ). Điều này được
chứng minh trong Mệnh đề (0.9.3).
Thuật toán Pohlig-Hellman chỉ ra rằng bài toán logarit rời rạc trong nhóm G là
không bảo mật nếu cấp của nhóm là tích của các lũy thừa các số nguyên tố nhỏ.
Tổng quát hơn, nếu g x = h là dễ giải nếu cấp của phần tử g là tích của lũy thừa các
số nguyên tố nhỏ. Điều này được áp dụng trong bài toán logarit rời rạc trong F p
nếu p − 1 phân tích thành tích các lũy thừa các số nguyên tố nhỏ. Do p − 1 luôn là
số chẵn nên cách tốt nhất để làm việc này là đặt p = 2q + 1 với q là một số nguyên
tố và sử dụng một phần tử g cấp q. Khi đó thời gian chạy của thuật toán va chạm
√ √
được mô tả trong Mệnh đề (0.7.3) là O( q) = O( p). Tuy nhiên, phương pháp giải
tích chỉ số có thời gian chạy là cận lũy thừa do kể cả khi p = 2q + 1, số nguyên tố q
được chọn phải khá lớn.
Ta sẽ giải thích thuật toán suy dẫn bài toán logarit rời rạc cho các phần tử có cấp
là lũy thừa số nguyên tố đến bài toán logarit rời rạc cho các phần tử có cấp nguyên
e −1
tố. Ý tưởng khá đơn giản: nếu g có cấp qe , thì gq có cấp q.
Mệnh đề 0.9.3. Cho G là một nhóm. Giả sử rằng q là một số nguyên tố, và giả sử ta biết
một thuật toán mấy Sq bước để giải bài toán logarit rời rạc g x = h trong G khi g có cấp q.
Bây giờ ta có g ∈ G là một phần tử có cấp qe với e ≥ 1. Khi đó ta có thể giải bài toán logarit
rời rạc
gx = h trong O(e.Sq ) bước. (0.9.7)

Nhận xét 0.9.4. Mệnh đề (0.7.3) nói rằng ta cần lấy Sq = O( q), và Mệnh đề (0.9.3)

nói rằng ta có thể giải bài toán logarit rời rạc (0.9.7) trong O(e q) bước. Chú ý rằng
nếu ta áp dụng Mệnh đề (0.7.3) trực tiếp cho bài toán logarit rời rạc (0.9.7), thời gian
chạy sẽ là O(qe/2 ), chậm hơn rất nhiều nếu e ≥ 2.
27
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

Chứng minh. Ý tưởng chính để chứng minh mệnh đề là viết lũy thừa chưa biết x
dưới dạng
x = x0 + x1 q + · · · + xe−1 qe−1 với 0 ≤ xi < q, (0.9.8)
e −1
và xác định các hệ số x0 , x1 , . . . . Ta bắt đầu bằng việc quan sát thấy phần tử gq có
cấp q. Khi đó, ta có thể tính được
e −1 e −1
hq = ( g x )q lấy lũy thừa qe−1 hai vế của (0.9.7)
 q e −1
x0 + x1 q+···+ xe−1 qe−1

= g từ (0.9.8)
 e  x1 + x2 q+···+ xe−1 qe−2
x 0 q e −1
=g . gq
 e −1  x 0 e
= gq do gq = 1.
e −1
Do gq là một phần tử cấp q trong G, phương trình
 e −1  x 0 e −1
gq = hq

là một bài toán logarit rời rạc với cơ số là một phần tử cấp q. THeo giả thiết, ta có
thể giải bài toán này trong Sq bước. Khi đã làm xong, ta biết một lũy thừa x0 với tính
chất
e −1 e −1
g x0 q = h q trong G.
Tính toán tương tự, ta lấy lũy thừa qe−2 hai vế của (0.9.7), suy ra
e −2 e −2
hq = ( g x )q
 q e −2
x0 + x1 q+···+ xe−1 qe−1

= g
e −2 e −1
 e  x2 + x3 q+···+ xe−1 qe−3
= g x0 q .g x1 q . gq
e −2 e −1
= g x0 q .g x1 q .
e −1
Chú ý rằng ta đã xác định được giá trị của x0 và do đó phần tử gq có cấp q trong
G. Để tìm x1 , ta phải giải bài toán logarit rời rạc
 e −1  x 1  q e −2
gq = h.g− x0

với đại lượng chưa biết là x1 . Áp dụng thuật toán đã cho một lần nữa, ta có thể giải
bài toán trên trong Sq bước. Khi đó, trong O(2Sq ) bước, ta đã xác định các giá trị của
x0 và x1 thỏa mãn
e −2 e −2
g ( x0 + x1 q ) q = h q trong G.
28
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

Tương tự, ta tìm được x2 bằng cách giải bài toán logarit rời rạc
 e −1  x 2  q e −3
gq = h.g− x0 − x1 q ,

và tổng quát, sau khi đã xác định được x0 , . . . , xi−1 , khi đó giá trị của xi thu được
bằng cách giải
 e −1  x i   q e − i −1
q − x0 − x1 q−···− xi−1 qi−1
g = h.g trong G.

Mỗi bước này là một bài toán logarit rời rạc với cơ số có cấp q, do đó mỗi bài toán
được giải trong Sq bước. Do đó sau O(eSq ) bước, ta thu được lũy thừa x = x0 +
x1 q + · · · + xe−1 qe−1 thỏa mãn g x = h, do đó giải được bài toán logarit rời rạc ban
đầu.
Ví dụ 0.9.5. Ta đưa ra một ví dụ để làm rõ thuật toán được mô tả và chứng minh
của Mệnh đề (0.9.3). Ta giải

5448x = 6909 trong F11251 . (0.9.9)
Số nguyên tố p = 11251 có tính chất là p − 1 chia hết cho 54 , và dễ dàng kiểm tra lại
rằng 5448 có cấp là 54 trong F11251 . Bước đầu tiên ta giải
 x
53 0 3
5448 = 69095 ,

rút gọn về 110889x0 = 11089. Dễ dàng giải được nghiệm x0 = 1, do đó giá trị ban
đầu của x là 1.
Bước tiếp theo, ta giải
 x
53 1 2 2
5448 = (6909.5448− x0 )5 = (6909.5448−1 )5 ,

rút gọn về 11089x1 = 3742. Chú ý rằng ta chỉ cần kiểm tra các giá trị nằm giữa 1 và
4, mặc dù nếu q lớn, ta có thể sử dụng một thuật toán nhanh hơn như trong Mệnh
đề (0.7.3) để giải bài toán logarit rời rạc. Trong hai trường hợp, nghiệm của nó là
x1 = 2, và do đó giá trị của x là x = 11 = 1 + 2.5.
Tiếp tục, ta giải
 x
53 2
5448 = (6909.5448− x0 − x1 .5 )5 = (6909.5448−11 )5 ,

suy ra 11089x2 = 1. Do đó x2 = 0, suy ra giá trị của x vẫn là 11.


Bước cuối cùng, ta giải
 x
53 3 2
5448 = 6909.5448− x0 − x1 .5− x2 .5 = 6909.5448−11 .

29
0.9. THUẬT TOÁN POHLIG-HELLMAN MỤC LỤC

Suy ra ta cần giải 11089x3 = 6320, và nghiệm là x3 = 4. Do đó, đáp án cuối cùng của
ta là
x = 511 = 1 + 2.5 + 4.53 .
Kiểm tra lại, ta tính được

5448511 = 6909 trong F11251 .

Thuật toán Pohlig-Hellman để giải bài toán logarit rời rạc sử dụng Định lý thặng
dư Trung Hoa để kết hợp các nghiệm có cấp lũy thừa của số nguyên tố. Ví dụ sau
đây mô tả thuật toán Pohlig-Hellman đầy đủ.
Ví dụ 0.9.6. Xét bài toán logarit rời rạc

23x = 9689 trong F11251 .


Cơ số 23 là phần tử nguyên thủy trong F11251 , nghĩa là nó có cấp 11250. Do 11250 =
2.32 .54 là tích của các số nguyên tố nhỏ, thuật toán Pohlig-Hellman sẽ hoạt động tốt.
Khi đó ta đặt
p = 11251, g = 23, h = 9689, N = p − 1 = 2.32 .54 .
Bước đầu tiên là ta giải ba bài toán logarit rời rạc được ghi ở bảng dưới đây
e x
e e
  e
q e g ( p − 1 ) /q h ( p − 1 ) q Giải g ( p − 1 ) /q = h( p−1)/q
2 1 11250 11250 1
3 2 5029 10724 4
5 4 3448 6909 511

Để ý rằng bài toán đầu tiên là tầm thường, trong khi bài toán thứ ba là bài toán ta
đã giải ở ví dụ trên. Trong mọi trường hợp, các bài toán đơn lẻ trong bước này của
thuật toán có thể được giải như trong phần chứng minh của Mệnh đề (0.9.3)
Bước tiếp theo là sử dụng Định lý thặng dư Trung Hoa để giải hệ phương trình
đồng dư
x ≡ 1 ( mod 2), x ≡ 4 ( mod 32 ), x ≡ 511 ( mod 54 ).
Nghiệm nhỏ nhất là x = 4261. Kiểm tra lại đáp án bằng cách tính
234261 ≡ 9689 trong F11251 .

30
0.10. BÀI TẬP MỤC LỤC

KẾT LUẬN

Trong bài báo cáo này, ta đã tìm hiểu về bài toán logarit rời rạc trong nhóm F p và
trong nhóm G tổng quát. Ta cũng đã tìm hiểu về hệ mã hóa ElGamal, ưu điểm cũng
như nhược điểm của nó và độ khó để phá được hệ mã hóa này. Tiếp theo, ta được
giới thiệu về thuật toán va chạm bước nhỏ-bước lớn của Shanks, cách thức hoạt
động của thuật toán này cũng như thời gian chạy của nó.
Tiếp theo, ta được tìm hiểu về nhóm, thuật toán nhóm và các tính chất của nhóm.
Sau đó, ta được biết về định lý thặng dư Trung Hoa và cách tìm căn bậc hai modulo
p của những số p đồng dư 3 modulo 4.
Cuối cùng, Định lý thặng dư Trung Hoa là nền tảng cho thuật toán Pohlig-
Hellman giải bài toán logarit rời rạc.

0.10 Bài tập

0.10.1 Bài tập 2.3

Cho g là một phần tử nguyên thủy của F p .

(a) Giả sử rằng x = a và x = b là hai nghiệm nguyên của phương trình đồng dư
g x ≡ h ( mod p). Chứng minh rằng a ≡ b ( mod p − 1). Giải thích tại sao điều
này lại suy ra ánh xạ logg được định nghĩa tốt.

(b) Chứng minh rằng log( ab) = logg ( a) + logg (b) với mọi a, b ∈ F∗p .

(c) Chứng minh rằng logg (hn ) = n logg (h) với mọi h ∈ F∗p và n ∈ Z.

BÀI LÀM

(a) Giả sử rằng x = a và x = b là nghiệm của phương trình g x ≡ h ( mod p). Khi
đó ta có
g a = h và gb = h.
Khi đó ta có
g a−b = 1
Lại có cấp của g là p − 1 nên ( p − 1)|( a − b), suy ra a − b ≡ 0 ( mod p − 1).
Vậy a ≡ b( mod p − 1). Do đó ánh xạ logg được định nghĩa tốt.
(b) Giả sử logg ( a) = n, logg (b) = m. Khi đó ta có a = gn và b = gm . Vậy

logg ( ab) = logg ( gm .gn ) = logg ( gm+n ) = m + n = logg ( a) + logg (b).

31
0.10. BÀI TẬP MỤC LỤC

(c) Giả sử logg (h) = k, tức là h = gk . Khi đó, ta có

logg (hn ) = logg [( gk )n ] = logg ( gkn ) = nk = n logg (h).

0.10.2 Bài tập 2.4

Tính các logarit rời rạc sau đây:

(a) log2 (13) với số nguyên tố 23 (tức là giải phương trình 2x = 13 ( mod 23)).
(b) log10 22 với p = 47.
(c) log627 (608) với p = 941.

BÀI LÀM

(a) Ta cần tính log2 (13) với p = 23. Sử dụng phương pháp "vét cạn", ta tính được
27 = 128 ≡ 13 ( mod 23).
Vậy log2 (13) = 7 với p = 23.
(b) Tương tự, bằng phương pháp vét cạn, ta tính được
log10 (22) = 11
với p = 47.
(c) Tương tự, ta có
log627 (608) = 18
với p = 941.

0.10.3 Bài tập 2.5

Cho p là một số nguyên tố lẻ và g là một nghiệm nguyên thủy modulo p. Chứng


minh rằng a có căn bậc hai modulo p nếu và chỉ nếu logarit rời rạc của nó logg ( a)
modulo p là chẵn.

BÀI LÀM

[⇒] Giả sử phản chứng rằng m lẻ, nghĩa là tồn tại số tự nhiên k sao cho m = 2k + 1,
và giả sử gm là một căn bậc hai modulo p, nghĩa là gm ≡ c2 ( mod p). Khi đó, theo
định lý nhỏ Fermat ta có
c p−1 ≡ 1 ( mod p).
32
0.10. BÀI TẬP MỤC LỤC

Tuy nhiên, c p−1 ( mod p) cũng bằng với


p −1 p −1 p −1 p −1
c p −1 ≡ ( c 2 ) 2 ≡ ( gm ) 2 ≡ ( g2k+1 ) 2 ≡ gk( p−1) .g 2 ( mod p).
Một ứng dụng khác của Định lý nhỏ Fermat cho ta biết rằng
gk( p−1) ≡ ( g p−1 )k ≡ 1k ≡ 1 ( mod p)
Do đó, ta có
p −1
g 2 ≡ 1 ( mod p).
Điều này mâu thuẫn với việc g là một nghiệm nguyên thủy của F∗P , do đó mọi lũy
thừa lẻ của g không là một căn bậc hai modulo p.
[⇐] Giả sử logarit rời rạc của a modulo p là một số chẵn, tức là
logg ( a) = 2k

với k là một số nguyên nào đó. Điều này chỉ ra rằng


a = g2k = ( gk )2
Do đó
( gk )2 ≡ a ( mod p).
Ta thấy rằng gk chính là căn bậc hai modulo p của a. Vậy a có căn bậc hai modulo p.

0.10.4 Bài tập 2.6

Alice và Bob thống nhất sử dụng số nguyên tố p = 1373 và cơ số g = 2 cho một


trao đổi khóa Diffie-Hellman. Alice gửi Bob giá trị A = 974. Bob hỏi sự trợ giúp từ
bạn, và bạn đưa cho Bob giá trị lũy thừa bí mật b = 871. Vậy Bob phải gửi giá trị
nào cho Alice, và giá trị bí mật chung của hai người là bao nhiêu? Bạn có thể tìm ra
lũy thừa bí mật của Alice không?
BÀI LÀM
Giá trị mà Bob phải gửi cho Alice là
gb = 2871 ≡ 805 ( mod 1373)
Khi đó, giá trị bí mật chung của hai người là
Ab = 974871 ≡ 397 ( mod 1373)
Việc tìm ra lũy thừa bí mật của Alice là ta tìm giá trị x nguyên thỏa mãn đẳng thức
đồng dư
2x ≡ 974 ( mod 1373)
33
0.10. BÀI TẬP MỤC LỤC

Bằng phương pháp bước nhỏ-bước lớn của Shanks, ta tính được
x = 587.

0.10.5 Bài tập 2.7

Cho p là một số nguyên tố và g là một số nguyên. Bài toán Diffie-Hellman quyết


định được phát biểu như sau. Giả sử ta có bộ ba số A, B, và C, và giả sử thêm rằng
A ≡ g a ( mod p) B ≡ gb ( mod p),
nhưng bạn không nhất thiết phải biết các giá trị lũy thừa a và b. Phân biệt C liệu
có bằng với g ab ( mod p) hay không. Chú ý rằng điều này khác với bài toán Diffie-
Hellman đã được nêu ở trên. Bài toán Diffie-Hellman yêu cầu tính trực tiếp giá trị
của g ab .
(a) Chứng minh rằng một thuật toán giải được bài toán Diffie-Hellman có thể được
dùng để giải bài toán Diffie-Hellman quyết định.
(b) Bạn nghĩ rằng bài toán Diffie-Hellman quyết định là khó hay dễ? Tại sao?

BÀI LÀM

1. Giả sử có một thuật toán giải được bài toán Diffie-Hellman. Khi đó, nếu ta biết
các giá trị A = g a và B = gb thì thuật toán sẽ cho đầu ra là giá trị g ab .
Khi đó, ta chỉ cần so sánh giá trị của C với g ab đã biết. Vậy ta đã giải được bài
toán Diffie-Hellman quyết định.
2. Bài toán Diffie-Hellman quyết định không khó hơn bài toán Diffie-Hellamn,
theo nghĩa rằng nếu giải được bài toán Diffie-Hellman thì sẽ giải được bài toán
Diffie-Hellman quyết định.

0.10.6 Bài tập 2.8

Alice và Bob thống nhất sử dụng số nguyên tố p = 1373 và cơ số g = 2 để liên lạc


với nhau qua hệ mã hóa công khai ElGamal.
(a) Alice chọn a = 947 là khóa bí mật. Vậy khi đó khóa công khai A là bao nhiêu?
(b) Bob chọn b = 716 là khóa bí mật, khi đó khóa công khai tương ứng là
B ≡ 2716 ≡ 469 ( mod 1373).
Alice giải mã thông điệp m = 583 với khóa tức thời là k = 877. Vậy bản mã
(c1 , c2 ) mà Alice gửi cho Bob là gì?
34
0.10. BÀI TẬP MỤC LỤC

(c) Alice quyết định chọn khóa bí mật mới a = 299 tương ứng với khóa công khai
A ≡ 2299 ≡ 34 ( mod 1373). Bob mã hóa một thông điệp sử dụng khóa công
khai của Alice và gửi bản mã (c1 , c2 ) = (661, 1325). Hãy giải mã thông điệp.
(d) Bob chọn một khóa bí mật mới và công bố khóa công khai tương ứng B =
893. Alice mã hóa một thông điệp sử dụng khóa công khai này và gửi bản mã
(c1 , c2 ) = (693, 793) cho Bob. Eve can thiệp vào quá trình trao đổi khóa. Hãy
giúp Eve bằng cách giải bài toán logarit rời rạc 2b ≡ 893 ( mod 1373) và sử dụng
giá trị b để giải mã thông điệp.

BÀI LÀM

(a) Ta tính khóa công khai A bằng cách tính

A = g a ≡ 2974 ≡ 177 ( mod 1373)

(b) Với k = 877, giá trị của c1 là


c1 = gk ≡ 2877 ≡ 719 ( mod 1373)

và giá trị c2 là
c2 = m.Bk ≡ 583.469877 ≡ 623 ( mod 1373)
Khi đó, bản mã mà Alice gửi cho Bob là (c1 , c2 ) = (719, 623).
(c) Để giải mã thông điệp với bản mã (c1 , c2 ) = (661, 1325), a = 34, thì ta cần tính
m = (c1a )−1 .c2 = (66134 )−1 .1325 = 332

(d) Để giúp Eve can thiệp vào quá trình trao đổi, ta sẽ giải bài toán logarit rời rạc
2x ≡ 893 ( mod 1373).
Khi đó, ta tính được b = 219. Khi đó, với bản mã (c1 , c2 ) = (693, 793), để giải
mã thì Alice cần tính

(c1b )−1 .c2 = (693219 )−1 .793 = 365.

0.10.7 Bài tập 2.9

Giả sử rằng một oracle được đưa ra để giải bài toán Diffie-Hellman. Hãy giải
thích cách bạn sử dụng oracle đó để giải mã hệ mã hóa công khai ElGamal.

BÀI LÀM

35
0.10. BÀI TẬP MỤC LỤC

Trong hệ mã hóa công khai ElGamal, bạn biết khóa công khai của Alice A ≡
g a ( mod p) và biết bản mã chứa hai đại lượng c1 ≡ gk ( mod p) và c2 ≡ m.Ak ( mod
p), với k là khóa tức thời bí mật của Bob. Do bạn biết các giá trị g a và gk nên or-
acle của bài toán Diffie-Hellman sẽ tính được giá trị g ak ( mod p). Nhưng ta lại có
g ak ≡ Ak ( mod p), do đó ta có thể tìm được bản rõ của Bob bằng cách tính
( g ak )−1 .c2 = g−ak .m.Ak = g−ak .m.g ak ≡ m ( mod p).

0.10.8 Bài tập 2.10

Bài tập sau đây mô tả một hệ mã hóa công khai yêu cầu Bob và Alice trao đổi một
số thông điệp.
Bob và Alice cố định một số nguyên tố công khai p = 32611, và tất cả những số
khác được sử dụng đều là bí mật. Alice lấy thông điệp là m = 11111, chọn một số
nguyên bất kỳ a = 3589, và gửi số u = m a ( mod p) = 15950 cho Bob. Bob chọn một
số mũ bất kỳ b = 4037 và gửi v = ub ( mod p) = 15422 cho Alice. Alice khi đó tính
w = v15619 ≡ 27257 ( mod 32611) và gửi w = 27257 cho Bob. Cuối cùng, Bob tính
w31883 ( mod 32611) và khi đó thu được giá trị 11111, là thông điệp của Alice.
(a) Giải thích tại sao thuật toán hoạt động. Cụ thể, Alice sử dụng số a = 3589 và
15619 là các số mũ. Chúng liên hệ với nhau như nào? Tương tự, các số mũ của
Bob là b = 4037 và 31883 liên hệ với nhau như nào?
(b) Đưa ra công thức tổng quát cho hệ mã hóa này.
(c) Điểm yếu của hệ mã hóa này so với ElGamal là gì?
(d) Có điểm nào ở hệ mã hóa này hơn ElGamal? Cụ thể, Eve có thể phá vỡ nó nếu
cô ấy có thể giải bài toán logarit rời rạc? Liệu Eve có thể phá vỡ nó nếu cô ấy
giải được bài toán Diffie-Hellman?
BÀI LÀM
(a) Ta có |m| = 32610 và
3589.15619 ( mod 32610) ≡ 4037.31883 ( mod 32610) ≡ 1 ( mod 32610).

Vậy 15619 chính là phần tử nghịch đảo của a = 3589 trong nhóm nhân F32611 và
31883 là phẩn tử nghịch đảo của b = 4037 trong nhóm nhân trên.
Khi đó, ta có
 15619 31883
3589 4037
(m ) = m3589.4037.15619.31883 = m1 = m.

Vậy thuật toán hoạt động.


36
0.10. BÀI TẬP MỤC LỤC

(b) Giả sử Alice và Bob muốn gửi thông điệp bằng hệ mã hóa trên. Khi đó, Alice
và Bob lần lượt chọn các tham số bí mật a và b.

Thiết lập tham số công khai


Một bên thứ ba tin cậy chọn và công bố một số nguyên tố lớn p
và một phần tử g modulo p có cấp p − 1 lớn.
Alice Bob
Tạo khóa
Chọn tham số bí mật a ∈ [1, p − 1].
Chọn thông điệp m.
Gửi u = m a cho Bob.
Chọn tham số bí mật b ∈ [1, p − 1].
Gửi v = ub cho Alice.
Tính a−1 ( mod p − 1)
−1
Gửi w = v a cho Bob.
Giải mã

Tính b 1 ( mod p − 1)
−1
Tính m = wb .

(c) Hệ mã hóa công khai ElGamal chỉ yêu cầu Alice gửi Bob một tin nhắn duy nhất.
Hệ mã hóa mới này yêu cầu Alice gửi cho Bob hai thông điệp, và Bob phải gửi
một thông điệp cho Alice. Do đó hệ mã hóa mới này tương tác nhiều hơn và yêu
cầu nhiều sự liên lạc hơn so với ElGamal.
(d) Lợi thế của hệ mã hóa mới là Alice và Bob để lộ ít thông tin hơn trong hệ mã
hóa ElGamal. Tất nhiên, nếu Eve có thể giải bài toán logarit rời rạc, khi đó, do
Eve biết u, v và w, cô ấy có thể giải
w ≡ v x ( mod p)

để thu được x = a0 , và do đó có thể khôi phục lại m do


0 0
u a ≡ m aa ≡ m ( mod p).

Tuy nhiên, không có cách dễ dàng nào cho Eve để phá được hệ mã hóa trên nếu
cô ấy có thể giải được bài toán Diffie-Hellman. Do đó, hệ mã hóa mới này có
tiềm năng an toàn hơn hệ ElGamal, nếu nó bài toán Diffie-Hellman dễ hơn bài
toán logarit rời rạc.

37
0.10. BÀI TẬP MỤC LỤC

0.10.9 Bài tập 2.11

Nhóm S3 gồm 6 phần tử phân biệt sau đây


e, σ, σ2 , τ, στ, σ2 τ.
với e là phần tử trung hòa và phép nhân được tính theo quy tắc
σ3 = e, τ 2 = 1, τσ = σ2 τ.
Tính các giá trị sau trong nhóm S3 :

(a) τσ2 .
(b) τ (στ ).
(c) (στ )(στ ).
(d) (στ )(σ2 τ ).

Nhóm S3 có giao hoán không?

BÀI LÀM

(a) Ta có
τσ2 = (τσ ).σ = σ2 τ.σ = σ2 .σ2 τ = σ3 .στ = στ.
(b) Ta có
τ (στ ) = (τσ )τ = σ2 ττ = σ2 τ 2 = σ2 .
(c) Ta có
(στ )(στ ) = σ(τσ)τ = σσ2 ττ = σ3 τ 2 = e.
(d) Ta có
(στ )(σ2 τ ) = σ(τσ)στ = σσ2 τστ = σ3 (τσ)τ = σ2 ττ = σ2 .

Hiển nhiên nhóm S3 ko giao hoán do


τσ = σ2 τ 6= στ.

0.10.10 Bài tập 2.12

Cho G là một nhóm, d ≥ 1 là một số nguyên, và định nghĩa tập con của G bởi
G [ d ] = { g ∈ G : g d = e }.

(a) Chứng minh rằng nếu g nằm trong G [d] thì g−1 cũng thế.
38
0.10. BÀI TẬP MỤC LỤC

(b) Giả sử rằng G là giao hoán. Chứng minh rằng nếu g và h nằm trong G [d] thì g.h
cũng nằm trong đó.
(c) Suy ra rằng nếu G là giáo hoán, thì G [d] là giao hoán.
(d) Chỉ ra một ví dụ rằng nếu G là nhóm không giao hoán, thì G [d] không nhất
thiết là một nhóm.

BÀI LÀM

(a) Ta có
( g−1 )d = g−d = ( gd )−1 = e−1 = e.
Khi dấu bằng thứ 3 xảy ra do g ∈ G [d].
(b) Giả sử g và h nằm trong G [d], khi đó ta có
( gh)d = gd hd = e.e = e.
Trong đó dấu bằng thứ nhất xảy ra do g và h nằm trong G [d].
(c) Hiển nhiên e nằm trong G [d]. Từ phần (a) và(b) ta suy ra G [d] là một nhóm nếu
G là một nhóm giao hoán.
(d)

0.10.11 Bài tập 2.13

Cho G và H là các nhóm. Một hàm φ : G → H được gọi là một đồng cấu nhóm
nếu nó thỏa mãn
φ( g.h) = φ( g).φ(h) với mọi g, h ∈ G.

(a) Cho eG là phần tử trung hòa của G, và e H là phần tử trung hòa của H, và cho
g ∈ G. Chứng minh rằng

φ(eG ) = e H và φ ( g −1 ) = φ ( g ) −1 .

(b) Cho G là một nhóm giao hoán. Chứng minh rằng ánh xạ φ : G → G được định
nghĩa bởi φ( g) = g2 là một đồng cấu.
(c) Câu hỏi tương tự câu (b) với φ( g) = g−1 .

BÀI LÀM

39
0.10. BÀI TẬP MỤC LỤC

(a) Với g ∈ G, ta có
φ( g) = φ( g.eG ) = φ( g).φ(eG ).
Giản ước hai vế ta suy ra
φ(eG ) = e H .
Mặt khác, ta có
φ(eG ) = φ( g.g−1 ) = φ( g).φ( g−1 ).
Chuyển vế ta có
φ( g−1 ) = (φ( g))−1 .
(b) Giả sử g và h trong G. Khi đó, ta có
φ( gh) = ( gh)2 = g2 h2 = φ( g).φ(h).
Trong đó, dấu bằng thứ 2 xảy ra do G là một nhóm giao hoán. Vậy φ là một
đồng cấu.
(c) Với g và h nằm trong nhóm G, ta có
φ( gh) = ( gh)−1 = h−1 g−1 = g−1 h−1 .
Trong đó dấu bằng cuối cùng xảy ra do G là nhóm giao hoán.

0.10.12 Bài tập 2.14

Chứng minh rằng các ánh xạ sau là đồng cấu.


(a) Ánh xạ φ : Z → Z/NZ chuyển a ∈ Z thành a mod N trong Z/NZ.
 
a 0
(b) Ánh xạ φ : R → GL2 (R) được định nghĩa bởi φ( a) = .
0 a −1
(c) Ánh xạ logarit rời rạc logg : F∗p → Z/( p − 1)Z, với g là một nghiệm nguyên
thủy modulo p.

BÀI LÀM

(a) Lấy a và b nằm trong Z. Khi đó, ta có


φ( ab) = ab ( mod N ) ≡ a ( mod N ).b ( mod N ) = φ( a).φ(b).
Vậy φ là một đồng cấu nhóm.
(b) Lấy a, b ∈ R∗ , khi đó ta có
       
a 0 b 0 ab 0 ab 0
φ( a).φ(b) = . = = = φ( ab).
0 a −1 0 b −1 0a−1 b−1 0( ab)−1
40
0.10. BÀI TẬP MỤC LỤC

(c) Lấy a, b ∈ F∗p . Khi đó ta có


logg ( ab) = logg ( a) + logg (b).
Công thức đã được chứng minh ở bài trước.

0.10.13 Bài tập 2.15

(a) Chứng minh rằng GL2 (F p ) là một nhóm


(b) Chỉ ra rằng GL2 (F p ) là một nhóm không giao hoán với mọi p.
(c) Có bao nhiêu phần tử trong GL2 (F p )?
(d) Có bao nhiêu phần tử trong GLn (F p )?

BÀI LÀM

(a) Lấy hai ma trận


   
a b x y
A= và B = ∈ GL2 (F p ).
c d z t
Khi đó, ta có
    
a b x y ax + bz ay + bt
AB = = ∈ GL2 (F p ).
c d z t cx + dz cy + dt
Ma trận đơn vị là  
1 0
E2 =
0 1
và nghịch đảo của ma trận A là
 
1 d −c
A −1 =
ad − bc −b a
với các số được lấy theo modulo p.
Vậy GL2 (F p ) là một nhóm.
(b) Nhóm GL2 (F p ) không là một nhóm giao hoán do
         
1 1 1 0 2 1 1 1 1 0 1 1
= 6= = .
0 1 1 1 1 1 1 2 1 1 0 1

41
0.10. BÀI TẬP MỤC LỤC

(c) Ta có GL2 (F p ) là nhóm các ma trận cấp 2 có định thức khác 0 với các phần tử
trong F p . Số cách để chọn cột đầu tiên là p2 − 1, và số cách để chọn cột còn lại
độc lập tuyến tính với cột đã cho là p2 − p. Vậy số phần tử là
| GL2 (F p )| = ( p2 − 1)( p2 − p) = p( p − 1)2 ( p + 1).

(d) Áp dụng cách làm tương tự, số phần tử của GLn (F p ) là


n −1
| GLn (F p )| = ∏ ( p n − p i ).
i =0

0.10.14 Bài tập 2.16

Xác thực các khẳng định sau đây



(a) x2 + x = O( x2 ),
(b) 6x2 − 37x5 + 5 = O( x5 ),
(c) k300 = O(2k ),
(d) (ln k)375 = O(k0,001 ),
(e) k2 2k = O(e2k ),
(f) N 10 2 N = O(e N ).

BÀI LÀM

(a) Ta có √
x2 + x
lim = 1.
x2

Vậy x2 + x = O ( x 2 ).
(b) Ta có
6x2 − 37x5 + 5
lim = 1.
x5
Vậy 6x2 − 37x5 + 5 = O( x5 ).
(c) Ta tính
k300
lim
2k

42
0.10. BÀI TẬP MỤC LỤC

Ta thấy cả tử và mẫu tiến đến vô cùng khi k tiến đến vô cùng. Áp dụng quy tắc
L’Hospital liên tục, khi đó giới hạn đã cho trở thành
300!
lim = 0.
(ln 2)300 .2k
Vậy k300 = O(2k ).
(d) Ta tính
(ln k)375
lim 0,001
k
Áp dụng L’Hospital liên tiếp ta có giới hạn trên bằng
1
lim = 0.
k375,001
Vậy (ln k)375 = O(k0,001 ).
(e) Ta có
k2 .2k k2
lim = lim  2 k
e2k e
2

Áp dụng L’Hospital 2 lần, ta tính được giới hạn trên bằng 0. Do đó k2 2k =


O(e2k ).
(f) Ta tính giới hạn
N 10 2 N N 10
lim = lim  N .
eN e
2
Áp dụng quy tắc L’Hospital liên tiếp, ta có
N 10
lim  = 0.
e N
2

Vậy N 10 2 N = O(e N ).

0.10.15 Bài tập 2.17

Sử dụng phương pháp bước nhỏ-bước lớn của Shanks để giải các bài toán logarit
rời rạc sau.

(a) 11x = 21 trong F71 .


(b) 156x = 116 trong F593 .
43
0.10. BÀI TẬP MỤC LỤC

(c) 650x = 2213 trong F3571 .

BÀI LÀM

(a) Ta giải bài toán logarit rời rạc


11x = 21 trong F71 .

Cấp của phần tử 11 trong F71 là 70. Khi đó, ta tính


Danh sách 1:1, 11, 50, 53, 15, 23, 40, 14, 12, 61.

Danh sách 2:21, 5, 35, 32, 11, 6, 42, 10, 70, 64.
Ta thấy rằng
111 = 21.11−9.4 .
Vậy x = 1 + 9.4 = 37.
(b) Ta giải bài toán logarit rời rạc

156x = 116 trong F593 .



Cấp của phần tử 156 trong F593 là 148. Ta đặt N = d 148e = 13 và H = h− N =
156−13 = 297. Ta có bảng sau

k hk a.H k
1 156 58
2 23 29
3 30 311
4 529 452
5 97 226
6 307 113
7 452 353

Từ bảng trên ta thấy rằng


1567 = 116.2974 = 452 trong F593 .

Khi đó, ta có
16 = 1567 .2974 = 1567 .(13613 )4 = 15659 trong F593 ,

do đó nghiệm là x = 59.

44
0.10. BÀI TẬP MỤC LỤC

(c) Ta có h = 650 có cấp 510 trong F3571 . Đặt N = d 510e = 23 và H = h− N =
650−23 = 1925. Ta có bảng sau

k hk a.H k k hk a.H k k hk a.H k k hk a.H k


1 650 3393 6 1650 694 11 2815 2430 16 2476 677
2 1122 166 7 1200 396 12 1398 3311 17 2450 3381
3 816 1731 8 1522 1677 13 1666 3011 18 3405 2063
4 1892 432 9 133 41 14 887 442 19 2801 323
5 1376 3128 10 746 363 15 1619 952 20 3011 421

Ta thấy rằng
65020 = 2213.192513 = 3011 trong F3571 .
Lại có 1925 = 650−23 , ta tính được
2213 = 65020 .1925−13 = 65020 .(65023 )13 = 650319 trong F3571 ,

Vậy nghiệm của phương trình là x = 319.

0.10.16 Bài tập 2.18

Giải mỗi hệ phương trình đồng dư sau (hoặc giải thích tại sao không có nghiệm).

(a) x ≡ 3 ( mod 7) và x ≡ 4 ( mod 9).


(b) x ≡ 137 ( mod 423) và x ≡ 87 ( mod 191).
(c) x ≡ 133 ( mod 451) và x ≡ 237 ( mod 697).
(d) x ≡ 5 ( mod 9), x ≡ 6 ( mod 10), và x ≡ 7 ( mod 11).
(e) x ≡ 37 ( mod 43), x ≡ 22 ( mod 49), và x ≡ 18 ( mod 71).

BÀI LÀM

(a) Do x ≡ 3 ( mod 7) nên x có dạng x = 7k + 3 với k là một số nguyên dương. Mặt


khác, lại có x ≡ 4 ( mod 9) nên ta có
7k + 3 ≡ 4 ( mod 9) hay 7k ≡ 1 ( mod 9)

Nhân hai vế với nghịch đảo của 7 modulo 11 là 4. Khi đó, ta có


k ≡ 1.4 ( mod 9).

Do đó k = 9n + 4. Do đó x = 7.4 + 3 = 31.

45
0.10. BÀI TẬP MỤC LỤC

(b) Do x ≡ 87 ( mod 191) nên x có dạng x = 191k + 87 với k là một số nguyên


dương. Mặt khác, lại có x ≡ 137 ( mod 423) nên ta có

191k + 87 ≡ 137 ( mod 423) hay 191k ≡ 50 ( mod 423)


Nhân hai vế với nghịch đảo của 191 modulo 423 là 392. Khi đó, ta có
k ≡ 50.392 ( mod 423) = 142 ( mod 423).

Do đó k = 423n + 142. Do đó x = 191.142 + 87 = 27209.


(c) Do x ≡ 133 ( mod 451) nên x có dạng x = 451k + 133 với k là một số nguyên
dương. Mặt khác, lại có x ≡ 237 ( mod 697) nên ta có

451k + 133 ≡ 237 ( mod 697) hay 451k ≡ 104 ( mod 697)
Tuy nhiên, 451 ko có nghịch đảo của phép nhân modulo 697 do 451 và 697
không nguyên tố cùng nhau. Vậy không tồn tại nghiệm.

0.10.17 Bài tập 2.19

Ta có một số đồ vật, nhưng ta không biết chính xác có bao nhiêu. Nếu ta xếp hàng
ba cái một thì sẽ thừa hai cái. Nếu xếp thành 5 cái một hàng thì sẽ thừa 3 cái. Nếu
ta xếp thành 7 cái một hàng thì sẽ thừa 2 cái. Vậy có bao nhiêu đồ vật?

BÀI LÀM

Gọi x là số đồ vật. Khi đó, ta giải hệ phương trình đồng dư


x ≡ 2 ( mod 3), x ≡ 3 ( mod 5), x ≡ 2 ( mod 7).

Do x ≡ 2 ( mod 3), do đó x = 3k + 2 với k là một số tự nhiên nào đó. Lại có từ


phương trình thứ hai ta có

3k + 2 ≡ 3 ( mod 5) hay k ≡ 2 ( mod 5).


Vậy k = 5n + 2 với n là một số tự nhiên nào đó, suy ra x = 3(5n + 2) + 2 = 15n + 8.
Và cuối cùng, từ phương trình thứ 3 ta có
15n + 8 ≡ 2 ( mod 7), hay n ≡ 1 ( mod 7).

Do đó n = 7m + 1 với m là một số tự nhiên nào đó. Khi đó, ta có x = 15(7m + 1) +


8 = 105m + 23. Vậy số đồ vật là 23 với đây là số đồ vật ít nhất thỏa mãn đề bài.

46
0.10. BÀI TẬP MỤC LỤC

0.10.18 Bài tập 2.21

Cho x = c và x = c0 là hai nghiệm của hệ phương trình đồng dư của Định lý


thặng dư Trung Hoa. Chứng minh rằng

c ≡ c0 ( mod m1 . . . mk ).

BÀI LÀM

Giả sử c và c0 là hai nghiệm của Định lý thặng dư Trung Hoa. Khi đó, ta có
c ≡ c0 ≡ a1 ( mod m1 ).

Do đó m1 |(c − c0 ). Lập luận tương tự ta cũng có mi |(c − c0 ) với 1 ≤ i ≤ k. Do đó


lcm(m1 , . . . , mk )|(c − c0 ).

Do mi , m j đôi một nguyên tố cùng nhau với i 6= j nên ta có lcm(m1 , . . . , mk ) =


m1 . . . mk . Do đó
m1 . . . mk |(c − c0 ).
Vậy
c ≡ c0 ( mod m1 . . . mk ).

0.10.19 Bài tập 2.23

Sử dụng phương pháp đã nói trong phần (0.8.1) để tìm các cắn bậc hai của các
modulo hợp số

(a) Tìm một căn bậc hai của 340 modulo 437.
(b) Tìm một căn bậc hai của 253 modulo 3143.
(c) Tìm bốn căn bậc hai của 2833 modulo 4189.
(d) Tìm tám căn bậc hai của 813 modulo 868.

BÀI LÀM

(a) Ta tìm phần tử x sao cho

x2 ≡ 340 ( mod 437).


Ta có 437 = 19.23, khi đó, ta sẽ giải hệ phương trình đồng dư

y2 ≡ 340 ≡ 17 ( mod 19), z2 ≡ 340 ≡ 18 ( mod 23).

47
0.10. BÀI TẬP MỤC LỤC

Do cả 19 và 23 đều đồng dư 3 modulo 4, ta có thể tìm căn bậc hai bằng cách sử
dụng Mệnh đề (0.8.4) và sử dụng phương pháp "vét cạn". Khi đó, ta có

y ≡ ±6, z ≡ ±8.
Ta chọn hai nghiệm dương, khi đó, sử dụng Định lý thặng dư Trung Hoa để giả
hệ phương trình đồng dư
x ≡ 6 ( mod 19), x ≡ 8 ( mod 23).

Giải ra ta được x = 215.


(b) Ta tìm nghiệm x sao cho

x2 ≡ 253 ( mod 3143).


Ta có 3143 = 7.449. Khi đó, ta giải hệ phương trình đồng dư

y2 ≡ 253 ≡ 1 ( mod 7), z2 ≡ 253 ( mod 449)


Dễ thấy rằng y = ±1 là nghiệm của phương trình đầu. Ta giải phương trình
z2 ≡ 253 ( mod 449).

(c) Ta tìm số nguyên x sao cho


x2 ≡ 2833 ( mod 4189)

Ta lại có 4189 = 59.71 và 59, 71 đều đồng dư 3 modulo 4. Khi đó, ta tìm các số
y, z thỏa mãn

y2 ≡ 2833 ≡ 1 ( mod 59), z2 ≡ 2833 ≡ 64 ( mod 71).


Áp dụng Mệnh đề 2.27 ta có

y ≡ ±1, ( mod 59), z ≡ ±8 ( mod 71).


Vậy ta có 4 giá trị của x

y 1 1 -1 -1
z 8 -8 8 -8
x 1712 3187 1002 2477

(d) Ta tìm số nguyên x sao cho


x2 ≡ 813 ( mod 868).

48
0.10. BÀI TẬP MỤC LỤC

Lại có 868 = 4.7.31. Khi đó, ta tìm các số a, b, c thỏa mãn


a2 ≡ 813 ≡ 1 ( mod 4), b2 ≡ 813 ≡ 1 ( mod 7), c2 ≡ 813 ≡ 7 ( mod 31).
Dễ dàng thấy rằng

a ≡ ±1 ( mod 4), b ≡ ± ( mod 7).


Áp dụng Mệnh đề (0.8.4) ta tính được

c ≡ ±10 ( mod 31)


Vậy ta có 8 giá trị của x như sau

a 1 1 1 1 -1 -1 -1 -1
b 1 1 -1 -1 1 1 -1 -1
c 10 -10 10 -10 10 -10 10 -10
x 785 393 41 517 351 827 475 83

0.10.20 Bài tập 2.26

Cho F p là một trường hữu hạn và N | p − 1. Chứng minh rằng F∗p có một phần tử
cấp N. Điều này đúng với mỗi lũy thừa nguyên tố chia hết p − 1.

BÀI LÀM

Gọi g là một phần tử căn nguyên thủy. Khi đó ta có cấp của g là p − 1. Vậy phần tử
p −1
h=g N là một phần tử cấp N trong F∗p .

0.10.21 Bài tập 2.28

Sử dụng thuật toán Polig-Hellman để giải các bài toán logarit rời rạc

gx = a trong Fp
trong mỗi trường hợp sau

(a) p = 433, g = 7, a = 166.


(b) p = 746497, g = 10, a = 243278.
(c) p = 41022299, g = 2, a = 39183497.
(d) p = 1291799, g = 17, a = 192988.

49
0.10. BÀI TẬP MỤC LỤC

BÀI LÀM

(a) Ta có p − 1 = 432 = 24 .33 . Do đó, Bước 1, ta sẽ giải các phương trình


e e
q e h = g( p−1)/q b = a( p−1)/q y với hy = b
2 4 265 250 15
3 3 374 335 20

Bước 2, ta sẽ giải
x ≡ 15 ( mod 24 ), x =≡ 20 ( mod 33 ).
Do x ≡ 15 ( mod 24 ) nên ta có x = 16k + 15 với k là một số tự nhiên. Khi đó, từ
phương trình thứ hai ta có
16k + 15 = 20 ( mod 27), hay k ≡ 2 ( mod 27).

Do đó x = 16(27n + 2) + 15 = 512n + 47. Vậy x = 47.


(b) Ta có p − 1 = 746496 = 210 .36 . Khi đó, ta sẽ giải
e e
q e h = g( p−1)/q b = a( p−1)/q y với hy = b
2 10 4168 38277 523
3 6 674719 322735 681

Bước 2, ta sẽ giải hệ

x ≡ 523 ( mod 210 ), x ≡ 681 ( mod 36 ).


Do x ≡ 523 ( mod 1024) nên x = 1024k + 523. Từ phương trình thứ hai ta có

1024k + 523 ≡ 681 ( mod 729), hay k ≡ 218( mod 729).


Vậy k = 729n + 218, suy ra x = 1024(729n + 218) + 523 = 746496n + 223755.
Vậy x = 223755.
(c) Ta có p − 1 = 41022298 = 2.295 . Khi đó, ta giải
e e
q e h = g( p−1)/q b = a( p−1)/q y với hy = b
2 1 41022298 1 0
29 5 4 11844727 13192165

Để giải được bài toán logarit rời rạc ở hàng dưới, tức là tìm y sao cho

4y ≡ 11844727 ( mod 41022299)


50
0.10. BÀI TẬP MỤC LỤC

Áp dụng Mệnh đề (0.9.3) để giải bài toán logarit rời rạc trên, với dữ kiện là
4
429 = 18794375 là một phần tử cấp 29 trong F∗p . Để tránh nhầm lẫn ký hiệu, ta
sẽ viết u là lũy thừa cần tìm.
Đầu tiên, ta giải
4
18794375u0 = (11844727)29 = 987085.

Nghiệm của phương trình này là u0 = 7. Giá trị của u ở bước này là u = 7.
Tiếp theo, ta giải
3
18794375u1 = (11844727.4−7 )29 = 8303208.
Nghiệm của phương trình này là u1 = 8. Giá trị của u ở bước này là u = 239 =
7 + 8.29.
Tiếp theo, ta giải
2
18794375u2 = (11844727.4−239 )29 = 30789520.
Nghiệm của phương trình này là u2 = 26. Giá trị của u ở bước này là u =
22105 = 7 + 8.29 + 26.292 .
Tiếp theo, ta giải
1
18794375u3 = (11844727.4−22105 )29 = 585477.

Nghiệm của phương trình này là u3 = 18. Giá trị của u ở bước này là u =
461107 = 7 + 8.29 + 26.292 + 18.293 .
Cuối cùng, ta giải
0
18794375u4 = (11844727.4−461107 )29 = 585477.
Nghiệm của phương trình này là u4 = 18. Giá trị của u ở bước này là u =
13192165 = 7 + 8.29 + 26.292 + 18.293 + 18.294 .
Vậy giá trị cuối cùng của u là
u = 13192165 = 7 + 8.29 + 26.292 + 18.293 + 18.294 ,
chính là giá trị ở cột cuối cùng của bảng trên.
Bước tiếp theo là giải hệ phương trình

x ≡ 0 ( mod 2), x ≡ 13192165 ( mod 295 ).


Bằng cách giải tương tự, ta có x = 33703314.
51
0.10. BÀI TẬP MỤC LỤC

(d) Ta có p − 1 = 1291798 = 2.709.911. Khi đó, ta giải


e e
q e h = g( p−1)/q b = a( p−1)/q y với hy = b
2 1 1291798 1 0
709 1 679773 566657 322
911 1 329472 898549 534

Ta cần giải các bài toán logarit rời rạc


679773a ≡ 566657 ( mod 1291799) và 329472b ≡ 898549 ( mod 1291799).
• Xét bài toán
679773a ≡ 566657 ( mod 1291799).
Sử dụng thuật toán va chạm. Ta có cấp của 679773 trong F∗p là 709. Khi đó,

ta đặt N = d 709e = 27, và H = h− N = 679773−27 = 1163228. Ta có các
bảng sau đây
k hk a.H k k hk a.H k
1 679773 514654 8 628131 33662
2 619440 240743 9 419999 861447
3 1201482 227586 10 899639 452224
4 273032 871342 11 1029156 981086
5 560411 664194 12 627952 1088847
6 741603 869719 13 169738 693591
7 1011766 63489 14 1114593 1071906
k hk a.H k k hk a.H k
15 402512 841788 22 570648 925880
16 843586 1270669 23 656591 543968
17 616491 51933 24 777755 779931
18 131154 231288 25 981086 680573
19 148258 283532 26 1287346 637680
20 794650 575008 27 947687 743652
21 361012 303202 28 916344 421693
Ta thấy rằng
67977325 = 566657.(679773−27 )11 .
Suy ra
67977325+27.11 = 566657.
Vậy a = 25 + 27.11 = 322.
52
0.10. BÀI TẬP MỤC LỤC

Làm tương tự với bài toán sau, ta tính được nghiệm của bài toán logarit rời rạc
sau là y = 534. Khi đó, nghiệm của bài toán ban đầu thỏa mãn hệ phương trình
đồng dư
x ≡ 0 ( mod 2), x ≡ 322 ( mod 709), x ≡ 534 ( mod 911).

Nghiệm của bài toán này là x = 984414.

53

You might also like