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

thiết kế và hiện thực một số lõi ip chuyên dụng cho các hệ mã công khai và mã dòng thực hiện trên fpga

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 (9.02 MB, 222 trang )



BỘ KHOA HỌC VÀ CÔNG NGHỆ
Chương trình KH&CN trọng điểm cấp nhà nước KC.01/11-15
“Nghiên cứu ứng dụng và phát triển công nghệ Thông tin
và Truyền thông”



BÁO CÁO TỔNG KẾT ĐỀ TÀI
“THIẾT KẾ VÀ HIỆN THỰC MỘT SỐ LÕI IP CHUYÊN DỤNG CHO
CÁC HỆ MÃ CÔNG KHAI VÀ MÃ DÒNG THỰC HIỆN TRÊN FPGA”
- Mã số KC.01.TN16/11-15






Chủ nhiệm đề tài: PGS.TS. Nguyễn Đình Thúc
Cơ quan chủ trì: Trường ĐH Khoa học Tự nhiên, ĐHQG Tp. HCM





Tháng 1 năm 2013

i

MỤC LỤC



Chương 1. Thiết kế và thực hiện một số lõi IP chuyên dụng cho các hệ mã công khai và mã
dòng thực hiện trên FPGA 1
1.1. Mở đầu 1
1.2. Mục tiêu đề tài và nội dung thực hiện 4
1.2.1. Mục tiêu đề tài 4
1.2.2. Nội dung thực hiện 5
1.3. Sản phẩm và kết quả thực hiện 6
1.4. Bố cục báo cáo 7
2.1. Định lý RSA 9
Chương 2: Mã công khai – RSA 9
2.2. Nhị phân hóa phép cộng và nghịch đảo modulo 10
2.2.1. Thuật toán 10
2.2.1.1. Cơ sở toán học 10
2.2.1.2. Nhị phân hóa phép nghịch đảo modulo 12
2.2.1.3. Tính hiệu quả và khả năng cứng hóa của thuật toán 15
2.3. Phép nhân nhanh modulo và phép lũy thừa nhanh modulo. 15
2.3.1. Phép toán trên vành ℤm 15
2.3.2. Thuật toán 17
2.3.2.1. Phép nhân nhanh modulo 17
2.3.2.1.1. Giới thiệu 17
2.3.2.1.2. Trình bày thuật toán 18
2.3.2.2. Phép lũy thừa nhanh modulo 19
2.3.2.3. Ví dụ 20
2.3.2.4. Tính hiệu quả và khả năng cứng hóa của thuật toán 21
2.4. Xây dựng giải thuật sinh số nguyên tố an toàn và hiệu quả 21
2.4.1. Cơ sở toán học 21
2.4.2. Thuật toán 24
2.4.2.1. Thuật toán phát sinh số nguyên tố ngẫu nhiên 24
2.4.2.2. Thuật toán phát sinh số nguyên tố ngẫu nhiên cải tiến 24

2.4.2.3. Thuật toán phát sinh số nguyên tố mạnh Gordon 24
2.4.2.4. Thuật toán kiểm tra số nguyên tố - Thuật toán Rabin-Miller 25
ii

2.4.3. Tính hiệu quả của thuật toán 27
2.5. Phân tích và xây dựng thuật giải sinh khóa RSA 27
2.5.1. Cơ sở toán học 27
2.5.2. Thuật toán 30
2.5.3. Tính hiệu quả và khả năng cứng hóa của thuật toán 31
2.6. Nhị phân hóa hệ mã RSA. 31
2.6.1. Thuật toán 31
2.6.1.1. Mô hình các module cài đặt RSA 31
2.6.1.2. Chi tiết cài đặt RSA 32
2.6.2. Tính hiệu quả của thuật toán được thể hiện qua kết quả thử nghiệm sau: 33
2.7. Chương trình mô phỏng phần mềm và đánh giá RSA. 33
2.7.1. Giới thiệu 33
2.7.2. Phân tích thực nghiệm RSA 34
2.7.2.1. Sinh khóa RSA 34
2.7.2.2. Mã hóa và giải mã 36
2.7.2.3. Ký và xác thực chữ ký 37
2.7.3. Thám mã RSA 39
2.7.3.1. Giới thiệu 39
2.7.3.2. Phân tích ra thừa số dùng phương pháp Pollar 39
2.7.3.3. Tấn công phục hồi khóa bí mật kích thước nhỏ 40
Chương 3: Mã dòng – ZUC 42
3.1. Giới thiệu 42
3.2. Nghiên cứu và mô phỏng hệ mã ZUC 43
3.2.1. Giới thiệu 43
3.2.2. Mã ZUC 44
3.3. Thiết kế SBox 45

3.3.1. Mở đầu 45
3.3.2. Biểu diễn cấu trúc toán học của S-Box 46
3.3.2.1. Cơ sở toán học 46
3.3.2.2. Kiến trúc S-Box 47
3.3.2.3. Đánh giá 47
3.3.3. Thiết lập tiêu chí S-Box an toàn qua các kỹ thuật thám mã 48
3.3.3.1. Thám mã phân biệt tuyến tính 48
3.3.3.2. Thám mã SOBER-t32 và SNOW 2.0 (các hệ mã có cấu trúc tương tự ZUC) 49
iii

3.3.3.2.1. SOBER-t32 49
3.3.3.2.2. SNOW 2.0 50
3.3.3.2.3. Kết quả SOBER-t32 52
3.3.3.2.4. Kết quả SNOW 2.0 52
3.3.3.3. Tạo và kiểm định chuỗi ngẫu nhiên 53
3.3.3.3.1. Giới thiệu 53
3.3.3.3.2. Phương pháp 53
3.3.3.3.3. Kết quả 54
3.4. Xây dựng bộ sinh khóa dòng cho ZUC. 54
3.5. Nhị phân hóa hệ mã ZUC 54
3.5.1. Thuật giải 54
3.5.2. Cài đặt của các phần chính 56
3.5.3. Phân tích tính đúng đắn, hiệu quả và khả năng cứng hóa của thuật giải 60
3.5.4. Mô hình cài đặt 61
3.6. Mô phỏng phần mềm và đánh giá ZUC 62
3.6.1. Kiểm tra tính ngẫu nhiên của chuỗi số sinh bởi ZUC 62
3.6.2. Phân tích cấu trúc ZUC 67
Chương 4: Quy trình thiết kế lõi IP 68
4.1. Quy trình tổng quát thiết kế lõi IP cho FPGA 68
4.1.1. Đặc tả thiết kế: 69

