Ứng dụng của số nguyên tố trong mật mã Các số nguyên tố lớn là một trong các tham số an toàn quan trọng trongcác thuật toán lược đồ mật mã hiện đại như thuật toán mã hoá khoá công khaiRS
Trang 1TÌM HIỂU CÁC THUẬT TOÁN SINH SỐ NGUYÊN TỐ
Giảng viên: TS Nguyễn Tuấn Anh
Thực hiện: sinh viên Đặng Văn Huân
HÀ NỘI, 2015
Trang 2Ý KIẾN CỦA GIẢNG VIÊN
Trang 3MỤC LỤC
Trang 4DANH MỤC CÁC BẢNG
Trang 5LỜI NÓI ĐẦU
Mật mã học là một ngành có lịch sử hàng nghìn năm nay, nó gắn liền vớinhu cầu bảo mật an toàn thông tin của con người ngay từ thời cổ đại Sự rađời của mạng máy tính đã có tác động rất lớn đến sinh hoạt chung của loàingười Mạng máy tính ra đời giúp cho con người dễ dàng trao đổi thông tin,chia sẻ dữ liệu, v.v… một cách nhanh chóng mà không cần quan tâm đểnkhoảng cách về địa lý Bên cạnh ích lợi cũng tồn tại hiểm họa Tiêu biểu làhiểm họa lộ thông tin Để phòng chống hiểm họa này các nhà khoa học đãnghiên cứu, phát triển các hệ mật khác nhau
Nhằm đảm bảo an toàn thông tin, nhiều hệ mật mã ra đời gần đây có sửdụng các số nguyên tố như là một tham số thiết yếu Vì vậy, số nguyên tố làmột đề tài thu hút được nhiều sự quan tâm của các chuyên gia mật mã Nhậnthấy tầm quan trọng của số nguyên tố, cùng tinh thần học tập cao nhóm chọn
đề tài nghiên cứu “Tìm hiểu các thuật toán sinh số nguyên tố”.
Do kiến thức còn hạn chế, bản báo cáo không thể tránh khỏi những thiếu sót mong sự góp ý của thầy cô và các bạn đọc giúp bản báo cáo hoàn thiện hơn
Trang 6Chương I TỔNG QUAN VỀ SỐ NGUYÊN TỐ
I.1 Định nghĩa số nguyên tố
Số nguyên tố là số chỉ có 2 ước, đó là 1 và chính nó Tức là nó chỉ chiahết cho số 1 và chính nó
I.2 Tính chất của số nguyên tố
1 Ước tự nhiên khác 1 nhỏ nhất của một số tự nhiên n là số nguyên tố.
2 Cho p là số nguyên tố; a N; a 0 Khi đó
3 Nếu tích của nhiều số chia hết cho một số nguyên tố p thì có ít nhất một thừa số chia hết cho p.
4 Ước số dương bé nhất khác 1 của một hợp số a là một số nguyên tố không vượt quá
5 2 là số nguyên tố nhỏ nhất và cũng là số nguyên tố chẵn duy nhất
6 Tập hợp các số nguyên tố là vô hạn (tương đương với việc không có
số nguyên tố lớn nhất).
I.3 Ứng dụng của số nguyên tố trong mật mã
Các số nguyên tố lớn là một trong các tham số an toàn quan trọng trongcác thuật toán lược đồ mật mã hiện đại như thuật toán mã hoá khoá công khaiRSA, lược đồ chữ ký số RSA, lược đồ trao đổi khoá Diffie-Hellman, lược đồ
mã hoá Elgammal Số nguyên tố lớn góp phần vào việc tăng độ an toàn củacác hệ mật
Trang 7Chương II MỘT SỐ THUẬT TOÁN SINH SỐ NGUYÊN TỐ
Theo chuẩn ISO/IEC 18032, các thuật toán sinh số nguyên tố được chiathành hai loại:
- Các thuật toán dựa trên các phép kiểm tra tính nguyên tố xác xuất
- Các thuật toán sinh số nguyên tố tất định
II.1 Một số thuật toán sinh số nguyên tố xác suất
Xác suất sai phụ thuộc vào phép kiểm tra được dùng Xác suất mà mộthợp số được chấp nhận là không đáng kể Để giảm thiểu xác suất sai, người tathường thực hiện nhiều vòng lặp với cùng một đầu vào
II.1.1 Một số phép kiểm tra tính nguyên tố
II.1.1.1 Phép kiểm tra tính nguyên tố Miller-Rabin
Trang 81 Chọn ngẫu nhiên một số nguyên a thoả mãn 1 < <a n– 1
- Với mỗi a, xác suất để chấp nhận nhầm n là số nguyên tố không quá
1/ 4
- Nếu chọn k số a độc lập với nhau và cả k lần đều kết luận “n là số
nguyên tố” thì xác suất phạm sai lầm không quá 1 / 4
k
- Các thuật toán xác suất tuy không khẳng định chính xác được một số
có là nguyên tố hay không nhưng chúng lại được dùng làm công cụ kỹthuật cho các thuật toán tất định
Trang 9II.1.1.2 Phép kiểm tra tính nguyên tố Lehman
Phép kiểm tra Lehmann dựa trên một thực tế sau: Số nguyên lẻ N > 1 là
nguyên tố khi và chỉ khi
Đầu vào: số cần kiểm tra N và một tham số t
Đầu ra: “N là số nguyên tố” hoặc “N là hợp số”
- Nếu y = N – 1 thiết lập f = “true”
3 Nếu f = “true” thì trả về “chấp nhận”, ngược lại trả về “không chấp nhận”
II.1.1.3 Thuật toán sàng Eratosthenes
a Định lý
Số nguyên dương n là nguyên tố nếu và chỉ nếu nó không chia
hết cho bất kỳ số nguyên d nào thoả mãn 1 d < n<
b Thuật toán
Đầu vào: Số N cần kiểm tra.
Đầu ra: Trả lời N là số nguyên tố hoặc N là hợp số.
Trang 11Đầu vào: Số Mersenne 2 1
II.1.2 Một số thuật toán sinh số nguyên tố xác suất
Giả sử T là một trong những phép kiểm tra tính nguyên tố Xác suất saicủa T phụ thuộc vào số vòng lặp kiểm tra Các thuật toán sinh số nguyên tốxác suất có sử dụng chung đầu vào k – độ dài của số nguyên tố cần sinh (đơn
vị tính là bit)
II.1.2.1 Thuật toán lựa chọn ngẫu nhiên
Các bước thực hiện
1 Chọn ngẫu nhiên một số nguyên lẻ N sao cho 2 k-1 < N < 2 k
2 Nếu N qua được phép kiểm tra T thì dừng Còn không quay lại bước 1
II.1.2.2 Thuật toán tìm kiếm tăng dần
Các bước thực hiện:
1 Chọn ngẫu nhiên số lẻ n 0 sao cho 2 k-1 < n 0 < 2 k
Trang 12Lấy N = n 0 và N max = min(2 k , n 0 + 2µ) Thực hiện thủ tục dưới đây:
2 Nếu N qua được phép kiểm tra T, cho đầu ra là N và dừng
3 Lấy N = N+2 Nếu N>N max quay lại bước 1, còn không quay về bước 2.
Trong thuật toán có xuất hiện tham số µ Tham số này giới hạn lượngtăng dần khi thực hiện tìm kiếm một số nguyên tố Có một gợi ý rằng sử dụngtham số µ = 10ln(2 k) Kết quả này cho xác suất cao trong việc tìm thấy một sốnguyên tố trong khoảng đầu tiên và phân bố của các số nguyên tố tìm đượchầu như là đều
II.2 Một số thuật toán sinh số nguyên tố tất định
II.2.1 Cơ sở lý thuyết
với mọi ước nguyên tố q của s Khi đó N là số nguyên tố.
II.2.1.2 Phép chia thử kiểm tra tính nguyên tố
Tính nguyên tố của một số nguyên N có thể được chứng minh bởi phép
chia thử Được thực hiện như sau:
1.Với tất cả các số nguyên tố p ≤ N 1/2 , nếu N mod p = 0 thì kết luận N là hợp số, kết thúc.
2.Kết luận N là nguyên tố, kết thúc.
Với các số nguyên nhỏ, phương pháp chia thử mất ít thời gian tính toánhơn các phương pháp kiểm tra khác Các cài đặt cho việc kiểm tra tính
Trang 13nguyên tố trong chuẩn này có thể định nghĩa một cận cho phép chia thử L,
dưới giá trị này phép chia thử được sử dụng để kiểm tra tính nguyên tố của
các số nguyên Chuẩn này không thiết lập giá trị cho L.
II.2.2 Thuật toán sinh số nguyên tố của Maurer
Đầu vào: k (độ dài của số nguyên tố cần sinh).
Đầu ra: Số nguyên tố p và một chứng nhận tính nguyên tố của nó, C p( )
.Các bước thực hiện:
1 Nếu 2k < L
thì sinh ngẫu nhiên một số nguyên lẻ p có độ dài k bít, sau đó kiểm tra tính nguyên tố bằng phép chia thử kiểm tra tính nguyên tố Lặp lại cho đến khi p là một số nguyên tố Cho đầu ra p
k bít và một chứng nhận
( )
C q
.
4 Lấy
Trang 145 Chọn ngẫu nhiên số nguyên R sao cho t < R≤2t
7 Ngược lại, lặp lại các bước từ 5 đến 7.
II.2.3 Thuật toán sinh số nguyên tố của Shawe-Taylor
II.2.3.1 Thuật toán
Thuật toán sử dụng duy nhất một tham số: L, giới hạn phép chia thử.
Đầu vào: số nguyên k – số bit của số nguyên tố cần sinh
Đầu ra: số nguyên tố N
Các bước thực hiện:
1 Nếu 2 k < L thì sinh ngẫu nhiên một số nguyên lẻ k bít, N, và kiểm tra tính nguyên tố bằng cách chia thử Lặp lại cho đến khi N là một số nguyên tố Cho đầu ra N và dừng.
2 Nếu k lẻ, lấy k 1 = Nếu k chẵn lấy k 1 = Gọi đệ qui thuật toán này với đầu vào là k 1 , để tìm một số nguyên tố k 1 bít q.
3 Chọn ngẫu nhiên số nguyên x, 2 k-1 ≤ x < 2 k
4 Lấy t =
Trang 158 Ngược lại lấy t = t + 1 và lặp lại các bước từ 5 đến 8.
II.2.3.2 Tính đúng đắn của thuật toán
a Số nguyên N ở đầu ra thuật toán có độ dài đúng k bít
- Qua bước 5 và bước 6 của thuật toán chúng ta thấy
N = 2qt + 1 < 2k
- Qua bước 4 của thuật toán ta có t > x/2q, kết hợp với việc chọn
2 k-1 ≤ x < 2 k được chọn tại bước 3 của thuật toán nên ta có:
t ≥ 2 k-1 /2q Thay giá trị t vào công thức tính N ta có:
N = 2qt + 1 ≥ 2(2 k-1 /2q)q + 1 = 2 k-1 + 1
Như vậy ta có 2 k-1 + 1≤ N < 2 k Nói cách khác: N có độ dài đúng k bit
b Số N ở đầu ra thuật toán là số nguyên tố
Tính nguyên tố của số N được đảm bảo bởi các phép tính toán và kiểmtra trong bước 7 của thuật toán Cụ thể:
- Điều kiện 1
x q = 1 mod N a 2tq = 1 mod N a (N-1) = 1 mod N
- Điều kiện 2
gcd(x - 1, N) = 1 gcd(a 2t –1, N)=1 gcd(a (N-1)/q – 1, N) = 1
Trang 16- Mặt khác, bước 2 của thuật toán q là số nguyên tố có số bít làk1
k/2 + 1 Do đó q N
Thỏa mãn được các điều kiện trên, số N đã thỏa mãn định lýPocklington Như vậy N là số nguyên tố
Trang 17Chương III CÀI ĐẶT THUẬT TOÁN SINH SỐ NGUYÊN TỐ
CỦA SHAWE-TAYLOR
III.1 Cài đặt thuật toán
Công cụ được nhóm lựa chọn để thực hiện việc cài đặt thuật toán gồm :
- Ngôn ngữ lập trinh C++
- Thư viện tính toán số lớn GMP
1 Giới thiệu về ngôn ngữ lập trình C++
Đã có nhiều sách trên thế giới viết về C/C++ và hầu hết là ca ngợi,nhất là các lập trình viên luôn xem C/C++ là công cụ mạnh và uyểnchuyển
- Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử
chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tựngắn gọn
- Tính cấu trúc (structured): C có một tập hợp những chỉ thị của
lập trình như cấu trúc lựa chọn, lặp… Từ đó các chương trình viếtbằng C được tổ chức rõ ràng, dễ hiểu
- Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện
chuẩn vô cùng phong phú nên khi chuyển từ máy tính này sang máytính khác các chương trình viết bằng C vẫn hoàn toàn tương thích
- Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú
pháp, chấp nhận nhiều cách thể hiện, có thể thu gọn kích thướccủa các mã lệnh làm chương trình chạy nhanh hơn
- Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương trình
riêng rẽ thành các tập tin đối tượng (object) và liên kết (link) các đốitượng đó lại với nhau thành một chương trình có thể thực thi được(executable) thống nhất
Trang 18III.1.1 Giới thiệu thư viện tính toán số lớn GMP
Thư viện lập trình số lớn GMP được xây dựng và phát triển bởi tổ chức nguồn mở GNU, nhằm mục đích hỗ trợ cho các lập trình viên khi tương tác, xử lý trên các số nguyên lớn.
GMP là một thư viện miễn phí với độ chính xác số học tuỳ ý, vận hành trên các số nguyên, số hữu tỷ và số dấu chấm động Thực tế, độ chính xác không có giới hạn, ngoại trừ phụ thuộc vào dung lượng bộ nhớ có trên hệ thống mà GMP đang chạy GMP có một tập phong phú các hàm, và các hàm đều có quy tắc biểu diễn.
- Tính toán số nguyên (MPZ): có khoảng 150 hàm số học và logic.
- Tính toán số hữu tỷ (MPQ): có khoảng 35 hàm chức năng
- Tính toán số dấu chấm động (MPF): có khoảng 70 chức năng
GMP được thiết kế để chạy nhanh nhất có thể, cho cả các toán hạng nhỏ và các toán hạng rất lớn Tốc độ đạt được bằng cách sử dụng “Full-words” cho các loại
số học cơ bản, sử dụng thuật toán tính nhanh, với các mã Assembly được tối ưu hoá cao cho các vòng lặp trong phổ biến của nhiều loại CPU, và chú trọng tới tốc độ.
Phiên bản GMP đầu tiên được phát hành vào năm 1991, nó tiếp tục được phát triển và duy trì với các phiên bản mới sau mỗi một năm Tính tới thời điểm tháng 3 năm 2014, phiên bản GMP mới nhất là 6.0.0
Một số hàm sử dụng trong chương trình:
mpz_t za: khai báo biến za
mpz_init_set(za,zb): khai báo za có kiểu số nguyên lớn và gắn giá trị za=zb mpz_mul(za,zb,zc): thực hiện tính za = zb.zc
mpz_tdiv_q(za,zb,zc): thực hiện chia lấy phần nguyên
mpz_add(za,zb,zc): thực hiện cộng số nguyên lớn za = zb + zc
mpz_sub(za,zb,zc): thực hiện trừ số nguyên lớn za = zb - zc
Trang 19III.1.2 Cài đặt thuật toán
mpz_init(ZF); mpz_init(ZQ); mpz_init(ZX);
mpz_init(ZT); mpz_init(temp); mpz_init(*ZN); //Step 1
Trang 20{
mpz_mul_ui(tempMIN,tempMIN,2); }
mpz_sub_ui(tempMAX,tempMAX,1); GenRandomINT(tempMIN,tempMAX,&ZX); //Step 4
mpz_init(temp3);
mpz_ui_pow_ui(temp3,2,k);
if(mpz_cmp(temp2,temp3)>=0){ mpz_sub_ui(temp3,temp3,1); mpz_tdiv_q(ZT,temp3,temp);
Trang 21}
//Step 8
if(success == 0) mpz_add_ui(ZT,ZT,1);
Trang 22Ví dụ số nguyên tố 2048 bit:
182390389082385737399160858290016465262713818569118615686 231868001036229082731683578055272893611103298461407863005 895451688159510121716861563261918853831171435345934810609 494294525714279027058466116795381140735417240321699249765 430214933277832745285335530979964544465842413815827125332 253690811404977726263862444552671885688685134701770436911 559547082725687122398785947916153596580372277311313963755 656489534421289058872118403269529763417410486709369178708 363253090718619109161403027489625236886295248352475514740 289241295865919985670739702593119408206455248636624978193 08491210887142346343198905550179243723513034609
Trang 23Ví dụ số nguyên tố 3072 bit:
570732091516615537093927700431615067798818095344798233883 767481374129961504303656588432846013465918070651513661359 496257494887850244713725352913363933456304979090835872394 390278376704765705559764920989196999844683834491715729509 508752317119751665601366422419072409985701212684428445152 284126810491410653202667539543108739147160776240417168497 341717403578717540678539445372895945772864209483845533820 726788064521375295088763589818923095167340799519532148825 196099975460257987495050800072046167886175453022544383031 472029714177838408436888427198767068892719536563545002012 046242834954661372429738091944322009748399363181589804055 687771476091014967050396051160181354476748289183889331390 812162437476250232527700216107968144137259039532734335430 604526496735745127512313842154517231448509202001695248244 357586705965132929495964040046230398822148371860946852474 924905451750289793663003121116995556890900469279660595866 7310124503621
Bộ sinh lâu nhất
Tổng thời gian
Thời gian trung bình
Trang 24KẾT LUẬN
Vấn đề sinh các số nguyên tố lớn, đặc biệt là các số nguyên tố lớn dùngtrong mật mã, là một lĩnh vực khá rộng, trong một thời gian ngắn học viênkhông thể nghiên cứu hết toàn bộ các thuật toán sinh số nguyên tố đã được đềcập trong báo cáo Bởi vậy, nhóm chỉ giới hạn tập trung nghiên cứu thuật toánsinh số nguyên tố của Shawe- Taylor
Sau một thời gian lỗ lực nghiên cứu mặc dù đây là thuật toán khó sốlượng tài liệu để nghiên cứu không nhiều, kết quả chính nhóm đạt được làviệc chứng minh tính đúng đắn của thuật toán, mô phỏng thuật toán bằngngôn ngữ lập trình C++ và thống kê được thời gian sinh của các số nguyên tố
có độ dài 1024, 2048, 3072 bít
Trang 25TÀI LIỆU THAM KHẢO
[1] A Menezes, P van Oorschot, and S Vanstone, “Handle Book of
Cryptography”, CRC Press, 1996.
[2] Joint Technical Committee ISO/IEC JTC 1, “ISO/IEC 18032”, 2005
[3] Richard Crandall, Carl Pomerance, “Prime Numbers”, 2005
[4] Dương Tử Cường, “Ngôn ngữ lập trình C++ từ cơ bản đến hướng đối tượng”, Nhà xuất bản khoa học kỹ thuật, Hà Nội, 2005
[5] Prime number, 26/01/2015, Hà Nội
<URL:http://en.wikipedia.org/wiki/Prime_number>