4.1.2. Xây dựng mô hình thiết kế 69
4.1.3. Hiện thực mô hình bằng ngôn ngữ phần cứng 70
4.1.4. Kiểm tra chức năng của thiết kế 71
4.1.5. Tổng hợp thiết kế thành mức cổng 72
4.1.6. Kiểm tra thời gian của thiết kế 73
4.1.7. Kiểm tra trên FPGA 73
4.2. Minh họa với quy trình thiết kế lõi IP RSA 74
4.2.1. Đặc tả thiết kế RSA 74
4.2.2. Xây dựng mô hình thiết kế RSA 76
4.2.3. Hiện thực mô hình RSA bằng ngôn ngữ phần cứng 79
4.2.4. Kiểm tra chức năng của thiết kế RSA 81
4.2.5. Tổng hợp thiết kế RSA thành mức cổng 83
4.2.6. Kiểm tra thời gian của thiết kế RSA 84
4.2.7. Kiểm tra thiết kế RSA trên FPGA 86
iv

4.3. Kết luận 87
Chương 5: Các Lõi IP Chuyên Dụng 88
5.1. Các lõi phụ trợ tính toán MAP-Coprocessor 89
5.1.1. Khối Mod2048 89
5.1.1.1. Đặc tả thiết kế 89
5.1.1.2. Xây dựng mô hình thiết kế 90
5.1.1.3. Kiểm tra chức năng của thiết kế 103
5.1.1.4. Kiểm tra thời gian trên FPGA 108
5.1.2. Khối Mul1024 110
5.1.2.1. Đặc tả thiết kế 110
5.1.2.2. Xây dựng mô hình thiết kế 111
5.1.2.3. Kiểm tra chức năng của thiết kế 117
5.1.2.4. Tổng hợp thiết kế trên FPGA 120
5.1.2.5. Kiểm tra thời gian trên FPGA 122

5.2. Lõi IP RSA-Coprocessor 124
5.2.1. Đặc tả thiết kế 124
5.2.2. Xây dựng mô hình thiết kế 127
5.2.2.1. Khối RegA 130
5.2.2.2. Khối RegB 130
5.2.2.3. Khối RegN 131
5.2.2.4. Khối RegN0 132
5.2.2.5. Khối RegZ1 132
5.2.2.6. Khối MonModInverse 133
5.2.2.7. Khối MonPro 134
5.2.3. Kiểm tra chức năng của thiết kế 134
5.2.4. Tổng hợp thiết kế trên FPGA 137
5.2.4.1. Cyclone IV 137
5.2.4.2. Aria II 138
5.2.4.3. Stratix III 138
5.2.4.4. Stratix IV 139
5.2.4.5. Tổng hợp 139
5.2.5. Kiểm tra thời gian của thiết kế trên FPGA 140
5.2.5.1. Cyclone IV 140
5.2.5.2. Aria II 140
v

5.2.5.3. Stratix III 140
5.2.5.4. Stratix IV 140
5.2.5.5. Tổng hợp 141
5.2.6. Kiểm tra thiết kế trên các loại FPGA 141
5.2.6.1. Chức năng 141
5.2.6.2. Thời gian đáp ứng 142
5.3. Lõi IP ZUC-Coprocessor 144
5.3.1. Đặc tả thiết kế 144

5.3.2. Xây dựng mô hình thiết kế 146
5.3.2.1. Khởi tạo 148
5.3.2.2. BitReorganization 149
5.3.2.3. Dịch thanh ghi hồi đáp tuyến tính 150
5.3.2.4. Module hàm tuyến tính L1 150
5.3.2.5. Module hàm tuyến tính L2 151
5.3.2.6. Giá trị khởi tạo cho mảng hằng D trong bước khởi động khóa (Ek_d) 151
5.3.2.7. S-Box S0 152
5.3.2.8. S-Box S1 154
5.3.3. Kiểm tra chức năng của thiết kế 156
5.3.3.1. Testbench 157
5.3.3.2. Dạng sóng 157
5.3.4. Tổng hợp thiết kế trên FPGA 159
5.3.4.1. Cyclone IV 159
5.3.4.2. Aria II 160
5.3.4.3. Stratix III 160
5.3.4.4. Stratix IV 161
5.3.4.5. Tổng hợp 161
5.3.5. Kiểm tra thời gian trên FPGA 162
5.3.5.1. Cyclone IV 162
5.3.5.2. Aria II 162
5.3.5.3. Stratix III 162
5.3.5.4. Stratix IV 163
5.3.5.5. Tổng hợp 163
5.3.6. Kiểm tra thiết kế trên các loại FPGA 163
5.3.6.1. Chức năng 163
vi

5.3.6.2. Thời gian đáp ứng 164
5.4. Hệ thống demo truyền video có mã hóa 166

5.4.1. Mã Key ZUC bằng RSA (software) 167
5.4.2. Truyền eKey và giải mã eKey bằng IP RSA (hardware) 168
5.4.3. Chuẩn bị ảnh/video mã hóa ZUC với Key ZUC (software) 171
5.4.4. Truyền ảnh/video mã và tiến hành giải mã và hiển thị (hardware) 173
5.5. Kết luận 178
5.5.1. Lõi IP RSA 178
5.5.2. Lõi IP ZUC 179
5.5.3. Đối chiếu kết quả đã đăng ký 181
Chương 6: Các kịch bản thử nghiệm 183
6.1. Giới thiệu 183
6.2. Mô hình ứng dụng voice-chat có bảo mật và thử nghiệm 183
6.2.1. Giới thiệu ứng dụng 183
6.2.2. Mô hình hoạt động 184
6.2.2.1. Mô hình hoạt động ở chế độ công khai 184
6.2.2.2. Mô hình hoạt động ở chế độ riêng tư 184
6.2.3. Kiến trúc chương trình 185
6.2.4. Thiết kế giao diện 186
6.2.4.1. Giao diện chính của Server 186
6.2.4.2. Giao diện cấu hình Client 187
6.2.4.3. Giao diện kết nối của Client 188
6.2.5. Hướng dẫn sử dụng 188
6.2.6. Thử nghiệm 190
6.2.6.1. Kịch bản 1 190
6.2.6.2. Kịch bản thử nghiệm 2 191
6.3. Thử nghiệm video: mô hình ứng dụng và kịch bản thử nghiệm 192
6.3.1. Mô hình thử nghiệm 192
6.3.2. Kịch bản thử nghiệm 195
6.3.3. Kết quả xây dựng phần cứng 199
6.4. Các kịch bản thử nghiệm 200
6.4.1. Kịch bản 1: truyền khóa RSA 200

6.4.1.1. Tính đúng đắn 201
6.4.1.2. Tài nguyên 202
vii

6.4.1.3. Thời gian đáp ứng: 202
6.4.2. Kịch bản 2: mã hóa và giải mã video sử dụng ZUC 204
6.4.2.1. Tài nguyên: 205
6.4.2.2. Thời gian đáp ứng: 205
6.4.3. Tấn công sử dụng bản mã và bản rõ mã ZUC 206
Chương 7: Kết luận 208
7.1. Mở đầu 208
7.2. Kết quả thực hiện 209
7.2.1. Kết quả lý thuyết 209
7.2.2. Kết quả hiện thực phần cứng 210
7.2.3. Các kết quả khác 211
7.3. Sản phẩm và kết quả thực hiện 211
7.4. Hướng phát triển ứng dụng 212


1
Chương 1: “Thiết kế và hiện thực một số
lõi IP chuyên dụng cho các hệ mã công khai
và mã dòng thực hiện trên FPGA”
1.1. Mở đầu
Các giao dịch điện tử hiện không thể thiếu trong các hoạt động của con người. Muốn triển
khai thành công các hệ thống như thương mại điện tử, ngân hàng điện tử, chính phủ điện
tử, … đòi hỏi các giải pháp an ninh thông tin rất an toàn. Hạt nhân của các giải pháp an
ninh thông tin là hệ mã khóa công khai (PKC – Public Key Cryptosystem), còn được gọi
là mã bất đối xứng (Asymmetric Cryptosystem) do khóa mã hóa và khóa giải mã là khác
nhau, và khóa mã hóa được công bố công khai. Có nhiều hệ mã khóa công khai đã được

công bố nhưng hệ mã công khai phổ biến nhất vẫn là RSA
1
. Chính nhờ hệ mã khóa công
khai, quá trình trao đổi khóa của các hệ mã khóa bí mật, còn gọi là mã đối xứng
(Symmetric Cryptosystem) hay mã quy ước (Pre-share Key Cryptosystem), được thực
hiện dễ dàng; cũng như các dịch vụ khác như chứng thực (Authentication), chữ ký số
(Digital Signature),… được đảm bảo. Trong đề tài này, hệ mã công khai được nghiên cứu
là RSA, và hệ mã đối xứng là ZUC
2
.
Độ an toàn của mã khóa công khai phụ thuộc chính vào kích thước khóa. Một hệ mã RSA
với kích thước khóa cho trước, nếu các số nguyên với kích thước tương ứng bị phân tích
thành các thừa số nguyên tố thì hệ RSA với kích thước khóa như vậy không còn an toàn
nữa. Trong trường hợp này, hệ mã RSA bị phá hoàn toàn. Có nhiều hướng tiếp cận để
phân tích thừa số nguyên tố: phương pháp vét cạn, phương pháp Pollard’s p - 1, phương
pháp Pollard’s rho, phương pháp dựa vào đường cong elliptic, phương pháp sàng toàn
phương (Quadratic Sieve) và sàng trường số (Number Field Sieve). Phương pháp vét cạn

1
RSA đặt theo tên viết tắt của 3 nhà Toán học phát minh ra hệ mã công khai này là Rivest – Shamir – Adleman.
2
ZUC là hệ mã dòng đồng bộ được thiết kế bởi Hongjun Wu.
2
thực hiện kiểm tra từng ước số nguyên tố có thể có từ 1 đến n

(giả sử n là số cần phân
tích). Mặc dù rất hiệu quả khi phân tích số nhỏ, nhưng đối với số lớn như trong RSA,
phương pháp vét cạn không thể sử dụng do thời gian thực hiện lớn O(n
1/2
). Phương pháp

Polard’s p - 1 giúp giảm chi phí so với phương pháp vét cạn trong trường hợp một ước số
nguyên tố p nào đó của n mà (p - 1) lại là tích của các số nguyên tố nhỏ hơn một ngưỡng
B chọn trước. Khi đó, thời gian tìm một ước số nguyên tố của n tỉ lệ với ước số nguyên tố
lớn nhất của p - 1. Phương pháp này hiệu quả nếu như ngưỡng B không quá lớn. Tuy
nhiên, nếu thiết kế RSA, ta chọn n sao cho với mọi ước số nguyên tố p của n, p - 1 phải có
ít nhất một ước số nguyên tố lớn, thì xác suất có thể phân tích n bằng phương pháp này
thành công là rất nhỏ. Phương pháp Pollard’s rho dựa vào nguyên tắc ngày sinh nhật
(Birthday Paradox), giúp thời gian thực thi tỉ lệ với kích thước của ước số nguyên tố nhỏ
nhất của n, tuy nhiên vẫn không hiệu quả với n lớn như trong RSA hiện nay. Phương pháp
dựa vào đường cong elliptic là một tổng quát hóa của phương pháp Pollard’s p – 1, và
thực sự cũng chưa chứng tỏ hiệu quả trong trường hợp tổng quát. Phương pháp sàng toàn
phương (Quadratic Sieve) dựa vào kỹ thuật sàng nguyên tố Eratosthenes, có thời gian
chạy gần lũy thừa (subexponential time) lớn hơn thời gian đa thức nhưng nhỏ hơn thời
gian số mũ. Phương pháp sàng trường số (Number Field Sieve) là phương pháp được xem
hiệu quả nhất hiện nay, với thời gian thực thi tốt hơn so với phương pháp Quadratic Sieve
[Boneh99]. Như vậy, có khá nhiều phương pháp để thực hiện phân tích ước số nguyên tố,
tấn công vào RSA. Để chống lại tấn công này, cần tăng kích thước khóa lên. Tuy nhiên,
tính an toàn của hệ mã RSA nhiều khi có thể bị phá vỡ mà không buộc phải giải bài toán
phân tích n thành các thừa số nguyên tố (xem [Nguyen08]). Các kỹ thuật thám mã hiện
đại có thể phục hồi được khóa bí mật từ các thông tin đã được công bố. Trường hợp này,
nhiều nhà nghiên cứu cũng xem như RSA bị tấn công hoàn toàn. Ngoài ra, việc thiếu cẩn
trọng khi chọn các tham số hệ thống cho RSA cũng có thể dẫn đến các tấn công phá vỡ
hoàn toàn hệ mã. Chẳng hạn như, bằng phương pháp liên phân số của M. Wiener, với
khóa bí mật d < n
1/4
/3, cho khóa công khai (e, n), nhiều heuristic cho rằng, kẻ tấn công có
3
thể khôi phục được n một cách hiệu quả [Boneh99]. Trong trường hợp khóa công khai n
nhỏ, thông tin về khóa bí mật d cũng sẽ bị lộ một phần [Cid__]
3

. Một trường hợp nữa
cũng hay xảy ra với những người sử dụng chưa có nhiều kinh nghiệm là thiết kế hệ thống
RSA rơi vào các trường hợp (hiển nhiên) yếu.
Với khả năng của máy tính hiện nay, kích thước khóa an toàn của RSA yêu cầu lên tới
1024-bit. Chính vì phải thực hiện tính toán trên các số nguyên quá lớn (BigInteger) nên
tốc độ của RSA là rất chậm, ngay cả trên các máy tính cá nhân. Thực tế cũng đã chứng
minh, với kích thước khóa lớn, tốc độ mã/giải mã là đôi khi khó chấp nhận được trong đa
số giao dịch điện tử [MVV96]. Vấn đề càng trở nên bất tiện khi phải thi hành các giao
dịch điện tử theo thời gian thực, trên các thiết bị năng lực (bao gồm cả năng lực tính toán
lẫn năng lượng) yếu. Vì thế, ngay từ những năm đầu thế kỷ 21, đã có nhiều giải pháp cài
đặt phần cứng cho các hệ mã khóa công khai, cụ thể cho RSA (xem [HWP06] và
[WML08]).
Về mã đối xứng, mã hóa đối xứng được chia làm hai loại là: mã khối (Block Ciphers) và
mã dòng (Stream Ciphers). Đối với mã khối, khi mã hóa, dữ liệu ban đầu được chia thành
các khối (block), thường thì có kích thước bằng nhau, và kích thước này sẽ tùy thuộc vào
thuật toán mã hóa được dùng như DES, 3DES, AES, RC2,…. Nếu áp dụng DES thì các
khối dữ liệu phải có cùng kích thước là 64 bits, còn nếu áp dụng AES thì kích thước này
phải là 128 bits. Mã khối cần đến một khóa k trong suốt quá trình mã hóa, khóa này cũng
tùy thuộc vào thuật toán mã hóa áp dụng như trên. Trong thực tế khi áp dụng mã khối thì
dữ liệu ban đầu phải biết trước về kích thước. Nghĩa là áp dụng mã khối cho dữ liệu đã
biết trước cụ thể. Sau khi dữ liệu ban đầu được chia ra thành các khối có kích thước nhất
định, quá trình mã hóa sẽ sử dụng đến một trong các kiểu hoạt động (mode of operation:
ECB, CBC, CFB, OFB, CTR) để tạo thành bản mã tương ứng cho dữ liệu ban đầu. Đối
với mã dòng, trong thực tế, khi được áp dụng thì dữ liệu thường ở dạng biến thiên theo
thời gian. Nghĩa là không biết trước được dữ liệu ban đầu. Hàm mã hóa đơn giản nhất
trong thực tế có thể chỉ đơn giản là một phép XOR giữa các bits của bản rõ (Plaint text)

3

4

và khóa dòng (Keystream) tương ứng. Do tính chất biến thiên theo thời gian và việc thực
hiện mã hóa/giải mã đơn giản, đồng thời cần tính thời gian thực cho các ứng dụng trên
thiết bị năng lực thấp, chúng tôi tập trung vào hệ mã dòng thay vì mã khối.
Hệ mã dòng ZUC ra đời năm 2009 và đang được phát triển mạnh trong dự án mở của tổ
chức DASCA (Data Assurance and Communication Security Research Center, Chinese
Academy of Sciences) nhằm hướng tới các ứng dụng cho chuẩn công nghệ "4G" trong
tương lai. ZUC được phát triển dựa trên SNOW 2.0. Chúng tôi chưa thấy các công trình
liên quan đến mã dòng, đặc biệt là hệ mã dòng ZUC. Đây vừa là thuận lợi cũng vừa là
thách thức cho đề tài.
1.2. Mục tiêu đề tài và nội dung thực hiện
1.2.1. Mục tiêu đề tài
Dựa trên các kết quả nghiên cứu về mã hóa-mật mã và các cách tấn công trên các hệ mã
phổ biến hiện nay (RSA, ZUC), đề tài nghiên cứu nhị phân hóa và cải tiến các thuật toán
liên quan nhằm tăng tốc độ xử lý và tăng tính an toàn cho các hệ mã này RSA và ZUC).
Từ các kết quả nghiên cứu lý thuyết và thuật toán RSA và ZUC, đề tài thiết kế và hiện
thực các lõi IP chuyên dụng cho mã hóa – mật mã thực hiện trên FPGA (FCC – FPGA
Crypto Coprocessor) nhằm phục vụ các ứng dụng liên quan đến an ninh thông tin. Đặc
biệt, nghiên cứu chú trọng đến các thiết bị có năng lực thấp (bao gồm cả năng lực tính
toán lẫn năng lượng).
Cụ thể, đề tài thực hiện hai mục tiêu chính như sau:
(1) Cải tiến và nhị phân hóa các thuật toán mã hóa:
 Thuật toán nhân modulo
 Thuật toán luỹ thừa modulo
 Các thuật toán phụ trợ (tính nghịch đảo modulo, sinh khóa an toàn,…)
 Thuật toán phát sinh khoá mạnh cho mã dòng: xây dựng một S-Box phát sinh khoá
ngẫu nhiên và dài để tăng tính an toàn và chống lại các cơ chế tấn công hiện nay,
5
đặc biệt tấn công tuyến tính và tấn công sai phân. Do S-Box là thành phần phi
tuyến duy nhất trong các hệ mã dòng (cũng như mã đối xứng AES), việc xây dựng
được S-Box tốt đảm bảo khả năng kháng các tấn công hiện đại như tấn công tuyến

tính và tấn công sai phân.

(2) Thiết kế và hiện thực 3 lõi chính trên một kiến trúc FPGA hợp nhất gồm:
 MAP Coprocessor: IP chuyên thực hiện các phép số học modulo cũng như các vấn
đề liên quan.
 RSA Coprocessor: IP chuyên dụng thực hiện mã/giải mã khóa công khai RSA.
 ZUC Coprocessor: IP chuyên dụng thực hiện mã/giả mã khóa đối xứng theo
phương thức mã dòng (stream cipher).
1.2.2. Nội dung thực hiện
(1) Nhị phân hóa các phép toán số học trên Z
2
n
, đặc biệt chú trọng phép nhân
modulo và phép lũy thừa modulo. Với phép nhân modulo, thiết kế thuật giải hiện thực
trên phần cứng dùng thuật giải Montgomery. Với phép lũy thừa modulo, xây dựng thuật
giải và phân tích khả năng cứng hóa thuật giải và hiện thực.
(2) Nghiên cứu khả năng cứng hóa hệ mã dòng ZUC. Độ an toàn của mã dòng nói
chung cũng như ZUC phụ thuộc vào tính ngẫu nhiên của khóa dòng được phát sinh. Bộ
sinh khóa dòng an toàn phụ thuộc chính vào S-Box, do đó việc thiết kế S-Box tốt là
nhiệm vụ quan trọng của nội dung này. ZUC là hệ mã dòng mới, rất tiềm năng cho các
ứng dụng mã/giải mã thời gian thực.
(3) Thiết kế và cài đặt FPGA Crypto-Coprocessor (FCC). FCC gồm một khối xử lý
(processor block) và các lõi IP (IP cores) nhằm tăng tốc độ tính toán trong quá trình thực
hiện mã/giải mã thông tin mật. Các lõi IP gồm: RSA Coprocessor, Modulo Arithmic
Process Coprocessor, ZUC Coprocessor.

6
1.3. Sản phẩm và kết quả thực hiện
Bảng sau trình bày đối chiếu sản phẩm thực hiện của đề tài so với sản phẩm đăng ký.
Đăng ký

Thực hiện
Các lõi IP chuyên dụng thực hiện trên FPGA:
(i) MAP Coprocessor (lõi chuyên dụng thực
hiện các phép toán số học.
(ii) RSA Coprocessor (lõi chuyên dụng thực
hiện mã công khai).
(iii) ZUC Coprocessor (lõi chuyên dụng thực
hiện mã dòng).
Các lõi IP chuyên dụng thực hiện trên FPGA
(1) MAP Coprocessor (lõi chuyên dụng thực
hiện các phép toán số học).
(2) RSA Coprocessor (lõi chuyên dụng thực
hiện mã công khai).
(3) ZUC Coprocessor (lõi chuyên dụng thực
hiện mã dòng).
Qui trình thiết kế lõi các IP.
(1) Quy trình thiết kế và sử dụng quy trình
hiện thực các lõi đã đăng ký.
(2) Đăng ký sở hữu trí tuệ thiết kế mạch cho
ZUC.
Bài báo
Anh P. Nguyen, Thuc D. Nguyen.
Determining quantity of S-Boxes
using pseudo random sequences
generated from stream ciphers. In
Algorithms and Architectures for
Parallel Processing, LNCS 7440,
Springer, 2012
Bài báo
Thach V.Bui, Oanh K.Nguyen, Van H.Dang,

Nhung T.H.Nguyen, Thuc D. Nguyen.
A variant of non-adative group testing
and its application in pay-television
via internet”, Springer LNCS,
AsiaARES 2013.

7
Bên cạnh các sản phẩm chính, là các kết quả liên quan đến đào tạo bậc cao học, gồm hai
luận văn thạc sĩ Khoa học Máy tính đã bảo vệ thành công tại ĐH KHTN thuộc ĐHQG
Tp. HCM:
(1) Nguyễn Phan Anh. Kiểm định chất lượng S-Box thông qua chuỗi giả ngẫu nhiên
phát sinh từ thuật toán mã hóa dòng. Luận văn Thạc Sĩ, ĐHKHTN, HCM-VNU,
2011.
(2) Nguyễn Chí Hiếu. Khảo sát cấu trúc hệ mã dòng ZUC. Luận văn Thạc Sĩ,
ĐHKHTN, HCM-VNU, 2012.
1.4. Bố cục báo cáo
Báo cáo, ngoài phần mở đầu (chương 1) giới thiệu mục tiêu đề tài, nội dung và kết quả
thực hiện; phần kết luận (chương 7) tổng kết đề tài, nội dung báo cáo được trình bày trong
5 chương chính gồm:
Chương 2: Mã khóa công khai – RSA. Nội dung của chương này trình bày những kết
quả nghiên cứu về RSA, đặc biệt, chúng tôi xây dựng các thuật toán hiệu quả cho việc cài
đặc phần cứng đồng thời phân tích độ an toàn của RSA, qua đó gợi ý những cài đặt phần
cứng một RSA an toàn, tránh các khóa yếu và các tấn công có thể làm tổn hại RSA.
Chương 3: Mã đối xứng – mã dòng ZUC. Nội dung của chương trình bày những kết
quả nghiên cứu nhằm hiện thực phần cứng mã đối xứng ZUC, một dạng mã dòng hiệu
quả cho các ứng dụng mã hóa lượng dữ liệu liên tục, không xác định kích thước và phải
thi hành thời gian thực. Độ an toàn cũng được minh chứng qua các thực nghiệm thống kê.
Chương 4: Qui trình thiết kế lõi IP. Nội dung trình bày quy trình tổng quát thiết kế lõi
IP và minh họa chi tiết quy trình qua các thiết kế cụ thể.
Chương 5: Các lõi IP chuyên dụng. Nội dung của chương trình bày quy trình thiết kế

các lõi IP chuyên dụng cho mã hóa gồm: MAP-Coprocessor, chuyên thực hiện các phép
toán số học trên vành Z
2
n
; RSA-Coprocessor, chuyên thực hiện quá trình mã/giải mã theo
8
nguyên tắc mã công khai RSA; và ZUC-Coprocessor, chuyên thực hiện quá trình sinh
khóa dòng cho việc mã hóa và giải mã dòng dữ liệu theo phương pháp ZUC.
Chương 6: Các kịch bản thử nghiệm. Trình bày các kịch bản thử nghiệm cho hai minh
họa ứng dụng chính: chat-thoại có bảo mật và video streaming có bảo mật. Mục tiêu là
minh họa khả năng ứng dụng của đề tài dưới khía cạnh phần mềm (chat-thoại) cũng như
minh chứng tính hiệu quả của các lõi IP trong ứng dụng video có mã hóa.
Chương 7: Kết luận. Tóm tắt kết quả nghiên cứu, đối chiếu với nhiệm vụ đăng ký, đồng
thời cũng dự kiến khả năng ứng dụng và triển khai thành các sản phẩm.

9
Chương 2: Mã công khai - RSA
2.1. Định lý RSA
Trước tiên, chúng tôi hình thức hóa lại hệ thống mã khóa RSA [RSA78] dưới dạng
định lý như sau, trong đó, mỗi dòng của định lý sẽ được đánh số để tiện diễn giải.
Đinh lý RSA
Cho 2 số nguyên tố p và q khác nhau,
(1)
Đặt N = pq và Phi = (p – 1)( q – 1).
(2)
Chọn e và d thuộc 
N
= {0, 1,…, N – 1}, thỏa điều kiện: ed mod Phi = 1.
(3)
Khi ấy, với mọi m thuộc 

N
, nếu c = m
e
mod N thì m = c
d
mod N, và ngược
lại.
(4)
Chứng minh định lý sẽ không được trình bày ở đây mặc dù chứng minh cũng không
quá phức tạp.
Ta sẽ phân tích từng dòng lệnh, từ đó lý giải tại sao cần các công việc cần nghiên cứu
để có thể thực hiện đề tài.
 Ở dòng (1), ta cần chọn được một cách ngẫu nhiên 2 số nguyên tố khác nhau p và
q. Bài toán sẽ là không khó khăn gì với máy tính nếu p và q là các số nhỏ. Tuy
nhiên, với p và q lớn
1
, không có máy tính cũng như không có ngôn ngữ lập trình
nào hỗ trợ trực tiếp, vì thế, việc cài đặt sẽ trở nên khó khăn hơn rất nhiều. Bên cạnh
tính ngẫu nhiên, các số nguyên tố cần phải là số nguyên tố mạnh
2
để tránh khả năng
phân tích N thành p và q. Vì thế, ta cần các thuật toán sinh số nguyên tố an toàn để
thực hiện nhiệm vụ này.
 Dòng (2) yêu cầu ta phải tích tích 2 số nguyên lớn (mà máy tính cũng như ngôn
ngữ lập trình không hỗ trợ trực tiếp).
 Ở dòng (3), ta có đẳng thức ed mod Phi = 1. Xét trong miền Z
Phi
, từ đẳng thức này,
ta có khái niệm nghịch đảo. Trong đẳng thức này, d được gọi là nghịch đảo (mod
Phi) của e và ngược lại. Như vậy, cho trước e và Phi, trong điều kiện nào và làm

thế nào ta có thể tìm được nghịch đảo d (mod Phi) của nó.
 Dòng (4), để mã hóa m thành c, (và giải mã c để phục hồi lại m), cần phải tính m
e

mod N, (hay c
d
mod N). Phép tính này gọi là phép tính lũy thừa modulo.
 Bên cạnh các nội dung trên, để đảm bảo chắc chắn xây dựng được một hệ thống
RSA an toàn chống được hai tấn công: (i) phân tích ra thừa số (tấn công tổng quát),

1
Từ nay trở đi, số nguyên tố lớn là số có kích thước cỡ 512 bit, và không gian làm việc của RSA trong đề tài này
là 2
1024
phần tử.
2
Trong đề tài này, chúng tôi sử dụng định nghĩa số nguyên tố mạnh của Gordon.
10
và (ii) tấn công khóa yếu (tấn công đặc thù), nhất thiết cần khảo sát và thử nghiệm
các tấn công này.
 Cuối cùng, để triển khai phần cứng, cũng cần xem xét khả năng nhị phân hóa RSA,
và đánh giá hiệu năng RSA (bên cạnh phần xem xét tính an toàn của RSA).
Nội dung chương này được tổ chức gồm các nội dung sau:
(1) Nhị phân hóa phép cộng và nghịch đảo modulo.
(2) Phép nhân nhanh modulo và phép lũy thừa nhanh modulo.
(3) Xây dựng thuật giải sinh số nguyên tố an toàn và hiệu quả.
(4) Phân tích và xây dựng thuật giải sinh khoá RSA.
(5) Nhị phân hóa hệ mã RSA.
(6) Chương trình mô phỏng phần mềm và đánh giá RSA.


2.2. Nhị phân hóa phép cộng và nghịch đảo modulo
2.2.1. Thuật toán
2.2.1.1. Cơ sở toán học
Trong bảo mật thông tin, đặc biệt trong hệ mật mã RSA, việc xác định được ước chung
lớn nhất, ký hiệu gcd – greatest common divisor, là vấn đề quan trọng. Định lý Euclide
là cơ sở toán học cho phép xây dựng các thuật toán/chương trình máy tính tính gcd của
2 số cho trước. Ta tóm tắt định lý này theo ngôn ngữ thuật toán như sau:
Định lý Euclide (thuật toán Euclidecho 2 số nguyên dương)
Cho a, b là hai số nguyên dương.
Đặt r
-1
= a, và r
0
= b. Ta có
r
j-1
= r
j
q
j+1
+ r
j+1
, 0 ≤ j < r
j
;
(với 0 ≤ j < N và N là số nguyên dương nhỏ nhất sao cho r
N+1
= 0)
Khi ấy, ước chung lớn nhất của a, b là r
N

: gcd(a,b) = r
N
.
Trong thực tế RSA thường sử dụng định lý mở rộng của định lý Euclide, được phát
biểu và chứng minh bởi nhà toán học Bezout, người Pháp. Định lý này thiết lập quan
hệ giữa 2 số nguyên a, b cho trước với ước số chung lớn nhất cuả chúng. Cho 2 số
nguyên dương a, b, giả sử a > b ≥ 1, ta luôn tìm được 2 số nguyên (có thể âm) x và y
sao cho ax + by = gcd(a,b). Ta cũng sẽ phát biểu định lý này dưới dạng thuật toán như
sau:

11
Định lý Bezout (tìm quan hệ giữa 2 số nguyên dương với ước chung lớn nhất của
chúng).
Cho 2 số nguyên dương a, b.
Đặt r
-1
= a, r
0
= b, s
-1
= 1, s
0
= 0, t
-1
= 0, t
0
= 1, ta có:
r
j-2
= r

j-1
q
j
+ r
j
, 0 ≤ r
j
< r
j-1
;
s
j
= s
j-2
– q
j
s
j-1
;
t
j
= t
j-2
– q
j
t
j-1
, 1 ≤ j ≤ N;
Khi ấy,
r

j
= s
j
a + t
j
b, -1 ≤ j ≤ N; gcd(a,b) = r
N
= s
N
a + t
N
b;
(N là số nguyên dương nhỏ nhất sao cho r
N+1
= 0).
Định lý Bezout (nhiều tài liệu gọi là Euclide mở rộng) quan trọng, đặc biệt với RSA,
vì nó cho phép tính số nghịch đảo của một số cho trước trong tập các số nguyên dương

n
= {0, 1, …, n-1}.
Một số nguyên a thuộc 
n
được gọi là khả nghịch nếu tồn tại số nguyên b cũng thuộc

n
sao cho ab mod n = 1. Khi ấy b được gọi là nghịch đảo của a, ký hiệu b  a
-1
(mod
n).
Để tính nghịch đảo của số a (điều kiện là a phải nguyên tố cùng nhau với n, nghĩa là

gcd(a, n) = 1), sử dụng thuật toán Bezout ta tính được x và y thỏa:
ax + ny = gcd(a, n) = 1
thực hiện phép chia lấy phần dư cho n, ta có
ax mod n + ny mod n = 1 mod n
ax mod n + 0 = 1 mod n
hay
x  a
-1
(mod n)
Để nhị phân hóa các thuật toán trên, ta có 2 ghi chú quan trọng sau:
Ghi chú 2.1: cho 2 số nguyên dương x và y, giả sử x và y cùng lớn hơn hay bằng 2. Ta
biết rằng, mọi số nguyên đều có biểu diễn duy nhất dưới dạng tích của các số nguyên
tố (định lý cơ bản của số học). Như vậy, từ biểu diễn của x và y:
12
 =





,  =





(với  ký hiệu tập các số nguyên tố)
Nếu đặt

0

= 2

2
, 
1
=


0
; 
0
= 2

2
, 
1
=


0
,
Thì
gcd

, 

= 2
min (
2
,

2
)
gcd(
1
, 
1
),
Khi y lẻ, gcd(x, y) = gcd(x
1
, y).
Khi x chẵn và y lẻ, gcd(x, y) = gcd(x/2, y).
Ghi chú 2.2: nếu x và y là hai số nguyên lẻ khác nhau,
gcd(x,y) = gcd(|x – y|/2, min(x,y)).
2.2.1.2. Nhị phân hóa phép nghịch đảo modulo
Thuật toán Euclide Nhị phân hóa: Tìm ước chung lớn nhất (gcd) của hai số x, y
1. If x = 0 return y;
2. If y = 0 return x;
3. g = 1;
4. While (x is even && y is even)
x = x/2;
y = y/2;
g = g*2;
5. While (x > 0)
a. While (x is even)
x = x/2;
b. While (y is even)
y = y/2;
c. If(x >= y)
x = x –y;
6. Return g*y;

Thuật toán 2.1: Euclide nhị phân hóa tìm gcd(x,y)
Ghi chú khi cài đặt:
- Dòng lệnh số 3, để gán g = 1, ta chỉ cần bật bit thấp nhất của biến g.
13
- Dòng lệnh số 4, để kiểm tra một số có phải là số chẵn hay không ta chỉ cần
kiểm tra xem bit thấp nhất của biến tương ứng có tắt hay không.
- Các lệnh trong thân của lệnh lặp số 4, phép chia/nhân cho 2 sẽ được cài đặt
bằng các phép shift tương ứng.
- Tương tự cho lệnh đánh số 5.
Thuật toán tìm phần tử khả nghịch
 
1
modd e n


chính là thuật toán Euclide mở
rộng (thuật toán Bezout) tính
 
gcd ,x y ax by
. Phiên bản Bezout nhị phân hóa cơ
bản giống thuật toán Euclide nhị phân hóa, trong đó có sử dụng một số biến để lưu trữ
các kết quả trung gian để tính
a

b
.
Thuật toán Bezout Nhị phân hóa.
1. If x = 0 return y;
2. If y = 0 return x;
3. g = 1;

4. While (x is even && y is even)
x = x/2;
y = y/2;
g = g*2;
5. u = x, v = y, A = 1, B = 0, C = 0, D = 1;
6. While (u> 0)
a. While (u is even)
u = u/2;
if (A and B are even)
then A = A/2, B = B/2
else A = (A+y)/2, B = (B-x)/2
b. While (v is even)
y = y/2;
if (C and D are even)
then C = C/2, D = D/2
else C = (C + y)/2, D = (D – x)/2
c. If(u >= v)
Then u = u –v, A = A – C, B = B – D
14
Else v = v – u, C = C – A, D = D - B
7. a = C, b = D, v = gv;
8. Return (a,b,v);
Hình 2.2: Thuật giải Bezout nhị phân hóa tính ước chung lớn nhất và tìm nghịch
đảo
Giải thích: chi tiết hoạt động của thuật toán Bezout được minh họa qua ví dụ tính
nghịch đảo 41
-1
(mod 65) như sau:
Ví dụ: Tìm nghịch đảo của 41 (mod 65).
U

v
A
B
C
D
65
41
1
0
0
1
24
41
1
-1
0
1
12
41
21
-33
0
1
6
41
31
-49
0
1
3

41
36
-57
0
1
3
38
36
-57
-36
58
3
19
36
-57
-18
29
3
16
36
-57
-54
86
3
8
36
-57
-27
43
3

4
36
-57
7
-11
3
2
36
-57
24
-38
3
1
36
-57
12
-19
2
1
24
-38
12
-19
1
1
12
-19
12
-19
0

1
0
0
12
-19
Suy ra: 1 = 12*65 + (-19)*41
Vậy d = -19 + 65 = 46
15
2.2.1.3. Tính hiệu quả và khả năng cứng hóa của thuật toán
Trong thuật giải trên, cài đặt phần cứng phép toán chia cho 2 sử dụng phép dịch 1 bit
sang phải, phép toán nhân cho 2 dịch 1 bit sang trái, phép toán kiểm tra chẵn lẻ đưa về
kiểm tra bit cuối cùng là 0 hay 1. Do các phép toán đều thực hiện trên bit nên tốc độ
của thuật giải được giảm đáng kể, đồng thời thích hợp để thực hiện cứng hóa.
2.3. Phép nhân nhanh modulo và phép lũy thừa nhanh modulo.
2.3.1. Phép toán trên vành 
m

Trong phần này, ta sẽ xem xét các thuật toán tính toán trên các số nguyên trong tập 
m

= {0, 1, …, m – 1}, với m là một số nguyên dương.
Một số nguyên x không thuộc tập 
m
này sẽ được xét qua một số tương đương y = x
mod m, là một số thuộc 
m
, ta ký hiệu:
x  y (mod m).
Trước hết, ta có các ghi chú sau:
Ghi chú 3.1: nếu x và y thuộc 

m
,
(x + y) mod m = x + y nếu (x + y) < m;
(x + y) mod m = x + y – m nếu (x + y) ≥ m.

(x – y) mod m = x + m – y nếu x < y;
(x – y) mod m = x – y nếu x ≥ y.
Ghi chú này giúp cài đặt phép cộng/trừ mod một cách hiệu quả.
Ghi chú 3.2: nếu x và y cùng thuộc 
m
, thì 0 ≤ xy ≤ m
2
– 1.
Và nếu k là một số nguyên dương thỏa điều kiện:
km ≤ xy < (k + 1)m, thì xy mod m = xy – km.
Ghi chú 3.3: khi x, y và m là những số nguyên lớn, 0 ≤ x, y < m, b ≥ 2, và  =





0
là biểu diễn cơ sở b của y, ta có:
   =


0
 +







0

 

 ,

+1
  =






 

 , 0    . (*)
16
Công thức (*) gợi ý khi cài đặt, ta không nên thực hiện lại các kết quả đã tính trước đó,
nghĩa là, ở bước thứ i, ta đã tính được xb
i
, thì bước thứ i+1, ta không phải tính lại giá
trị này nữa.
Cũng lưu ý là khi sử dụng cơ sở 2 (b = 2), phép nhân cho 2 thực chất là phép shift, và
phép lũy thừa 2
i

thực chất là i lần shift.
Ghi chú 3.4: để tính x
p
, với x là số nguyên thuộc 
m
, và p là một số nguyên dương, ta
nên biểu diễn p dạng nhị phân  =



2

0
, khi ấy


= 

0
(
2
)

1
(
4
)

2
(

2

)


.
Khi ấy, y = x
p
sẽ được tính như sau:
(1) y = 1.
(2) If (p = 0) Then Return y.
(3) A = x.
(4) If (p
0
= 1) Then y = x.
(5) (1 ≤ i ≤ I) A = A
2
mod m, If (p
i
= 1) Then y = Ay mod m.
(6) Return y.
Lưu ý là trong cách tính này, vì A ban đầu gán bằng x (bước số 3), nên với mọi i ≤ I, ta
đều phải thực hiện phép tính nhân A = A
2
= AA (lệnh đầu của bước số 5), nghĩa là ta
phải thực hiện I lần phép nhân. Ta biết rằng chi phí cho phép nhân rất cao. Vì thế, ta
có thể thay đổi quy trình tính như sau chi phí tính toán sẽ rút gọn hơn:
(1) y = 1.
(2) (I ≥ i ≥ 0) y = y
2

mod m, If (p
i
= 1) Then y = yx mod m.
(3) Return y.
Trong quy trình mới này, vì y ban đầu bằng 1 (bước số 1), nên y = y
2
vẫn sẽ bằng 1
cho đến khi bit đầu tiên của p bật lên (p
i
= 1). Như vậy, mặc dù độ phức tạp lý thuyết
so với quy trình trước khi cải tiến là như nhau, nhưng trung bình thời gian tính toán
thực sự của quy trình cải tiến tốt hơn nhiều.
Ghi chú 3.5: trong hệ mã RSA, việc tính x
k
mod n khác với việc tính x
k
mod m với m
chung chung. Thực vậy, trong RSA, n là tích của 2 số nguyên tố phân biệt: n = pq. Vì
thế, x
k
mod n sẽ bằng x
k
mod pq. Nếu đặt
k
1
= k mod (p – 1) và k
2
= k mod (q – 1), sẽ có 2 số nguyên n
1
và n

2
sao cho
k = k
1
+ n
1
(p – 1) và k = k
2
+ n
2
(q – 1).

17
Ta có,


  =



1
 

(
1
 )

1
.
Mà 

1
  = 1 (theo định lý Fermat nhỏ
3
).
Vì vậy,
 = 

  = 

1
 .
Tương tự,
 = 

  = 

2
 .
Từ X và Y như trên, ta có thể tính giá trị XY = x
k
mod n bằng thuật toán sau:
(1) C = p
-1
mod q.
(2) U = (Y – X) mod q.
(3) XY = X + Up.
(4) Return XY.
Chú ý là C ở bước số 1 được tính nhanh bằng thuật toán Bezout đã trình bày trong mục
trước.
Tóm lại, ghi chú 3.5, hướng dẫn ta cách tính lũy thừa modulo trong trường hợp cụ thể

RSA là vô cùng hiệu quả. Mặc dù theo cách này tính lũy thừa modulo cần 2 phép lũy
thừa, nhưng lưu ý là ta chỉ phải thực hiện trên các số có chiều dài bit bằng một nửa so
với chiều dài bit của các số ban đầu.
Với các lưu ý này, khi chuyển sang phần cứng sẽ hiệu quả hơn rất nhiều.
2.3.2. Thuật toán
2.3.2.1. Phép nhân nhanh modulo
Từ các nghiên cứu nâng cao hiệu quả khi nhị phân hóa các phép toán số học như trình
bày trên, phần này khảo sát đánh giá thuật toán nhân Montgomery.
2.3.2.1.1. Giới thiệu
Năm 1985, P.L Montgomery đã giới thiệu một thuật toán hiệu quả để tính
. modR ab n
. Ý tưởng của thuật toán là chuyển phép tính modulo cho số
n
bất kì về
tính modulo cho r = 2
k
, với k thích hợp
. Vì modulo cho một số có dạng lũy thừa của 2
(r =
2
k
) sẽ nhanh hơn rất nhiều.

3
Định lý Fermat: với mọi số nguyên dương a, a
p-1
mod p = 1 nếu p là số nguyên tố.

×