i
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN&TRUYỀN THÔNG
VÕ TÁ HOÀNG
NGHIÊN CỨU XÂY DỰNG
THUẬT TOÁN TẤN CÔNG HỆ MẬT RSA
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
Thái Nguyên – 2020
ii
LỜI CAM ĐOAN
Học viên xin cam đoan luận văn này là công trình nghiên cứu thực sự của
bản thân, dưới sự hướng dẫn khoa học của TS. Hồ Văn Canh.
Các số liệu, kết quả trong luận văn là trung thực và chưa từng được công
bố dưới bất cứ hình thức nào. Tất cả các nội dung tham khảo, kế thừa của các tác
giả khác đều được trích dẫn đầy đủ.
Em xin chịu trách nhiệm về nghiên cứu của mình.
Người cam đoan
Võ Tá Hoàng
iii
LỜI CẢM ƠN
Học viên trân trọng cảm ơn sự quan tâm, tạo điều kiện và động viên của
Lãnh đạo Trường Đại học Thái Nguyên, các thầy cô Khoa Đào tạo sau đại học,
các khoa đào tạo và các quý phòng ban Học viện trong suốt thời gian qua.
Học viên xin bày tỏ sự biết ơn sâu sắc tới TS. Hồ Văn Canhđã nhiệt tình định
hướng, bồi dưỡng, hướng dẫn học viên thực hiện các nội dung khoa học trong
suốt quá trình nghiên cứu, thực hiện luận văn.
Xin chân thành cảm ơn sự động viên, giúp đỡ to lớn từ phía Cơ quan đơn
vị, đồng nghiệp và gia đình đã hỗ trợ học viên trong suốt quá trình triển khai các
nội dung nghiên cứu.
Mặc dù học viên đã rất cố gắng, tuy nhiên, luận văn không tránh khỏi những
thiếu sót. Học viên kính mong nhận được sự đóng góp từ phía Cơ sở đào tạo, quý
thầy cô, các nhà khoa học để tiếp tục hoàn thiện và tạo cơ sở cho những nghiên
cứu tiếp theo.
Xin trân trọng cảm ơn!
Hà Nội, tháng năm 2020
Học viên
Võ Tá Hoàng
iv
MỤC LỤC
LỜI CAM ĐOAN ................................................................................................... i
LỜI CẢM ƠN ...................................................................................................... iii
MỤC LỤC ............................................................................................................ iv
DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT ............................................... vii
DANH MỤC HÌNH VẼ, BẢNG BIỂU ............................................................. viii
MỞ ĐẦU ............................................................................................................... 1
CHƯƠNG 1: TÌM HIỂU VỀ HỆ MẬT RSA ....................................................... 4
1.1 Hệ mật mã hóa RSA ........................................................................................ 4
1.1.1 Mô tả hệ mật RSA .................................................................................... 4
1.1.2 Thực thi hệ mật RSA ................................................................................ 6
1.1.3 Vấn đề an toàn của hệ mật RSA ............................................................... 6
1.2 Tính an toàn của hệ mật mã RSA .................................................................... 7
1.2.1 An toàn vô điều kiện ................................................................................ 7
1.2.2 An toàn được chứng minh ........................................................................ 7
1.2.3 An toàn tính toán ...................................................................................... 7
1.3 Các kiểu thám mã ............................................................................................ 8
1.3.1 Bài toán thám mã chỉ biết bản mã ............................................................ 9
1.3.2 Bài toán thám mã khi các cặp rõ/ mã đã biết ........................................... 9
1.3.3 Bài toán thám mã với bản rõ lựa chọn ..................................................... 9
1.3.4 Bài toán thám mã với bản mã lựa chọn .................................................... 9
1.4 Tấn công hệ mật RSA lợi dụng những lỗ hổng của chúng ............................. 9
1.4.1 Biết (n) tìm được p, q ........................................................................... 10
1.4.2 Biết số mũ bí mật của RSA .................................................................... 10
1.4.3 Giao thức công chứng ............................................................................ 12
1.4.4 Giao thức module n chung ..................................................................... 14
1.4.5 Giao thức số mũ công khai nhỏ .............................................................. 20
1.4.6 Giao thức số mũ bí mật nhỏ ................................................................... 21
v
1.4.7 Trường hợp các tham số p-1 và q-1 có các ước nguyên tố nhỏ ............. 24
Kết luận Chương 1 .............................................................................................. 26
CHƯƠNG 2: NGHIÊN CỨU MỘT SỐ THUẬT TOÁN TẤN CÔNG HỆ MẬT
RSA ..................................................................................................................... 27
2.1 Kiểm tra tính nguyên tố của một số .............................................................. 27
2.1.1 Đặt bài toán ............................................................................................ 27
2.1.2 Các thuật toán kiểm tra tính nguyên tố theo xác suất ............................ 28
2.1.2.1 Thuật toán Fermat ............................................................................... 29
2.1.2.2 Thuật toán Solovay-Strassen ............................................................... 29
2.1.2.3 Thuật toán Miller-Rabin ...................................................................... 30
2.1.2.4 So sánh thuật toán Fermat, Solovay-Strassen và Miller - Rabin ........ 31
2.1.2.5 Kiểm tra tính nguyên tố của số nguyên tố Mersenne .......................... 32
2.1.2.6 Một số thuật toán kiểm tra tính nguyên tố khác .................................. 32
2.2 Các thuật toán phân tích thừa số ................................................................... 34
2.2.1 Thuật toán tìm nhân tử lớn nhất thứ nhất ............................................... 34
2.2.2 Thuật toán phân tích thứ hai ................................................................... 37
2.2.3 Thuật toán phân tích thứ ba .................................................................... 38
Kết luận Chương 2 .............................................................................................. 42
CHƯƠNG 3: ĐỀ XUẤT THUẬT TOÁN TẤN CÔNG RSA KHÔNG CẦN
PHÂN TÍCH NHÂN TỬ ..................................................................................... 43
3.1 Mở đầu ........................................................................................................... 43
3.2 Cơ sở toán học của thuật toán ....................................................................... 44
3.2.1 Một số mệnh đề ...................................................................................... 44
3.2.2 Xác định hàm ф(n) ................................................................................. 45
3.3 Đề xuất thuật toán ......................................................................................... 46
3.3.1 Lưu đồ giải thuật .................................................................................... 46
3.3.2 Xây dựng chương trình .......................................................................... 47
3.3.3 Một số ví dụ ............................................................................................ 51
Kết luận Chương 3 .............................................................................................. 53
vi
KẾT LUẬN ......................................................................................................... 54
DANH MỤC TÀI LIỆU THAM KHẢO ............................................................ 55
PHỤ LỤC ............................................................................................................ 57
Phụ lục Mã nguồn Chương trình ......................................................................... 57
Phụ lục Thư viện tính toán số lớn ....................................................................... 71
1 Biểu diễn số lớn ................................................................................................ 72
2 Các phép toán với số lớn .................................................................................. 73
vii
DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT
Ký hiệu, Ý nghĩa viết tắt
Rivest - Shamir - Adlemal Hệ mật mã RSA RSA
Chinese Remainder Theorem Định lý đồng dư Trung Hoa RCT
GCD Greatest Common Divisor Ước chung lớn nhất
Trường số thực
Trường nhị phân
Tập hợp khóa mã
Thuật toán mã hóa
Thuật toán giải mã
Tập hợp các bản rõ
Tập hợp các bản mã
Hàm Phi_Ơle
Cặp số nguyên tố và
Số nguyên dương bất kỳ
Văn bản rõ thuộc
Bản mã thuộc
Thành phần khóa công khai
Thành phần khóa bí mật
Số nguyên tố Mersenne
Số nguyên lẻ
viii
DANH MỤC HÌNH VẼ, BẢNG BIỂU
Hình 3.1: Lưu đồ thuật toán ................................................................................ 47
Hình 3.2: Giao diện chính của chương trình ...................................................... 48
Hình 3.3: Kiểm tra tính chẵn của số cần phân tích ............................................ 49
Hình 3.4: Kiểm tra tính nguyên tố của số cần phân tích .................................... 49
Hình 3.5: Chức năng phân tích ........................................................................... 50
Hình 3.6: Chức năng dừng trong quá trình phân tích ........................................ 50
Hình 3.7: Chức năng hiển thị kết quả ................................................................. 51
1
MỞ ĐẦU
1. Đặt vấn đề
Hệ mật RSA được phát minh bởi Ron Rivest, Adi Shamir, và Len
Adleman, công bố lần đầu vào tháng 8 năm 1977 trên tạp chí khoa học Mỹ,
được sử dụng trong lĩnh vựcbảo mật và cung cấp cơ chế xác thực của dữ liệu
số [3],[17]. Ngày nay, RSA đã được phát triển và ứng dụng rộng rãi trong tất
cả các lĩnh vực đời sống, kinh tế xã hội, an ninh quốc phòng, đặc biệt là trong
thương mại điện tử. Theo [4],[6] RSA được sử dụng nhiều nhất để trao đổi khóa
bí mật và xác thực đối với hệ mật mã đối xứng; sử dụng trên web servers và
trên các browsers nhằm đảm bảo an ninh đường truyền, đặc biệt RSA được coi
là hạt nhân của hệ thống thanh toán điện tử... Bởi vậy, nghiên cứu phân tích hệ
mật RSA luôn thu hút sự quan tâm của nhiều quốc gia, tổ chức, các tập đoàn,
công ty và các nhà khoa học đầu tư nghiên cứu [7],[9].
Ở nước ta hiện nay, hầu hết các cơ quan, tổ chức hoạt động trong lĩnh
vực bảo mật và các trung tâm nghiên cứu, trường đại học khối kỹ thuật đều có
những kết quả nghiên cứu, phân tích hệ số an toàn đối với các tham số hệ mật,
từ đó chỉ rõ những mối nguy hiểm tiềm ẩn cần cải thiện hệ mật RSA khi sử
dụng [5],[10]. Vấn đề thám mã đối với hệ mật RSA hiện nay đang được các
nhà nghiên cứu tập trung khai thác dựa trên các sơ hở của RSA như: tấn công
vào số mũ công khai hoặc số mũ bí mật thấp, tấn công vào các tham số nguyên
tố bé hoặc cách xa nhau lớn, hoặc họ tập trung vào việc phân tích nhân tử
số (modul của RSA). Trường hợp đối với số lớn, từ trở lên thì các
phương pháp hiện tại không phát huy được hiệu quả hoặc chạy chậm và không
cho quả như mong muốn [3]. Mặt khác về mặt toán học đã chứng minh hiệu
quả của việc tấn công hệ mật RSA phụ thuộc vào cách thu hẹp khoảng cách dò
tìm số nguyên tố đối với hệ mật RSA. Do vậy cần có những nghiên cứu tấn
công RSA mới mà không cần phân tích nhân tử [4].
2
Xuất phát từ thực tế đó, luận văn “Nghiên cứu xây dựng thuật toán tấn
công hệ mật RSA” mang tính cấp thiết, thực sự có ý nghĩa khoa học và thực
tiễn.
2. Đối tượng và phạm vi nghiên cứu
- Nghiên cứu về các phương pháp tấn công hệ mật RSA hiện nay và đề
xuất một phương pháp tấn công RSA mới.
- Sử dụng ngôn ngữ lập trình C để xây dựng chương trình phần mềm
được đề xuất.
3. Hướng nghiên cứu của luận văn
Nghiên cứu tổng quan về vấn đề an toàn hệ mật RSA, các phương pháp
tấn công RSA phổ biến hiện nay. Từ đó đi sâu nghiên cứu đề xuất một phương
pháp tấn công RSA mới, không dựa trên bài toán phân tích nhân tử. Nghiên
cứu xây dựng phần mềm giải pháp và thực nghiệm, đánh giá.
4. Những nội dung nghiên cứu chính
Chương 1: Tổng quan về hệ mật RSA
Nghiên cứu mô tả, thực thi hệ mật RSA, vấn đề an toàn và các kiểu,
phương pháp tấn công hệ mật RSA phổ biến.
Chương 2: Nghiên cứu một số thuật toán tấn công RSA
Tập trung nghiên cứu, phân tích một số thuật toán tấn công RSA phổ
biến sử dụng chung phương pháp phân tích nhân tử. Nội dung chính của chương
trình bày kết quả nghiên cứu các thuật toán kiểm tra số nguyên tố và thuật toán
phân tích số nguyên thành tích các thừa số nguyên tố.
Chương 3: Nghiên cứu đề xuất thuật toán tấn công RSA
Dựa trên cơ sở lý thuyết toán học, nội dung Chương 3 nghiên cứu, tìm
hiểu và xây dựng chương trình thuật toán tấn công hệ mật RSA không cần phân
tích nhân tử. Việc tính toán, phân tích số nguyên để xác định các số nguyên
tố được thực hiện thông qua tính toán hàm . Đồng thời đã phân tích,
tính toán thực nghiệm để đưa ra một số kết luận.
3
5. Phương pháp nghiên cứu
- Nghiên cứu các bài báo khoa học, công trình nghiên cứu trong nước và
quốc tế.
- Nghiên cứu, phân tích các phương pháp tấn công RSA hiện nay. Từ đó
xây dựng thuật toán tấn công RSA mới.
- Xây dựng phần mềm ứng dụng và đánh giá.
6. Ý nghĩa khoa học của luận văn
Nghiên cứu vấn đề tấn công hệ mật RSA có ý nghĩa và vai trò to lớn
trong việc vệ an ninh thông tin. Đây là vấn đề đang được quan tâm, thu hút
nhiều quốc gia, tổ chức, cá nhân đầu tư nghiên cứu. Học viên đã nghiên cứu
tìm hiểu và xây dựng phần mềm giải pháp tấn công RSA, không cần phân tích
nhân tử. Do vậy, luận văn có tính khoa học và ứng dụng thực tiễn.
4
CHƯƠNG 1: TỔNG QUAN VỀ HỆ MẬT RSA
1.1 Hệ mật mã hóa RSA
Hệ mật RSA được phát minh bởi Ron Rivest, Adi Shamir và Len
Adleman và được Scientific American công bố lần đầu tiên vào năm 1977 [17].
Hệ mật RSA được sử dụng để bảo mật và đảm bảo tính xác thực của dữ
liệu số. Hiện nay RSA được sử dụng trong hệ thống thương mại điện tử, các
dịch vụ Web Server và Web Browser. RSA còn được sử dụng để đảm bảo tính
xác thực vào bảo mật của Email, đảm bảo an toàn cho các phiên truy cập từ xa
và là bộ phận quan trọng của hệ thống thanh toán thẻ tín dụng. Như vậy ta có
thể thấy rằng RSA thường được sử dụng trong các ứng dụng cần đảm bảo sự
an toàn và bảo mật dữ liệu số cao.
1.1.1 Mô tả hệ mật RSA
Định nghĩa hệ mật RSA
Hệ mật RSA bao gồm bộ . Trong đó [1]:
là tập các bản rõ. 1.
là tập các bản ký tự mã. 2.
3. là tập các khóa , mỗi khóa gồm hai phần: là khóa công khai
dành cho việc lập mã, còn là khóa bí mật dành cho việc giải mã.
4. Với mỗi bản rõ , thuật toán lập mã cho ta ký tự mã tương ứng
5. Với mỗi ký tự mã thuật toán giải mã cho ta lại ký tự bản rõ :
Hệ mật RSA sử dụng các tính toán trong trong đó là tích của hai số
nguyên tố lớn phân biệt nhau và . Mô tả hình thức của hệ
mật như sau:
Cho trong đó là các số nguyên tố lớn phân biệt nhau sao cho
độ dài của hai số này là gần nhau nhất có thể được.
5
Đặt: và định nghĩa
- Mã hóa:
- Giải mã:
Trong đó ,
Các giá trị công khai còn các giá trị được giữ bí mật.
Ta sẽ kiểm xem các phép mã hóa và giải mã có phải là các phép toán
nghịch đảo của nhau hay không?
Vì nên ta có với một số nguyên bất kỳ .
Giả sử có khi đó ta sẽ xét hai trường hợp.
a.Trường hợp . Khi đó ta có:
b. Trường hợp hoặc
Giả sử , khi đó với và
Suy ra: . Do nên
. Bên cạnh đó ta lại có:
. Vậy
Ví dụ:
Giả sử Bob chọn và . Khi đó và
.
Vì nên có thể dùng một số nguyên b khóa công khai có giá
trị không chia hết cho . Anh ta kiểm tra điều kiện bằng thuật
toán Euclidean.
Giả sử Bob chọn , khi đó theo thuật toán Euclidean mở rộng ta
có:
6
Do vậy số mũ mật (khóa bí mật) để giải mã của Bob sẽ là . Bob
sẽ công bố và .
Giả sử Alice muốn gửi bản rõ đến Bob. Cô ta sẽ tính:
Rồi gửi bản mã trên kênh truyền. Khi Bob nhận được bản mã
, anh ta sẽ sử dụng khóa bí mật để tính:
1.1.2 Thực thi hệ mật RSA
Để thiết lập hệ thống, Bob sẽ tuân theo các bước sau:
1. Bob tạo ra hai số nguyên lớn và sao cho độ dài của hai số gần bằng nhau nhất có thể được.
2. Bob tính và
3. Bob chọn một số ngẫu nhiên sao cho:
bằng cách sử dụng thuật toán
4. Bob tính Euclidean.
5. Bob công bố n và b trong một danh bạ và dùng chúng làn Hình 1.1: Thực thi hệ mật RSA khóa công khai. 1.1.3 Vấn đề an toàn của hệ mật RSA
Hệ mật RSA chỉ được an toàn khi giữ bí mật khóa giải mã và thừa số
nguyên tố (hay giữ bí mật ).
Trường hợp biết được thì Marvin dễ dàng tính được
. Khi đó Marvin sẽ sử dụng thuật toán Euclidean mở rộng để tính .
Khi biết thì toàn bộ hệ thống sẽ bị phá vỡ ngay lập tức. Vì khi biết ,
toàn bộ khóa đều được biết và Marvin sẽ giải mã được và sẽ đọc được nội
dung của bản rõ, Ngoài ra Marvin có thể lập mã trên văn bản khác là cực kỳ
7
nguy hiểm. Nhất là những thông tin liên quan đến an ninh quốc gia, quân đội,
ngân hàng.
1.2 Tính an toàn của hệ mật mã RSA
Tính an toàn của một hệ thống mật mã phụ thuộc vào độ khó của bài toán
thám mã khi sử dụng hệ mật đó. Người ta đã đề xuất một số cách hiểu cho khai
niệm an toàn của hệ thống mật mã, để trên cơ sở các ccách hiểu đó nghiên cứu
tính an toàn của nhiều hệ mật khác nhau, sau đây là một vài cách hiểu thông
dụng nhất:
1.2.1 An toàn vô điều kiện
Giả thiết người thám mã có được thông tin về bản mã. Theo quan niệm
lý thuyết thông tin, nếu những hiểu biết về bản mã không thu hẹp được độ bất
định về bản rõ đối với người thám mã, thì hệ mật mã là an toàn vô điều kiện,
hay theo thuật ngữ của C.Shannon, hệ mật là bí mật hoàn toàn. Như vậy, hệ là
an toàn vô điều kiện, nếu độ bất định về bản rõ sau khi người thám mã có được
cả thông tin (về bản mã) bằng độ bất định về bản rõ trước đó. Tính an toàn vô
điều kiện thường được sử dụng cho các hệ mật mã khó đối xứng.
1.2.2 An toàn được chứng minh
Một hệ thống mật mã được xem là có độ an toàn được chứng minh nếu
ta có thể chứng minh được bài toán thám mã đối với hệ thống đó “khó tương
đương” với một bài toán khó đã biết, thí dụ bài toán phân tích một số nguyên
thành tích các thừa số nguyên tố, bài toán tìm lôgarit theo một modul nguyên
tố,…(“khó tương đương” có nghĩa là nếu bài toán này giải được thì bài toán kia
cũng giải được cùng một độ phức tạp như nhau).
1.2.3 An toàn tính toán
Hệ mật mã được xem là an toàn về mặt tính toán, nếu mọi phương pháp
thám mã đã biết đều đòi hỏi một nguồn năng lực tính toán vượt quá mọi khả
năng (kể cả phương tiện thiết bị máy móc) tính toán của một kẻ thám mã. An
8
toàn theo nghĩa này, nói theo ngôn ngữ của lý thuyết về độ phức tạp tính toán
là bao hàm cả khái niệm an toàn theo nghĩa “được chứng minh” nói trên.
Tính an toàn theo nghĩa được chứng minh hay tính toán được sử dụng
nhiều trong công việc nghiên cứu các hệ thống mật mã hiện đại, đặc biệt là các
hệ thống mật mã khóa công khai. Các bài toán đó đều có hạt nhân là tính an
toàn của các hệ mật mã, góp phần giải quyết các vấn đề an toàn thông tin kể
trên.
1.3 Các kiểu thám mã
Mật mã được sử dụng trước hết là để đảm bảo tính bí mật cho các thông
tin được trao đổi trên các kênh truyền thông công cộng. Do đó bài toán quan
trọng nhất của thám mã cũng chính là bài toán phá bỏ tính bí mật đó, tức là: với
những bản mã có thể dễ dàng thu được trên các kênh truyền thông công cộng,
người thám mã phải tìm ra được nội dung thông tin che dấu bên trong bản mã
[8],[17],[18].
Giả thiết chung: Ta luôn coi đối phương biết hệ mã đang dùng. Giả thiết
này được gọi là nguyên lý KoreKhoff. Dĩ nhiên nếu đối phương không biết hệ
mật được dùng thì nhiệm vụ của anh ta sẽ khó khăn hơn nhiều. Tuy nhiên, ta
không muốn độ mật của một hệ thống dựa trên một giả thiết không chắc chắn:
đối phương không biết hệ mật đang sử dụng. Vì vậy, mục tiêu trong việc thiết
kế một hệ mật là phải đạt được độ mật của giả thiết KoreKhoff.
Việc thám mã có thể quy về việc tìm được bản rõ hoặc phát hiện khóa
giải mã, khi biết trước hệ mật mã sử dụng. Ngoài việc biết hệ mật mã, người
thám mã cần có thông tin về bản rõ và một số phát hiện khác. Tuỳ theo thông
tin đó là gì mà ta phân các bài toán thám mã thành 4 loại [2]:
- Bài toán thám mã chỉ biết bản mã: Đây là bài toán phổ biến nhất
- Bài toán thám mã khi biết cặp rõ/mã.
- Bài toán thám mã khi có bản rõ được chọn.
- Bài toán thám mã khi có bản mã được chọn.
9
1.3.1 Bài toán thám mã chỉ biết bản mã
Đây là bài toán phổ biến nhất. Người thám mã chỉ biết các bản mã
mà không biết bản rõ tương ứng với những bản mã đó cũng
như khóa giải mã. Anh ta cố gắng tìm khóa giải mã, nếu không cần tìm các bản
rõ .
1.3.2 Bài toán thám mã khi các cặp rõ/mã đã biết
Người thám mã biết các bản mã
Như trên, nhưng cũng biết các bản rõ tương ứng . Anh ta cố gắng
tìm khóa giải mã , nếu không thì cố gắng phỏng đoán bản rõ từ bản mã
mới đã được mã hóa cùng với khóa .
1.3.3 Bài toán thám mã với bản rõ lựa chọn
Người thám mã được quyền truy nhập tạm thời cơ chế mã hóa, nên có
thể chọn các bản rõ và có được các bản mã tương ứng ,
,.., , từ đó anh ta sẽ phỏng đoán khóa giải mã và có thể
tìm được bản rõ từ một vài bản mã mới cũng được mã hóa bởi
khóa lập mã .
1.3.4 Bài toán thám mã với bản mã lựa chọn
Người thám mã được quyền truy cập tạm thời vào cơ chế giải mã, nên từ
các bản mã anh ta nhận được các bản rõ tương ứng . Từ đó anh
ta phỏng đoán khóa giải mã và có thể tìm được bản rõ từ một vài bản mã
mới cũng được mã hóa bởi cùng khóa lập mã .
Trong mỗi trường hợp đối tượng cần phải xác định chính là khóa đã sử
dụng: Rõ ràng bốn mức tấn công (thám mã) trên đã được liệt kê theo độ tăng
dần của sức mạnh tấn công và cách tấn công các bản mã được lựa chọn là thích
hợp đối với hệ mật mã hóa công khai.
1.4 Tấn công hệ mật RSA lợi dụng những lỗ hổng của chúng
10
Tính bảo mật của RSA chủ yếu dựa vào việc giữ bí mật số mũ giải mã
và các thừa số của . Tuy nhiên, điều kiện an toàn trên của hệ mật chỉ là
điều kiện chung. Trong thực tế khi thiết kế một giao thức hay một kênh bí mật
có sử dụng hệ mật RSA vẫn tồn tại nhiều sơ hở, những sơ hở đó đã được thám
mã lợi dụng nhằm phá huỷ giao thức, kênh bí mật, phá vỡ tính an toàn của hệ
mật. Trong phần này, sẽ giới thiệu một số sơ hở người thám mã có thể lợi dụng
vào đó để phá vỡ hệ mật RSA [5, 8, 13].
1.4.1 Biết (n) tìm được p, q
Người ta có thể xác định được và ngược lại. Biết được người ta
có thể dễ dàng tính được .
Nếu biết được ta có thể tìm được bằng cách giải hệ phương trình:
Do đó là nghiệm của phương trình bậc 2:
Bởi vậy nếu người thám mã biết được anh ta có thể phân tích được
và phá được hệ mật.
Ngược lại cho trước rõ ràng việc tính được thực hiện dễ dàng:
1.4.2 Biết số mũ bí mật của RSA
Nếu như biết số mũ giải mã a thì coi như đã làm xong việc thám mã, vì
vậy việc tìm kiếm là không còn ý nghĩa đối với Marvin (người thám mã)
nữa. Tuy nhiên điều này còn có một ý nghĩa quan trọng hơn đó là nếu đối
phương biết thì ta không chỉ phải thay đổi số mũ giải mã mà còn phải chọn
modul khác. Vì khi Marvin biết được d, anh ta cũng có thể tính được . Do
đó Marvin sẽ biết cách tìm một khóa bí mật bất kỳ, néu hệ thống vẫn giữ nguyên
modul .
11
Bây giờ chúng ta sẽ chứng minh rằng: nếu biết số mũ giải sẽ tìm được
các thừa số của .
Thật vậy:
Do nên
Do là một số chẵn nên ta có thể viết dưới dạng.
với là số lẻ và .
Theo định lý ơle: với a thì . Do đó ta có:
(do là bội của và do đó là căn bậc hai của 1
theo module .
Theo định lý phần dư Trung Hoa, 1 có 4 căn bậc hai module . Hai
căn bậc 2 là , hai căn bậc hai là . Sử dụng
một trong hai căn bậc hai không tầm thường này sẽ tìm được trong thời
gian đa thức bằng cách tính
(1)
Đặt và
nên: Vì và
và
và
Suy ra hoặc phải khác và do nên một trong hai giá trị
chính là hoặc .
Ví dụ: Giả sử . Bốn căn bậc hai của 1 theo modul là:
. Căn bậc hai 92 nhận được bằng cách giải hệ
theo định lý phần dư China. Nếu tìm được nghiệm
không tầm thường này, thì nghiệm không tầm thường kia phải là 403-92=311.
Đó là nghiệm của hệ và .
12
Giả sử là căn bậc hai không tầm thường của 1 module . Khi đó ta có:
Nhưng không là ước của một nhân tử nào ở vế phải. Điều đó kéo theo
hoặc (và tương tự hoặc ). Tất nhiên có thể tính
ước chung lớn nhất bằng thuật toán Euclidean mà không cần phải phân tích nhâ
tử n. Bởi vậy hiểu biết về căn bậc hai không tầm thường 1 module n sẽ làm cho
việc phân tích n chỉ cần thực hiện trong thời gian đa thức. Yếu tố quan trọng
này là cơ sở của nhiều kết quả trong mật mã.
Trong ví dụ trên, và
Sau đây là thuật toán phân tích thừa số khi đã biết số mũ giải mã .
1. Cho ngẫu nhiên sao cho
2. Tính
3. If then quit (thanh công: hoặc )
4. Tính
, với là số lẻ 5. Viết
6. Tính
then quit (không thành công) 7. If
8. While do
9.
10.
11. If then quit (không thành công)
Else
Tính
(thành công: hoặc )
Thuật toán có xác suất thành công tối thiểu là .
1.4.3 Giao thức công chứng
13
Giao thức công chứng là giao thức được thiết kế cho một văn bản sau khi
A ký lên đó, người khác có thể xác thực được rằng văn bản này thực sự được
ký bởi A (nó cùng giống như như việc công chứng của công chứng viên ký chữ
ký của mình lên bản công chứng).
Để thiết lập giao thức công chứng, Bob phải chọn các tham số RSA: các
số nguyên tố và các số mũ hóa và khóa giải mã thỏa mãn
trong đó . Các giá trị là công khai, còn được Bob giữ bí mất.
Để ký một văn bản M, Bob sử dụng số mũ bí mật d để tính chữ ký
. Bất cứ ai cũng có thể sử dụng những thông tin công khai của Bob
để kiểm tra xem S có thật sựu là chữ ký của Bob trên hay không bằng cách
tính và so sánh với . Vì chỉ có Bob biết giá trị , giá trị dùng để tạo
ra . Giao thức công chứng khẳng định rằng chỉ có một mình Bob mới có thể
tạo ra .
Tuy nhiên Davida và Denning [6] đã chỉ ra rằng: Có thể tạo ra chữ ký
giả mạo của giao thức này. Sau đây là một phương pháp để thực hiện điều đó.
Bob có khóa bí mật d và khóa công khai e. Giả sử marvin muốn có được
chữ ký của Bob trên văn bản . Khi đó Marvin có thể thực hiện theo cách
sau đây:
Lấy một số ngẫu nhiên , tính , và đề nghị Bob ký
trên . Nếu Bob ký trên thì Marvin có thể dễ dàng tính được chữ ký
của Bob trên :
Vì
tìm được chính là chữ ký của Bob trên .
Thật vậy:
14
Kỹ thuật trên được gọi là kỹ thuật che khuất (blinding), kỹ thuật này cho
phép Marvin lấy được một chữ ký hợp pháp trên một văn bản anh ta muốn,
bằng cách yêu cầu Bob ký trên một văn bản "được che khuất" (blinding) ngẫu
nhiên. Bob không có thông tin về văn bản anh ta đang thực sự ký.
Kết quả của kỹ thuật này dựa trên một thực tế: RSA sử dụng một hàm
toán học (hàm mũ) bảo toàn phép nhân các giá trị đầu vào. Điểm mấu chốt của
cách tấn công này là nếu chọn và bất kỳ:
tức
Vậy để ngăn cản việc tấn công vào giao thức công chứng bằng kỹ thuật
che khuất ta phải huỷ bỏ khả năng sử dụng tính bảo toàn của phép nhân của kẻ
định giả mạo chữ ký. Một trong nhiều cách đó là sử dụng hàm “hash một chiều”
trên văn bản trước khi ký và kỹ thuật này được áp dụng trong nhiều ứng
dụng thực tế của RSA (ví dụ như thanh toán điện tử ẩn danh).
1.4.4 Giao thức module n chung
Tình huống dẫn đến việc sử dụng RSA có số module chung xảy ra như
sau: khi trong hệ thống có k người đăng ký sử dụng RSA. Để quản lý, phân
phối khóa được đơn giản, trung tâm sẽ tạo ta hai số nguyên tố và tính số
modul ; sinh ra các cặp khóa mã hóa và giải mã , sau đó cấp cho
người đăng ký thứ trong hệ thống, bí mật tương ứng, cùng các thông tin công
khai bao gồm số và một danh sách đầy đủ các khóa công khai ;
các cặp khóa mã hóa nguyên tố cùng nhau từng đôi một.
Bất kỳ người nào có thông tin công khai này dều có thể mã hóa văn bản
M và gửi cho người đăng ký thứ bằng cách sử dụng thuật toán mã hóa RSA
với khóa mã : , sau đó gửi cho người thứ hoặc người đăng
ký thứ có thể ký một văn bản bằng cách tính chữ ký . Bất kỳ
15
ai cũng có thể xác thực rằng được ký bởi người đăng ký thứ bằng cách
tính và so sánh với .
Tuy nhiên việc sử dụng modul chung dẫn đến một số điểm yếu của giao
thức dẫn đến các hình thức tấn công:
Kiểu tấn công thứ nhất
Như Simmón [6] chỉ ra, nếu một văn bản được gửi tới một người đăng
ký có các số mũ mã hóa nguyên tố cùng nhau thì đối phương có thể giải mã
được văn bản mà không cần biết khóa giải mã. Để chứng minh điều này ta hãy
xem kết quả văn bản gửi cho 2 người có khóa công khai tương ứng là và
:
Thuật toán sau đây chỉ ra rằng Marvin có thể lấy được bản rõ chỉ với
những giá trị anh ta biết như: , khóa lập mã và của người thứ và
người thứ .
Input:
Output: Văn bản
Algorithm:
Step 1: Tính
Step 2: Tính
Step 3: Tính
Rõ ràng
Thật vậy:
16
Như vậy ta đã có được điều cần chứng minh
Chúng ta sẽ xét một ví dụ để hiểu rõ hơn về thuật toán này
Ví dụ: , ,
,
Ta có
Vậy
Việc sử dụng chung cũng làm cho giao thức này dễ bị tấn công
theo những cách khác nữa mà trong đó một người đăng ký trong hệ thống có
thể bẻ gãy được hệ mật. Hệ mật bị sập, và điều tất nhiên kênh bí mật sẽ bị lộ vì
người đăng ký này có thể giải mã các văn bản của những người khác. Kênh chữ
ký cũng hỏng vì anh ta có thể giả mạo chữ ký của người dùng mà không bị phát
hiện. Đó là cách sử dụng phương pháp xác suất để phân tích ra thừa số modul
, hoặc sử dụng thuật toán tất định để tính số mũ giải mà không cần số
module.
Kiểu tấn công thứ hai
Ý tưởng cơ bản của kiểu tấn công thứ hai là phân tích số modul bằng
cách tìm căn bậc hai không tầm thường của . Nghĩa là tìm một số thỏa
mãn:
Với
Nếu tìm được số như thế thì số modul có thể phân tích được theo
cách sau đây:
Vì nên
17
Suy ra: với là số nguyên tuỳ ý.
Hay nói cách khác chia hết cho cả và .
Tuy nhiên, do nên (4)
Bất đẳng thức (4) cho ta thấy rằng nếu thì không chia hết
cho . Tương tự với , suy ra phải là hoặc .
Áp dụng thuật toán Euclidean ta sẽ phân tích được thừa số của . Vì vậy,
cách tấn công vào hệ thống này tập trung vào cách để tìm căn bậc hai không
tầm thường của .
Đặt và là số mũ của khóa mã hóa và giải mã của người dùng hệ
thống, thỏa mãn điều kiện . Do đó , với là
số lẻ.
Thủ tục sau đây sẽ giúp chúng ta tìm căn bậc hai không tầm thường của
:
1. Chọn số nguyên sao cho và
2. Tìm số nguyên dương nhỏ nhất thỏa mãn: (vì theo định lý ơle nếu
thì và là bội của nên chắc chắn tồn tại số
này.
3. Đặt:
4. Nếu , thì nó là căn bậc hai không tầm thường của .
5. Nếu thì quay lại bước 1.
Delaurentí [6] đã chứng minh rằng với a ngẫu nhiên,
Xác suất xảy ra:
Hay:
18
Do đó nếu ta xác định một thuật toán xác suất và thử lần lượt với m giá
trị ngẫu nhiên a theo tính chất:
Thuật toán này sẽ dừng nếu tính chất đó được nghiệm đúng ở một lúc
nào đó và cho ta kết quả . Trong trường hợp ngược lại thuật toán
sẽ dừng và không có kết quả.
Như vậy, một người trong cuộc có thể bẻ hệ mật trong giao thức này với
xác suất cao cùng với những thông tin mà anh ta có. Cách tấn công này là rất
quan trọng vì nó chỉ ra rằng những thông tin về cặp số mũ mã hóa và giải mã
có thể cho phép tìm ra thừa số của số modul n.
Kiểu tấn công thứ ba:
Một thành viên có thể sử dụng khóa công khai và khóa bí mật của anh ta
để sinh khóa bí mật của người dùng khác. Nghĩa là căn cứ vào số mũ hoá công
khai , người giữ cặp số mũ hóa/giải mã có thể tìm được số nguyên
mà không cần biết .
Để tìm được số này, cần phải tìm một số nguyên nguyên tố cùng
nhau với và là bội của . Điều này thực hiện được bởi . Khi đó,
do và nguyên tố cùng nhau nên tồn tại hai số và sao cho
(theo thuật toán Euclidean mở rộng). Vì là bội của nên và
khi đó .
Thủ tục tìm một số như sau(trong đó chỉ cần đến các giá trị và
)
1. Đặt
2. Sử dụng thuật toán Euclidean mở rộng để tính . Đồng thời
cũng tìm được 2 số và thỏa mãn
3. Nếu thì đặt và kết thúc.
19
4. Nếu thì đặt rồi quay lại bước 2.
Ta có thể chứng minh thuật toán trên như sau:
Theo thuật toán Euclidean mở rộng, tồn tại hai số và sao cho
, chính là ước chung lớn nhất của và .
, khi đó ta sẽ có: Nếu
Suy ra . Điều này có nghĩa chia hết cho hay
. Vậy chính là phần tử nghịch đảo của , hay chính là .
Thủ tục trên đưa ra được số mũ giải của . Độ phức tạp của hệ thống
này là . Đây chính là một mối đe doạ đối với hệ thống.
Một lần nữa ta khẳng định rằng, với những thông tin có sẵn cho mỗi
người dùng hợp pháp trong hệ thống, họ có thể bẻ được hệ thống mật mã, khi
đó hệ mật sẽ bị sập. Tất nhiên, người dùng này không thể thực hiện nguyên xi
theo yêu cầu của nhà thiết kế giao thức dành cho người dùng, nhưng với những
thông tin cần thiết vẫn có thể lấy được mà họ không hề vi phạm quy định của
giao thức.
Qua 3 kiểu tấn công trên cho thấy giao thức modul chung sẽ gặp thất bại
trong việc đảm bảo bảo mật các văn bản hoặc cung cấp sự xác thực cho chữ ký
của người dùng trong hệ thống. Vì vậy, trong việc thiết kế giao thức với hệ mật
RSA cần tránh việc sử dụng modul chung. Cụ thể, người thiết kế giao thức phải
xem xét xem đối thủ sẽ có thể làm được gì với những bản mã mà những bản rõ
của chúng có liên quan(giống nhau), hoặc khóa của họ có liên quan với nhau(ở
đây ta xét là nguyên tố cùng nhau).
Vì vậy để chống lại sự tấn công trong giao thức module chung, khi sử
dụng RSA để xây dựng hệ thống mật cần đảm bảo:
- Thông tin của một số cặp mã hóa, giải mã với số modul đã cho có khả
năng đối phó với thuật toán xác suất phân tích số module.
20
- Thông tin của một số mũ hóa/giải mã với modul đã cho có khả năng
đối phó với thuật toán tất định để tính các cặp mã hóa/giải mã khác nhau mà
không cần xác định trước .
1.4.5 Giao thức số mũ công khai nhỏ
Nhằm giảm tải thời gian mã hóa hoặc kiểm tra chữ ký người ta đưa ra
một biện pháp đó là sử dụng số mũ mã hóa nhỏ. Cách này thường được sử dụng
trên mạng có yêu cầu truyền dữ liệu thông tin lớn.
Trong giao thức này mỗi người dùng chọn và công bố khóa công
khai của mình. ở đây chúng ta quan tâm đến trường hợp số mũ mã hóa
là giống nhau và là một số nguyên nhỏ. Với một vài ứng dụng thì điều này rất
hấp dẫn vì ứng dụng với số mũ nhỏ có thể thực hiện đơn giản và nhanh hơn.
Tuy nhiên tính chất này sẽ làm cho giao thức thất bại nếu một người mã hóa
cùng một văn bản bằng số mũ và gửi cho nhiều người.
Ví dụ người dùng thứ nhất với khóa mã và văn bản được mã
hóa để gửi cho 3 người khác nhau. Khi đó ta sẽ có các bản mã tương ứng là:
Nếu là nguyên tố cùng nhau, thì áp dụng định lý phần dư Trung
Hoa sẽ tính được duy nhất thỏa mãn hệ phương trình trên. Tính
Ngược lại, không nguyên tố cùng nhau, thì sẽ là hoặc
chung của hai người. Khi đó người này hoàn toàn có thể phá vỡ được hệ mật
của người kia.
Để khắc phục nhược điểm này, văn bản cần được gán thêm một thông
tin ngẫu nhiên trước khi mã hóa để gửo cho mỗi người (ví dụ gắn thêm tem thời
gian). Trong ví dụ của chúng ta ở trên, các bản mã mới trong giao thức sẽ là:
21
Tuy nhiên, Hastad [14] đã chứng minh cách này có thể không cho đủ các
bản rõ khác nhau, để khắc phục nhược điểm vốn có của giao thức số mũ nhỏ.
Trong tài liệu của ông, đã chỉ ra rằng một hệ phương trình đồng dư:
Có bậc không lớn hơn có thể giải được trong thời gian đa thức nếu số
phương trình lớn hơn . Vì trong trường hợp này số mũ là 3, nếu văn
bản được điều chỉnh bằng tem thời gian được gửi ít nhất cho 7 thành viên trong
mạng, văn bản sẽ không còn là bí mật đối với người tấn công sau một khoảng
thời gian dài. Tuy nhiên, tem thời gian chỉ gồm một số bít nhỏ so với kích thước
của văn bản vì vậy nó có thể được ước lượng trước khi áp dụng thuật toán của
Hastad. Rõ ràng tính bảo mật của hệ thống không thể tuỳ thuộc vào tính bí mật
của tem thời gian.
Thất bại của giao thức được đề cập đến trong phần này đã nhấn mạnh
một điều, đó là người thiết kế giao thức phải quan tâm đến việc tăng thêm các
thông tin cho các bản mã mà bản rõ của nó có quan hệ (trong ví dụ là bằng nhau
hoặc sai khác tem thời gian) hoặc khóa của chúng có liên quan với nhau(như
cùng số mũ với module nguyên tố cùng nhau).
1.4.6 Giao thức số mũ bí mật nhỏ
Để rút ngắn thời gian giải mã(hoặc thời gian sinh chữ ký), người ta muốn
sử dụng một giá trị nhỏ hơn là giá trị ngẫu nhiên. Vì việc mã hóa theo modul
mất một khoảng thời gian tuyến tính là , nên số mũ nhỏ có thể nâng
hiệu quả thực thi nhanh hơn ít nhất 10 lần(đối với module 1024 bít). Tuy nhiên
22
theo tác giả M. Wiener[10] nếu giá trị số mũ giải nhỏ sẽ dẫn đến sập toàn bộ
hệ thống mật mã.
Để chứng minh điều này chúng ta xét định lý sau:
Định lý M. Wiener: Cho . Giả sử . Biết
(n,e) với nên tồn tại một số nguyên . Do đó, nếu
chia hai vế cho ta sẽ có:
Do đó:
Mặc dù Marvin không biết , nhưng có thể sử dụng để xấp xỉ nó.
Thật vậy, do nên . Mặt khác: nên:
. . Ta có: nên
Thay vào :
và nên:
Như vậy, số các phân số với xấp xỉ bằng
Thực tế, tất cả các phân số này có được là do sự hội tụ của khai triển
phân số liên tục của . Tất cả mọi việc phải làm là tính logn hội tụ của phân
số liên tục . Một trong những phân số đó sẽ bằng . Vì thế ,
chúng ta có và do đó là phân số tối giản. Đây là thuật toán tuyến
tính để khôi phục khóa bí mật .
Vì phổ biến là 1024 bít nên độ dài của ít nhất là 256 bít nhằm tránh
việc bị tấn công theo kiểu này. Nhưng thật không may, đối với những thiết bị
23
có dung lượng bộ nhớ nhỏ như Smartcard thì sẽ nhỏ hơn nhiều. Chính vì vậy
kiểu tấn công này vẫn có thể xảy ra.
Để khắc phục điều này, Wiener[10] đã đưa ra một số kỹ thuật cho phép
giải mã nhanh nhưng vẫn tránh được sự tấn công ở trên. Đó là:
+ Số lớn
Giả sử thay vì giảm , một người sử dụng làm khóa công
khai, trong đó với lớn. Rõ ràng có thể được sử dụng vào vị trí
của đối với văn bản mã hóa. Tuy nhiên, khi một giá trị của lớn được dùng
thì giá trị trong chứng minh ở trên không nhỏ nữa. Một phép tính đơn giản
chỉ ra rằng nếu thì sẽ không có vấn đề: “liệu với nhỏ nhất là bao
nhiêu?” thì cách tấn công ở trên không thể thực hiện được. Tuy nhiên giá trị
lớn sẽ dẫn đến tăng thời gian mã hóa.
+ Sử dụng CRT(Chinese Remainder Theorem): Sử dụng định lý phần dư
Trung Hoa [11, 13].
Giả sử chọn sao cho cả và nhỏ (khoảng
128 bít). Việc giải mã nhanh bản mã thực hiện như sau: tính
và . Sau đó sử dụng định lý phần dư Trung Hoa để tính giá trị
thỏa mãn yêu cầu. Vấn đề là mặc dù và nhỏ, giá trị có
thể lớn. Như vậy, cách tấn công theo định lý trên không thực hiện được.
Chú ý rằng với đã biết, sẽ tồn tại cách tấn công cho phép phân tích
ra thừa số nguyên tố trong thời gian . Vì vậy và không
thể chọn số quá nhỏ.
Chúng ta không biết chắc phương pháp nào kể trên là an toàn. Nhưng
điều mà chúng ta biết là cách tấn công của Wiener là không hiệu quả đối với
chúng. Một định lý do Boneh và Durfee[4] cải tiến chỉ ra rằng thì có
thể khôi phục từ . Kết quả này chỉ ra rằng giới hạn của Wiener là chưa
24
chặt chẽ khi cho rằng giới hạn là . Đây vẫn còn là một vấn đề mở cho
đến thời điểm hiện nay.
1.4.7 Trường hợp các tham số p-1 và q-1 có các ước nguyên tố nhỏ
Trong khi xây dựng hệ mật RSA, nếu ta bất cẩn trong việc chọn các tham
số và để hoặc có ước nguyên tố nhỏ thì hệ mật mã trở nên mất
an toàn. Khi hoặc có ước nguyên tố nhỏ thì ta có thể dùng thuật toán
Pollar đưa ra vào năm 1974 phân tích một cách hiệu quả.
Thuật toán được mô tả như sau:
Input: và một cận
Output: Trả lời:
- Thành công và đưa ra thừa số của
- Không thành công
Algirithm:
1.
2. For to do
3.
4. If then
Printf (“Thành công và các thừa số của là:”, ;
Else
Printf (“Không thành công”);
Giả sử là một ước nguyên tố của và có phân tích ra các số mũ
nguyên tố sau:
Đặt: , với
Nếu , khi đó
25
Ở cuối bước 2 ta có: nên ta cũng có vì .
Theo định lý Fermat ta có:
Vì nên . Tại bước 4 ta có và , do đó
. Số nguyên tố sẽ là ước không tầm thường của trừ khi
ở bước 3.
Ví dụ:
Giả sử . Nếu áp dụng với , thì sẽ thấy rằng
ở bước 3, còn và
Trên thực tế . Trong trường hợp này, phép
phân tích sẽ thành công do
Nếu lấy thì chắc chắn rằng
Trong thuật toán có luỹ thừa theo module, mỗi luỹ thừa cần nhiều
nhất là phép nhân module dùng cho thuật toán bình phương và nhân.
Việc tính ước chung lớn nhất có thể thực hiện trong thời gian bằng
thuật toán Euclidean. Bởi vậy độ phức tạp của bài toán sẽ là:
. Nếu B là , với số nguyên xác định nào đó thì
thuật toán thật sự là thuật toán thời gian đa thức. Tuy nhiên chọn như vậy, xác
suất thành công sẽ rất nhỏ. Mặt khác nếu tăng kích thước của lên thật lớn,
chẳng hạn tới thì thuật toán sẽ thành công nhưng khi đó nó sẽ không thực
hiện nhanh hơn phép chia thử. Như vậy, điểm bất lợi của thuật toán này là yêu
cầu phải có ước nguyên tố sao cho chỉ có các thừa số nguyên tố bé.
Giải pháp khắc phục:
Ta có thể dễ dàng xây dựng hệ mật RSA với module hạn chế được
việc phân tích theo phương pháp này.Trước tiên tìm một số nguyên tố sao
cho cũng là một số nguyên tố và một số nguyên tố sao cho
26
cũng là một số nguyên tố(chúng ta có thể kiểm tra điều này bằng các
thuật toán kiểm tra tính nguyên tố). Khi đó module RSA sẽ chống được
cách phân tích theo phương pháp .
Kết luận Chương 1
Hệ mật công khai RSA đã và đang được sử dụng, ứng dụng rộng rãi, giải
quyết bài toán bảo mật và xác thực, đảm bảo an ninh an toàn thông tin trong tất
cả các lĩnh vực của đời sống xã hội. Tuy nhiên trong quá trình nghiên cứu, sử
dụng cho thấy, hệ mật mã RSA cũng tồn tại những điểm yếu, là lỗ hổng cho
phép thám mã lợi dụng để phân tích, tấn công.
Nội dung chính của Chương 1 đã trình bày tổng quan 4 phương pháp
thám mã chung nhất đối với các hệ mật mã nói chung và RSA nói riêng. Trên
cơ sở đó, đã nghiên cứu, phân tích 7 hình thức tấn công dựa vào những điểm
yếu trong quá trình lựa chọn tham số hệ mật và quá trình sử dụng. Đồng thời
27
đưa ra biện pháp, cách thức và khuyến cáo đối với cả người lập mã và người sử
dụng để hạn chế, chống lại những tấn công đó.
CHƯƠNG 2: NGHIÊN CỨU MỘT SỐ THUẬT TOÁN TẤN CÔNGHỆ
MẬT RSA
Bài toán phân tích một số nguyên thành tích của các thừa số nguyên
tố là một bài toán khó. Biết một số là một hợp số thì việc phân tích thành
thừa số mới có ý nghĩa, do đó trước khi giải quyết bài toán phân tích thừa số ta
sẽ phải kiểm tra xem có phải là hợp số không. Nội dung chương 2 sẽ trình
bày tổng quan kết quả nghiên cứuthuật toán kiểm tra số nguyên tố và phân tích
số nguyên thành tích các thừa số nguyên tố.
2.1 Kiểm tra tính nguyên tố của một số
2.1.1 Đặt bài toán
28
Cho một số nguyên dương bất kỳ, kiểm tra xem có phải là số nguyên
tố không? Bài toán này được đặt ra từ những buổi đầu của số học và trải qua
hơn 200 năm đến nay vẫn là một bài toán chưa có được lời giải tối ưu nhất.
Bằng những phương pháp đơn giản như phương pháp sàng Euratosthene, từ rất
sớm người ta đã xây dựng được các bảng số nguyên tố đầu tiên, rồi tiếp tục
bằng nhiều phương pháp khác tìm được những số nguyên tố lớn. Tuy nhiên
hiện nay nhu cầu sử dụng các số nguyên tố và kiểm tra tính nguyên tố của các
số mới trở thành nhu cầu lớn và phổ biến, đòi hỏi nhiều phương pháp mới hiệu
quả hơn. Trong phần này học viên giới thiệu một số thuật toán kiểm tra tính
nguyên tố của một số nguyên .
Định nghĩa 1: Một số nguyên dương được gọi là số nguyên tố nếu nó
chỉ có ước là 1 và chính nó.
2.1.2 Các thuật toán kiểm tra tính nguyên tố theo xác suất
Theo định nghĩa trên ta thấy rằng để kiểm tra xem một số nguyên dương
bất kỳ có phải là số nguyên tố không, có một cách đơn giản đó là ta thực hiện
phép chia thử một số cho các số nằm trong khoảng từ đến . Nhưng điều
đó là khó khả thi nếu là một số lớn. Hiện nay các phương pháp kiểm tra gần
đúng số nguyên tố hầu như xuất phát từ giả thiết: Giả sử là một số tự nhiên,
từ các tính chất của số nguyên tố . Để là số nguyên tố thì phải thỏa
mãn điều kiện của số nguyên và phải có các tính chất . Nếu là một số
nguyên gần đúng cũng thỏa mãn các điều kiện trên thì ta có thể coi như là
một số nguyên tố. Các giải pháp cho các phương pháp kiểm tra tính gần đúng
này thường có những tính chất sau:
1. Với ta có thể kiểm tra hay không bằng một thuật toán có
độ phức tạp cỡ đa thức.
2. Nếu là số nguyên tố thì (rỗng)
3. Ngược lại nếu là hợp số thì .
29
2.1.2.1 Thuật toán Fermat
Định lý Fermat khẳng định rằng: nếu n là một số nguyên tố và là một
số nguyên bất kỳ, sao cho thì . Vì vậy, với một số
nguyên bất kỳ ta cần để trả lời xem có phải là số nguyên tố hay không, ta
phải tìm một số bất kỳ trong khoảng thỏa mãn điều kiện trên. Điều
này cũng tương đương: nếu ta không tìm được một số nguyên nào thỏa mãn
thì là hợp số.
Định nghĩa 2: Cho là một số nguyên lẻ và là một số nguyên thỏa
mãn . Ta nói là số nguyên tố với cơ sở (base) nếu
.
Thuật toán Fermat kiểm tra tính nguyên tố của một số nguyên lẻ :
Input: Số nguyên lẻ và là số lần kiểm tra
Output: Trả lời “ là số nguyên tố” hay “ là hợp số”
Algorithm:
1. For to
1.1. Chọn một số nguyên ngẫu nhiên
1.2. Tính
1.3. If return “ là hợp số”
2. Return “ là số nguyên tố”.
2.1.2.2 Thuật toán Solovay-Strassen
Solovay-Strassen là thuật toán kiểm tra tính nguyên tố theo xác suất. đây
là thuật toán được sử dụng phổ biến đầu tiên trong hệ mã hóa công khai, đặc
biệt là trong hệ mật RSA.
Nếu là số nguyên tố thì trong ký hiệu Jacobi và Legendre là tương
đương. Thuật toán Solovay-Strassen dựa trên định lý:
30
Định lý 1 (Tiêu chuẩn Euler): Nếu là số nguyên tố thì
với thỏa mãn .
Thuật toán Solovay-Strassen:
Input: Một số nguyên lẻ và số nguyên (là số vòng lặp)
Output: Trả lời “ là số nguyên tố” hay “ là hợp số”
Algorithm:
1. For to
1.1. Chọn số nguyên ngẫu nhiên (thỏa mãn )
1.2. Tính
1.3. If và then “ là hợp số”
1.4. Tính Jacobi symbol
1.5. If then “ là hợp số”
2. Return “ là số nguyên tố”.
Xác suất sai lầm là
2.1.2.3 Thuật toán Miller-Rabin
Thuật toán Miller-Rabin là thuật toán kiểm tra tính nguyên tố theo xác
suất mạnh nhất hiện nay. Thuật toán Miller-Rabin được dựa trên định lý sau:
Định lý Miller: Cho là số nguyên tố lẻ và ; là số lẻ. Với
một số bất kỳ thỏa mãn điều kiện thì:
hoặc với
Nếu số nguyên thỏa mãn điều kiện này thì được gọi là số nguyên tố
mạnh trên cơ sở(base) , tức là khi đó sẽ thỏa mãn mọi tính chất của số
nguyên tố trên cơ sở .
Thuật toán Miller-Rabin:
Input: Số nguyên lẻ và số nguyên (là số vòng lặp)
31
Output: Trả lời: “ là số nguyên tố” hay “ là hợp số”
Algorithm:
1. Phân tích với là số nguyên lẻ.
2. For to
2.1. Chọn ngẫu nhiên số nguyên thỏa mãn
2.2. Tính
2.3. If then
2.3.1. While và do
2.3.1.1. Tính
2.3.1.2. If then return (“ là hợp số”)
2.3.1.3. ;
2.3.2. If then return (“ là hợp số”)
3. Return “ là số nguyên tố”;
Xác suất sai lầm của thuật toán này và độ phức tạp tính toán là
.
2.1.2.4 So sánh thuật toán Fermat, Solovay-Strassen và Miller - Rabin
So sánh giữa hai thuật toán Fermat và Miller-Rabin ta thấy rằng: nếu với
số nguyên tố cần tìm lớn thì giải thuật Miller-Rabin tốt hơn Fermat nhưng
Miller chạy chậm hơn. Đối với những chữ ký điện tử áp dụng không nhiều các
định lý và tính chất của số nguyên tố thì thuật toán Fermat là lựa chọn tối ưu.
Mọi cơ sở a của n trong Fermat cũng là cơ sở của n trong Miller-Rabin. Do đó
thuật toán Miller-Rabin có độ an toàn cao hơn. Đối với những ứng dụng chữ
ký điện tử hiện nay, hầu như sử dụng thuật toán Miller-Rabin.
So sánh giữa hai thuật toán Solovay-Strassen và Miller_Rabin ta thấy
rằng: Thuật toán Solovay-Strassen và Miller_Rabin gần tương tự như nhau
32
nhưng thuật toán Miller-Rabin thực hiện tốt hơn. Xác suất sai của Miller-Rabin
là trong khi đó xác suất sai của Solovay-Strassen là .
2.1.2.5 Kiểm tra tính nguyên tố của số nguyên tố Mersenne
Định nghĩa số Mersenne: Cho số nguyên .
Số Mersenne là một số nguyên có dạng .Nếu là số nguyên tố
thì ta có số nguyên tố Mersenne.
Định lý 2: Cho số nguyên . Một số Mersenne là số nguyên
tố khi và chỉ khi nó thỏa mãn hai điều kiện sau:
(i) là số nguyên tố.
(ii) Và chuỗi các số nguyên được định nghĩa:
; với , thỏa mãn
Thuật toán kiểm tra tính nguyên tố của số Mersenne(Lucas-Lehmer)
Input: Một số Mersenne , với
Output: Trả lời “ là số nguyên tố” hay “ là hợp số”
Algorithm:
1. Trong khoảng từ 2 đến
1.1. Nếu s có nhân tử (ta sẽ dùng phép chia để kiểm tra (use
trial division)).
1.2. Return “ là hợp số”
2.
3. For to
Tính
4. Nếu thì “ là số nguyên tố”
Else “ là hợp số”.
2.1.2.6 Một số thuật toán kiểm tra tính nguyên tố khác
Thuật toán 1
33
Input: Số nguyên lẻ cần kiểm tra
Output: Trả lời
- “ là số nguyên tố”
- “ là hợp số”
Algorithm:
1. Step 1: Cho ;
2. Step 2: ;
3. Step 3:
3.1. If then là hợp số
3.2. Else then test:
3.2.1. If dừng, Trả lời “ là số nguyên tố”
3.2.2. If then
, go to step 2
Thuật toán 2 (Thuật toán Packington)
Input: với là số nguyên tố
Output: Trả lời
- “ là số nguyên tố”
- “ là hợp số”
Algorithm:
1. Lấy ngẫu nhiên số
2. Tính
3. If then “ là hợp số”
4. Tính
5. If then “ là hợp số”
6. Tính
7. If then “ là số nguyên tố”
34
8. If then “ là hợp số”
2.2 Các thuật toán phân tích thừa số
Trong toàn bộ các thuật toán được nêu ra ở dưới đây, chúng ta sẽ coi rằng
số nguyên cần phân tích ra thừa số là số lẻ. Bài toán phân tích thành thừa
số có thể dẫn việc tìm một ước của , vì khi biết một ước của thì tiến trình
phân tích được tiếp tục thực hiện bằng cách phân tích và .
Bài toán phân tích thành thừa số, hay bài toán tìm ước số của một số
nguyên cho trước, đã được nghiên cứu nhiều, nhưng cũng chưa có một thuật
toán nào hiệu quả để giải quyết nó trong trường hợp tổng quát [2, 3]. Do đó
người ta có khuynh hướng tìm thuật toán giả nó trong những trường hợp đặc
biệt, chẳng hạn khi có một ước nguyên tố với:
là B-mịn với một cần B>0 nào đó, hoặc khi là số Blum, tức là
số có dạng tích của hai số nguyên tố lớn nào đó.
Có rất nhiều thuật toán phân tích một số nguyên lẻ thành tích các số
nguyên tố như: thuật toán sàng bậc hai, thuật toán đường cong Elliptic, thuật
toán sàng trường số, hay phương pháp và thuật toán của Pollard, thuật
toán của Wiliams, thuật toán liên phân số và dĩ nhiên là các phép chia thử.
2.2.1 Thuật toán tìm nhân tử lớn nhất thứ nhất
Bài toán đặt ra: Cho trước số nguyên lẻ , với là các số nguyên
tố lớn. Giả thiết
Với giả thiết trên ta có thể dễ dàng chứng minh được
Thật vậy, ta có mà nên
Thuật toán thứ nhất này xác định số nguyên tố lớn nhất
Thuật toán như sau:
Input: Một số nguyên lớn lẻ (odds)
Output: hai nhân tử của
35
Algorithm:
Step 1: Set , , , ( là phần nguyên của
)
Step 2: If goto step 4
Step 3: Set , y=y+2 goto step2
Step 4: If then thuật toán dừng.
Khi đó chúng ta sẽ có:
(đây chính là hai nhân tử của )
Và là phân số có giá trị lớn nhất
Step 5: Set ;
Goto step 3
Tiến hành phân tích thuật toán thứ nhất, thuật toán này được xây dựng
dựa trên định lý Fermat. Nội dung của định lý Fermat như sau:
Định lý Fermat: Giả sử là một số nguyên dương lẻ có dạng
Trong đó và là các số nguyên tố. Khi đó biểu thức có thể
viết dưới dạng: với là các số nguyên dương. Các số nguyên
có mối quan hệ và
Chứng minh:
Thật vậy, giả sử khi đó ta có:
Ngược lại, nếu ta có: (1)
Với dương, ta có thể viết vế phải của (1) là
Áp dụng thuật toán Fermat, để phân tích thuật toán 1 xác định các thừa
số nguyên tố của .
36
Tại bước 4 ta thấy rằng:
Theo định lý Fermat ta sẽ có:
Nên: Suy ra: (do )
Và giá trị của phân số chính là giá trị lớn nhất của số nguyên tố
Ví dụ: Hãy tìm một nhân tử của với
Step 1: ; ,
Quá trình được tính toán như sau:
y R X
1 185 193
1 8 195
3 7 195
5 4 195
7 -1 195
7 194 197
9 187 197
11 178 197
13 167 197
15 154 197
17 139 197
19 122 197
21 103 197
37
23 197 82
25 197 59
27 197 34
29 197 7
31 197 -22
31 199 175
33 199 144
35 199 111
37 199 76
39 199 39
41 199 0
Khi đó ta sẽ có: . Vậy
Thuật toán 1 yêu cầu vòng lặp. Do vậy ưu điểm là đơn giản,
tuy nhiên đòi hỏi nhiều vòng lặp.
2.2.2 Thuật toán phân tích thứ hai
Ta biết độ an toàn của hệ mật RSA phụ thuộc vào độ khó của phép phân
tích thành các thừa số nguyên tố . Nếu hai số nguyên tố : thì
khả năng phân tích được là cao. Vì thế các nhà khoa học khuyến cáo: nên chọn
giá trị : và độ dài của xấp xỉ bằng một nửa độ dài . Khi đó
xác suất nằm trong khoảng là lớn.
Bài toán đặt ra: Cho là số nguyên dương lẻ, . Nội dung bài
toán này là tìm nhân tử lẻ nhỏ nhất của sao cho hoặc khẳng
định rằng không tồn tại nhân tử như vậy. Nội dung các bước tiến hành như sau:
Thuật toán được thực hiện như sau:
Input: Số nguyên dương
38
Output:
- Tìm ra nhân tử
- Trả lời “không tìm ra nhân tử nào như vậy”
Algorithm:
1. Step 1: Set ;
;
;
;
2. Step 2: If thuật toán kết thúc và ta không tìm được nhân
tử hay thừa số nào thỏa mãn điều kiện:
, 3. Step 3: Set
;
, goto step 5
5. Step 4: If , set
, goto step 5(quay lại bước này một lần nữa)
6. Step 5: If then là một thừa số của
Và thuật toán kết thúc, ta sẽ thu được
Else goto step 2
Như vậy ta thấy rằng thuật toán sẽ quét tất cả các giá trị lẻ nằm trong
khoảng
2.2.3 Thuật toán phân tích thứ ba
Bài toán đặt ra: (giống như thuật toán thứ nhất) cho trước một số lẻ,
hãy xác định nhân tử lớn nhất của n mà không vượt qua
Thủ tục này giải bài toán này được tiến hành như sau:
39
Lấy số nguyên
Ta lập ma trận (bảng) Sieve với ; như sau:
có nghiệm nếu nếu trái lại
Sau khi có bảng ta tiến hành xây dựng thuật giải như sau:
Input: Một số nguyên lẻ
Output: các thừa số nguyên tố của
Algorithm:
Step1: Đặt và , với
Step 2: If
For to goto Step4
Step 3: đặt ;
For i=1 to r goto Step 2
Step 4: đặt hoặc
4.1. If then là một nhân tử cần tìm của
và thuật toán kết thúc.
4.2. Else goto Step 3
Trong đó:
- là số nguyên bé nhất mà lớn hơn hoặc bằng .
- là số nguyên lớn nhất mà nhỏ hơn hoặc bằng
.
Thuật toán Pollard
Nguyên tố của nó đều . ý chính của thuật toán này là:
Giả sử là B-mịn. Ta ký hiệu là bội chung nhỏ nhất của tất cả các luỹ
thừa của số nguyên tố mà bản thân chúng .
40
Nếu thì , tức với là số nguyên bé nhất lớn
hơn .
Khi đó ta có:
Trong đó tích lấy theo tất cả các số nguyên tố khác nhau . Nếu là
một thừa số nguyên tố của sao cho là B-mịn, thì và do đó với
mọi bất kỳ thỏa mãn , theo định lý Fermat ta có: . Vì
vậy, nếu lấy thì . Nếu , coi như thuật toán không cho
ta kết quả mong muốn.
Tuy nhiên điều đó chắc không xảy ra nếu có ít nhất hai thừa số nguyên
tố khác nhau. Bây giờ chúng ta sẽ xét thuật toán để khẳng định thêm những lập
luận ở trên.
_Thuật toán Pollard phân tích thành thừa số:
Input: Một hợp số không phải là luỹ thừa của một số nguyên tố
Output: Một thừa số nguyên tố không tầm thường của
Algorithm:
1. Chọn một lần cho độ mịn
2. Chọn ngẫu nhiên một số nguyên
Tính
If then là kết quả cần tìm.
3. Với mỗi số nguyên tố thực hiện:
3.1. Tính
3.2. Tính
4. Tính
5. If then cho kết quả
41
6. Else không tìm thấy kết quả nào thỏa mãn.
Xét ví dụ sau để hiểu rõ hơn về thuật toán này. Dùng thuật toán cho
, chọn và .
Ta sẽ tính được . Chuyển sang thực hiện bước 3 ta được bảng
sau đây(mỗi hàng ứng với giá trị của ).
Q L A
2 24 2293244
3 15 13555889
5 10 16937233
7 8 15214586
11 6 9685355
13 6 13271154
17 5 11406961
19 5 554506
Sau đây là cách tính (bước 4)
Vậy ta tìm được một thừa số , do đó thừa số . Cả hai
đều là thừa số nguyên tố.
Ta thấy , có tất cả các ước nguyên tố đều , do đó
chắc chắn thuật toán kết thúc sẽ có kết quả. Thuật toán sẽ kết thúc không có kết
quả khi độ mịn được chọn quá bé để không một thừa số nguyên tố nào của
mà chỉ chứa các ước số nguyên tố . Như vậy, có thể xem _thuật
toán Pollard phân tích thành thừa số nguyên tố có hiệu quả đối với những số
nguyên là mịn, người ta tính được thời gian cần để thực hiện thuật toán là
cỡ vào khoảng phép nhân theo module.
42
Kết luận Chương 2
Tấn công hệ mật RSA, bản chất là việc phân tích để tìm ra khóa bí mật,
hay chính là việc tìm ra cặp số nguyên tố . Nội dung Chương 2 trình bày
kết quả tìm hiểu, nghiên cứu các thuật toán kiểm tra tính nguyên tố đối với một
số nguyên. Theo đó, đã nghiên cứu tìm hiểu 3 thuật toán phổ dụng nhất là
Farmat, Solovay-Strassen và Miller- Rabin, so sánh ưu điểm của 3 thuật toán
này để đưa ra một số khuyến cáo trong việc ứng dụng. Đồng thời trình bày kết
quả kiểm tra tính nguyên tố đối với số nguyên tố Mersenne, được sử dụng nhiều
trong lĩnh vực mật mã hiện nay.
Dựa trên các kết quả nghiên cứu về toán học, cùng với một số giả thiết,
Chương 2 trình bày tổng quan 3 thuật toán phân tích số nguyên bằng phương
43
pháp phân tích nhân tử được sử dụng phổ biến hiện nay. Các phương pháp phân
tích dựa trên phương pháp nhân tử này chỉ khả dụng trong trường hợp không
quá lớn. Do vậy với trường hợp số nguyên lớn cần có một thuật toán phân tích
đủ mạnh để giải quyết yêu cầu bài toán đặt ra.
CHƯƠNG 3: ĐỀ XUẤT THUẬT TOÁN TẤN CÔNG RSA KHÔNG
CẦN PHÂN TÍCH NHÂN TỬ
3.1 Mở đầu
Trong chương này, tác giả nghiên cứu và xây dựng phần mềm mô tả
thuật toán tấn công hệ mật RSA mà không cần phân tích nhân tử của
tham số RSA. Như chúng ta đã biết, các thuật toán phân tích nhân tử của tham
số RSA đã được trình bày ở chương 2 chỉ có hiệu quả khi tham số không quá
lớn, tức là số và với công cụ tính toán hiện đại nhất có thể có hiện tại.
Trong khi theo tiêu chuẩn X509 thì tham số phải lớn, cụ thể là mới
đảm bảo cho hệ mật RSA đủ an toàn. Một ưu điểm của thuật toán sắp được đề
xuất là tham số càng lớn càng tốt.
44
3.2 Cơ sở toán học của thuật toán
3.2.1 Một số mệnh đề
Cho là một số nguyên dương, chúng ta cần trả lời câu hỏi “ có phải
là tích của 2 số nguyên tố hay không?”Ta có các mệnh đề sau đây:
Mệnh đề 1. Giả sử, là một số nguyên dương lẻ, không chính phương
(square - free number). Điều kiện cần và đủ để là tích của 2 số nguyên tố là
bất đẳng thức kép sau đây được duy trì:
(3.1) . Trong đó là hàm Phi- Euler
Chứng minh
1/ Điều kiện đủ: Trước hết ta thấy rằng không phải là số nguyên tố vì
nếu là số nguyên tố thì . Điều này trái với giả thiết đã cho. Bây giờ,
giả sử là tích của 3 số nguyên tố trở lên. Ta ký hiệu là một số nguyên tố
nhỏ nhất và là một nhân tử của . Khi đó, rõ ràng rằng: và do đó, ta có
: trái với giả thiết, vậy điều kiện đủ được
chứng minh.
2/ Điều kiện cần:Giả sử với là hai số nguyên tố phân biệt,
theo tính chất của hàm Phi- Euler ta có:
Mặt khác
Vậy ta có: . Mệnh đề 1 được chứng minh.
Mệnh đề 2. Giả sử là tích của 2 số nguyên tố lẻ phân biệt
Khi đó:
(3.2)
Chứng minh. Đây là hệ quả của chứng minh Mệnh đề 1
Mệnh đề 3. Giả sử trong đó, là 2 số nguyên tố lẻ phân biệt
Khi đó giới hạn
45
(3.3)
Việc chứng minh Mệnh đề 3 được suy ra từ Mệnh đề 2
Mệnh đề 4. Cho với là 2 số nguyên tố lẻ phân biệt. Khi đó
việc biết được và tương đương việc biết được hàm . Nói chính xác
hơn, chúng ta có thể tính được hàm từ và với phép toán bít và
có thể tính được và từ hàm với phép toán bít.
3.2.2 Xác định hàm ф(n)
Để xác định hàm , ta thiết lập bài toán như sau:
Cho trước 2 số nguyên tố lẻ khác nhau . Đặt n = pq.. Ta biết rằng
. Lúc đó
(3.4)
Hay:
, từ đó có (3.5)
Phương trình bậc 2 ẩn cho ở (3.5) có dạng
, trong đó (3.6)
Do là chẵn và là số tự nhiên chẵn nên ta có thể biến đổi (3.6)
như sau:
Với , và
Từ đó, phương trình cho ở (3.5) được viết thành
(3.7)
Xét biệt số
(3.8)
46
là nghiệm nguyên dương nên căn bậc hai phải là giá trị nguyên
dương, tức phải là số chính phương (perfect square), nghĩa là là bình
phương đúng của một số nguyên dương. Như vậy, bài toán đặt ra hãy xác định
sao cho là số chính phương. Theo mệnh đề 3 ta chỉ cần xác định giá trị
:
(3.9)
3.3 Nghiên cứu thuật toán
3.3.1 Lưu đồ giải thuật
Input: Cho , trong đó là hai số nguyên tố lẻ khác nhau
Output: Xác định hoặc :
Algorithm:
Step 1. Tính
Step 2. Đặt
Step 3. Đặt , nếu lẻ
nếu chẵn
Step 4. Với tính
Step 5. Nếu là số nguyên thì dừng:
; là
đáp số bài toán
Step 6. Trái lại, đặt , quay lại Step 4
Lưu đồ thuật toán như sau:
47
Hình 3.2: Lưu đồ thuật toán
3.3.2 Xây dựng chương trình
Chương trình được viết bằng ngôn ngữ C, sử dụng thư viện số lớn
(BigNumber) kiểm tra và phân tích số nguyên thành số nguyên tố . Đây
là phương pháp tấn công hệ mật RSA mà không cần phân tích nhân tử.
3.2.2.1 Giao diện chương trình
48
Chương trình phân tích số nguyên tố được thiết kế giao diện như sau:
Hình 3.3: Giao diện chính của chương trình
Tại giao diện chính, thao tác nhập số cần phân tích và lựa chọn “phân
tích”. Trong quá trình muốn dừng việc phân tích thì clik “dừng”.
3.2.2.2 Một số chức năng chính
+ Kiểm tra số nhập vào là chẵn hoặc nguyên tố: Sau khi nhập số cần
phân tích và thao tác click “Phân tích”. Khi đó, đầu tiên chương trình sẽ tiến
hành kiểm tra tính chẵn và tính nguyên tố của số nhập vào. Nếu không thỏa
mãn, chương trình sẽ hiển thị thông báo “Số nhập vào là số chẵn, không hợp
lệ”và dừng việc phân tích.
49
Hình 3.4: Kiểm tra tính chẵn của số cần phân tích
Trường hợp là số nguyên tố, hiển thị “số nhập vào là số nguyên tố, không
phân tích được” và dừng việc phân tích.
Hình 3.5: Kiểm tra tính nguyên tố của số cần phân tích
+ Chức năng phân tích:Nếu thỏa mãn tính chẵn và tính nguyên tố,
chương trình sẽ tiến hành phân tích theo thuật toán đề xuất.
50
Hình 3.6: Chức năng phân tích
+ Chức năng dừng trong quá trình phân tích: Khi muốn dừng việc phân
tích, tính toán ta sẽ click “Dừng”, chương trình sẽ dừng toàn bộ việc tính toán
tại thời điểm yêu cầu.
Hình 3.7: Chức năng dừng trong quá trình phân tích
51
+ Hiển thị, thông báo kết quả: Hoàn tất quá trình phân tích, chương trình
hiển thị thông báo “xong” và kết quả tìm được của cùng toàn bộ các kết
quả tính .
Hình 3.8: Chức năng hiển thị kết quả
3.3.3 Một số ví dụ
Ví dụ 1: Cho , tìm hàm
Ta có và . Vậy cận trên của là
. Vì là một số chẵn nên ta chọn và tính
.
Vậy là số chính phương. Do đó là nghiệm cần tìm. Từ
đó và . Thử lại do đó
trùng với kết quả đã tìm được ở trên.
Ví dụ 2: Cho , xác định
do đó ;
Chọn
Tính không phải
là số chính phương;
52
không phải là số chính phương; Tính tiếp
là số chính phương; Tính tiếp
và , số nguyên tố Do đó
là
Ví dụ 3: Cho , xác định
; Ta có
Chọn
Tính không phải là số
chính phương;
Tính không phải là số chính phương;
Tiếp tục tính là số chính phương.
do đó
Từ đó tìm ra được hai số nguyên tố và
Ví dụ 4: Cho , xác định
Ta có và
Chọn
Tính không phải là
số chính phương.
Tính không phải số chính phương…
Tiếp tục tính là số chính phương
Do đó, và
Ví dụ 5: Cho , xác định
Tính
Chọn
53
Tính không phải số
chính phương
Tính không phải số chính phương…
Tính là số chính phương
Do đó
Kết luận Chương 3
54
Dựa trên một số kết quả nghiên cứu chứng minh về mặt toán học, thuật
toán phân tích số nguyên lớn có những ưu điểm nhất định, bởi khi càng lớn
thì càng tiệm cấn đến , nên việc xác định trở nên thuận lợi.
Kết quả thực nghiệm cho thấy việc tính toán trong các vòng lặp đơn giản, mỗi
vòng lặp chỉ thực hiện 4 phép tính cộng (+), trừ (-) và bình phương, do vậy việc
xây dựng chương trình thuật toán đơn giản. Ví dụ, đối với trường hợp n gồm
19 chữ số thập phân, thuật toán chỉ thực hiện 143217727 vòng lặp, số các phép
tính để xác định được giá trị là 536870908.
Chương trình phân tích có giao diện trực quan và các chức năng, thao tác
thân thiện người dùng. Một số thực nghiệm thực tế cho kết quả nhanh hơn đối
với các thuật toán sử dụng phương pháp nhân tử. Tuy nhiên để có kết luận một
cách chính xác hơn, cần có những thực nghiệm so sánh với các thuật toán phân
tích hiện có, dựa trên các phân tích, thống kê số liệu khảo sát, tổng hợp làm sở
cứ khoa học và thực tiễn chắc chắn, từ đó đưa ra những kết luận, đánh giá chính
xác và khuyến cáo phù hợp.
Mặt khác, để có thể áp dụng trong thực tế, chúng ta cần xác định cận
dưới của hàm một cách tối ưu hơn sao cho khoảng cách giữa cận trên và
cận dưới là gần nhau có thể được sao cho xác suất để nằm trong khoảng
đó là trên 99% .
KẾT LUẬN
55
Luận văn đã tiến hành nghiên cứu tổng quan về hệ mật RSA, phân tích
vấn đề an toàn của hệ mật, để làm rõ những điểm yếu, nguy cơ khai thác để tấn
công hệ mật hiện nay. Đồng thời đã nghiên cứu những phương pháp, biện pháp
phổ biến được sử dụng để tấn công RSA.
Trên cơ sở đó, luận văn tìm hiểu nghiên cứu một số thuật toán kiểm tra
tính nguyên tố và phân tích số nguyên lớn bằng phương pháp nhân tử, để đưa
ra những kết luận, so sánh giữa chúng. Theo đó đã chứng minh được các
phương pháp này đều không khả dụng trong trường hợp phân tích các số
nguyên lớn.
Kế thừa một số kết quả nghiên cứu, chứng minh mới về mặt toán học,
luận văn đã đi sâu nghiên cứu thuật toán phân tích số nguyên mới không sử
dụng phương pháp nhân tử. Đồng thời đã tiến hành xây dựng Chương trình
phân tích một cách trực quan, thân thiện và tổ chức thực nghiệm, đánh giá để
rút ra một số kết luận và khuyến cáo trong việc tấn công RSA.
Kết quả thực nghiệm ban đầu cho phép khẳng định phương pháp sử dụng
có nhiều ưu điểm. Tuy nhiên cần tiếp tục được nghiên cứu, phát triển, tối ưu
hóa cận dưới của hàm .
Mặt khác, để đạt hiệu quả phân tích thám mã cao, cần có sự đầu tư nghiên
cứu xây dựng hệ thống tính toán lớn, hiệu năng cao sử dụng các công nghệ mới
nhất để tăng tốc độ xử lý và tính toán.
DANH MỤC TÀI LIỆU THAM KHẢO
56
Tiếng Việt
[1] Hồ Văn Canh, Nguyễn Viết Thế, “Phân tích thông tin có bảo mật”
NXB Hà Nội T&T, 2010.
[2] Lê Công Tuấn Anh, Trịnh Nhật Tiến, “Các phương pháp tấn công
chữ ký số: rsa, elgamal, dss”, Đại học Công nghệ, Đại học Quốc gia Hà Nội,
2016.
[3] Mai Thị Thúy Hà, Hồ Văn Canh, “Nghiên cứu tấn công hệ mật khóa
công khai RSA”, Đại học Công nghệ, Đại học Quốc gia Hà Nội, 2013.
[4] Nguyễn Anh Tuấn, Hồ Văn Canh, “Xây dựng thuật toán tấn công
RSA không cần phân tích nhân tử”, Đại học Công nghệ, Đại học Quốc gia Hà
Nội, 2007.
[5] Phan Đình Diệu, “Lý thuyết mật mã và an toàn thông tin”, Đại học
Quốc gia Hà Nội, 2002.
Tiếng Anh
[6] Alfred J. Menezes, Scott A Vanstone, “Handbook of Applied
Cryptography”, CRC Press,1996.
[7] Abdelhak Azhari1, Samir Bouftass, “On a new fast public key
cryptosystem”, 2015.
[8] ANSIX9. 44, “Public Key Cryptography Using Reversible
Algorithms for the Financial Services Industry: Transport of Symmetric
Algorithm Keys Using RSA”, draft, 2004.
[9] Caxton Foster, “Cryptanalysis for Microcomputers”, Rochelle
Park,1982.
[10] D. Boneh, “Twenty Years of Attacks on the RSA Cryptosystems”,
Notices of the AMS, 1999.
[11] Donal Knut, “The Art of Progamming Computer”, Tom, 2004.
[12] I. Anshel, M. Anshel, and D. Goldfeld, “An algebraic method for
public-key cryptography”, Methematical Research Letters, 2006.
57
[13] Mark Stamp, Richard, M. Low, “Applied Cryptanalysis”, Wiley -
InterScience A. John wiley & Sons, INC Publication, 2007.
[14] W. Alext, B. Chor, O. Goldreich, and C.P. Schnor, “RSA and
Rabin functions: Certain parts are as hard as the whole”, SIAM Journal
on Computing, 2009.
Website
[15]http://vi.wikipedia.org/wiki/Số-nguyên-tố
[16] http://primes.utm.edu/largest.html
[17] http://www.rsa.com
[18] http://www.rsasercurity.com
PHỤ LỤC
Phụ lục Mã nguồn Chương trình
58
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Phan_Tich_So_Nguyen_To
{
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
--------
namespace Phan_Tich_So_Nguyen_To
{
partial class Form1
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
using System;
59
/// true if managed resources should be disposed;
otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new
System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.btnAnalysis = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// richTextBox1
//
///
60
((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.richTextBox1.Font = new System.Drawing.Font("Microsoft Sans Serif",
15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point,
((byte)(0)));
this.richTextBox1.ForeColor = System.Drawing.Color.ForestGreen;
this.richTextBox1.Location = new System.Drawing.Point(0, 58);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.ReadOnly = true;
this.richTextBox1.Size = new System.Drawing.Size(925, 477);
this.richTextBox1.TabIndex = 0;
this.richTextBox1.Text = "";
//
// textBox1
//
this.textBox1.AcceptsReturn = true;
this.textBox1.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F,
System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBox1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))),
((int)(((byte)(0)))), ((int)(((byte)(192)))));
this.textBox1.Location = new System.Drawing.Point(185, 17);
this.textBox1.Name = "textBox1";
this.textBox1.ShortcutsEnabled = false;
this.textBox1.Size = new System.Drawing.Size(280, 29);
this.textBox1.TabIndex = 1;
this.richTextBox1.Anchor =
61
System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
//
// btnAnalysis
//
this.btnAnalysis.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Right)));
this.btnAnalysis.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F,
System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnAnalysis.ForeColor = System.Drawing.Color.DarkGreen;
this.btnAnalysis.Location = new System.Drawing.Point(471, 14);
this.btnAnalysis.Name = "btnAnalysis";
this.btnAnalysis.Size = new System.Drawing.Size(116, 30);
this.btnAnalysis.TabIndex = 2;
this.btnAnalysis.Text = "Phân tích";
this.btnAnalysis.UseVisualStyleBackColor = true;
this.btnAnalysis.Click += new System.EventHandler(this.btnAnalysis_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F,
System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.ForeColor = System.Drawing.Color.Green;
this.label1.Location = new System.Drawing.Point(12, 20);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(167, 24);
this.label1.TabIndex = 3;
this.label1.Text = "Số cần phân tích";
//
// backgroundWorker1
this.textBox1.KeyPress += new
62
this.backgroundWorker1.WorkerReportsProgress = true;
this.backgroundWorker1.WorkerSupportsCancellation = true;
this.backgroundWorker1.DoWork += new
System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new
System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_Progr
essChanged);
this.backgroundWorker1.RunWorkerCompleted += new
System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_
RunWorkerCompleted);
//
// progressBar1
//
this.progressBar1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.progressBar1.Location = new System.Drawing.Point(0, 535);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(925, 23);
this.progressBar1.Step = 1;
this.progressBar1.TabIndex = 5;
//
// label2
//
this.label2.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Right)));
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F,
System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(697, 4);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(228, 51);
this.label2.TabIndex = 6;
//
63
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// button1
//
this.button1.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Right)));
this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F,
System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.button1.ForeColor = System.Drawing.Color.DarkGreen;
this.button1.Location = new System.Drawing.Point(593, 14);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(82, 30);
this.button1.TabIndex = 2;
this.button1.Text = "Dừng";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AcceptButton = this.btnAnalysis;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(925, 558);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Controls.Add(this.btnAnalysis);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.progressBar1);
this.label2.Text = "© All rights reserved by \r\nMr. Hoàng";
64
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "Form1";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "Phân tích số nguyên tố";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button btnAnalysis;
private System.Windows.Forms.Label label1;
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.Windows.Forms.ProgressBar progressBar1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
}
}
------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
this.ForeColor = System.Drawing.Color.DarkGreen;
65
namespace Phan_Tich_So_Nguyen_To
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Int64 tinhN(Int64 thamso)
{
return (thamso + 1) / 2;
}
Int64 tinhB(Int64 n, Int64 canN)
{
if ((n - canN) % 2 == 0)
return n - canN;
else return n - canN - 1;
}
Int64 tinhCanN(Int64 thamso)
{
return (Int64)Math.Sqrt(thamso);
}
Int64 tinhF(Int64 nPhay, Int64 B, Int64 N)
{
return (nPhay - B) * (nPhay - B) - N;
}
bool kiemTraSoChinhPhuong(Int64 N)
{
try
{
66
{
return true;
}
else
{
for (double i = 0; i < (Int64)Math.Sqrt(N)+1 ; i++)
{
if (i * i == N) return true;
}
}
return false;
}
catch (Exception)
{
MessageBox.Show("Error here");
return false;
}
}
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
//richTextBox1.ScrollToCaret();
}
private void backgroundWorker1_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
//progressBar1.Hide();
MessageBox.Show("Xong!");
btnAnalysis.Enabled = true;
if (N == 0 || N == 1)
67
int validate(string input)
{
long res=0;
if (!Int64.TryParse(input,out res) )
{
return 1;//số nhập không hợp lệ
}
res = Int64.Parse(input);
if (res % 2 == 0)
{
return 2;// số là số chẵn
}
else if (checkPrime(res) == 2)
{
return 3;// số nguyên tố
}
else return 0;// số hợp lệ
}
int checkPrime(Int64 number)
{
int count = 0;
for (int i = 1; i <= number; i++)
{
if(number%i==0) count++;
if (count > 2) break;
}
return count;
}
void AppendTextBox(string Value)
{
if (InvokeRequired)
}
68
this.Invoke(new Action
return;
}
richTextBox1.AppendText(Value);
//richTextBox1.ScrollToCaret();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (validate(textBox1.Text)==1)
{
AppendTextBox("Số nhập vào không hợp lệ \n");
}
else if (validate(textBox1.Text)==2)
{
AppendTextBox("Số nhập vào là số chẵn, không hợp lệ \n");
}
else if (validate(textBox1.Text) == 3)
{
AppendTextBox("Số nhập vào là số nguyên tố, không phân tích được \n");
}
else
{
Int64 N=Int64.Parse(textBox1.Text);
Int64 nPhay = tinhN(N);
//In ra N'
AppendTextBox("Bước 1: Tính n'=(n+1)/2: "+nPhay.ToString()+"\n");
Int64 B = tinhB(nPhay,tinhCanN(N));
AppendTextBox("Bước 2: Tính b'=n'-[sqrt(n)]: " + B.ToString() + "\n");
AppendTextBox("Bước 3: Tính toán tiếp theo: \n");
{
69
{
if (this.backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
long percentage = (B - i) * 100 / (B - 1);
if (percentage>100)
{
percentage = 100;
}
backgroundWorker1.ReportProgress((int.Parse(percentage.ToString())));
Int64 deltaPhay = (nPhay - i) * (nPhay - i) - N;
if (kiemTraSoChinhPhuong(deltaPhay))
{
Int64 deltaCP = (Int64)Math.Sqrt(deltaPhay);
Int64 p = nPhay - i - deltaCP;
Int64 q = nPhay - i + deltaCP;
String tmp = String.Format("Bước 3.{3} Delta' = ({4}-{5})^2-{6}={0} là
số chính phương;\n \t\t\t\t KẾT QUẢ: p={1} và q={2} \n", deltaPhay, p, q,(B-
i)/2+1,nPhay,i,N);
AppendTextBox(tmp);
return;
}
else {
String tmp = String.Format("Bước 3.{1} Delta' = ({2}-{3})^2-{4}={0}
không là số chính phương, tiếp tục tính \n", deltaPhay, (B - i)/2 +1, nPhay, i, N);
AppendTextBox(tmp);
}
//Thread.Sleep(100);
}
for (long i = B; i >= 0; i=i-2)
70
}
catch (Exception e1)
{
MessageBox.Show(e1.Message);
}
}
private void btnAnalysis_Click(object sender, EventArgs e)
{
btnAnalysis.Enabled = false;
button1.Enabled = true;
richTextBox1.Clear();
//backgroundWorker1.CancelAsync();
//progressBar1.Show();
backgroundWorker1.RunWorkerAsync();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
//backgroundWorker1.Dispose();
//backgroundWorker1 = null;
//GC.Collect();
btnAnalysis.Enabled = true;
MessageBox.Show("Dừng tính toán");
button1.Enabled = false;
}
71
}
}
}
Phụ lụcThư viện tính toán số lớn
72
Trước khi xây dựng giải pháp tấn công RSA, chúng ta nghiên cứu cách
biểu diễn số nguyên lớn cũng như các thuật toán số học làm việc với các số lớn
đó trong máy tính.
1 Biểu diễn số lớn
Có nhiều cách để biểu diễn và lưu trữ số lớn. Cách thông thường nhất là
biểu diễn bằng xâu ký tự. Cho một số lớn có chữ số thập phân được biểu
diễn trong hệ cơ số , có dạng ta sử dụng một xâu ký tự có
độ dài là ký tự để biểu diễn theo cách:
Chữ số được lưu vào phần tử
Chữ số được lưu vào phần tử
…………………………………….
Chữ số được lưu vào phần tử
Dấu của số lớn được đặt trong biến trạng thái “dau”
+ Nếu dau = 1 thì là số dương;
+ Nếu dau =-1 thì là số âm;
Ta quy ước khi nói đến số lớn thì là xâu ký tự, các phần tử của xâu
chính là các phần tử của số lớn được biểu diễn ở hệ cơ số một cách tương
ứng. Giả sử ta đang biểu diễn số lớn ở hệ cơ số nào đó và ta muốn chuyển số
lớn sang biểu diễn ở hệ cơ số thông qua thuật toán sau:
Input: số nguyên dương , số nguyên dương
Output: biểu diễn ở hệ cơ số của , ,
Thuật toán:
(1) ; ;
(2) while
; ;
73
(3) return
2 Các phép toán với số lớn
Ta quy ước số lớn biểu diễn trong hệ cơ số
2.1. So sánh hai số
Input: Số hai số lớn , có độ dài
Output:
- Nếu thì retum l.
- Nếu thì retum 0
- Nếu thì return 2.
Algorithm:
1. If ( dương, âm) return 1;
2. If ( âm, dương) return 0;
&&( âm) return 0; // 3: If
&& ( âm) return 1;// 4. if
&& ( dương) return 1; // 5. If
&& ( dương) return 0; // 6. If
7. If
7. l If ( dương)
For
return 1; // If
Else return 0;
7.2 Else if ( âm)
For
If return 0; //
Else if return 1; //
8. return 2;
74
2.2 Cộng hai số lớn dương
Cho là hai số lớn có độ dài lần lượt là và . Nếu số nào nhỏ hơn
sẽ được chèn thêm vào bên trái số đó sao cho độ dài của hai số là bằng
nhau.Cộng từng phần từ một của hai xâu lưu trữ hai số.
Input: Số hai số lớn , có độ dài
Output:
Algorithm:
; // nho: biến lưu giá trị nhớ của phép cộng , 1.
; 2. If
; Else
3. For
;
If
;
;
; Else
4. Return ;
2.3. Trừ hai số lớn dương
Cho là hai số lớn có độ dài lần lượt là và . Nếu số nào nhỏ hơn
sẽ được chèn thêm vào sao cho độ dài của hai số bằng nhau khi ta tiến hành
trừ. Ta tiến trừ từng phần tử một của hai xâu lưu trữ hai số lớn.
Input: Số hai số lớn , có độ dài
Output:
Algorithm:
1. ; // nho: biến lưu giá trị nhớ của phép trừ
2. For
75
;//chèn 0 vào nếu có độ dải nhỏ hơn 3. If
4. If
;
;
; Else
5. ;
6. Xét dấu cho ;
2.4 Phép nhân hai số lớn
2.4.1 Nhân số lớn với một số nguyên
Input: Số lớn và số nguyên
Output: , có độ dải tối thiểu bằng
Algorithm:
l. ; ;
p 2. for
; 3.
; 4.
; 5.
6. Độ dài của 1à ;
7. if
8. while
9. ; //Tăng độ dài của ,
; 10.
; 11.
12. ;
13.retum ;
76
2.4.2 Nhân hai số lớn
Cho hai số lớn , có cần tính có độ dài là
.
Để nhân hai số lớn ta tiến hành như sau:
- Lấy phần tử của số thứ hai nhân với tất cả các phần tử của số thứ nhất
hay nóicách khác lấy từng phần tử của nhân với toàn bộ cộng thêm một
phần tử nhớ, được kết quả đem chia cho hệ cơ số, lấy số dư làm kết quả của
hàng tương ứng, thương số là số nhớ của số mới.
- Dịch trái một số bước phù hợp.
- Cộng tất cả các kết quả nhân lại
Cụ thể thuật toán nhân hai số lớn như sau:
Input: Hai số lớn , có độ dài là và
Output:
Algorithm:
; 1.
2. BigNum ;
3. for
; 4. ; // Nhân một số lớn với một số nguyên
5. Dichtrai ; // dịch trái vị trí;
6. ;
7. Retum ;
2.5 Phép chia hai số lớn dương
Hai số lớn , có độ dài là và
Xét trường hợp phép chia hai số lớn có thương nhỏ hơn hoặc bằng 9
Input: Hai số lớn , có độ dài là và
Output: ; có độ dài là ;
77
Algorithm:
1.For to do
2. BigNum ;
3. ; // Nhân một số lớn với một số nguyên
4. If (Sosanh ==1) return
5. Else If (Sosanh ==2) retum
Thuật toán chia hai số lớn dựa trên ý tưởng của phép chia thông thường
Input: Hai số lớn có độ dài
Output:
Algorithm:
1. BigNum ;
2. If ( )
cout << “ Loi Chia Cho 0”;
return ;
3. If
3.1. ;
3.2. Độ dài của là 1;
3.3 dau = l;// dương
3.4 return ;
4.
5. for down to // đảo ngược
5.1. Độ dài của số lớn là;
; 5.2.
5.3. if then ;
else Dich ;// Dịch sang trái vị trí
;
78
Chuan ; // loại bỏ các số 0: dạng thành
5.5 if( Sosanh != 0){
Chia ;// chia hai số lớn có thương
;
; ;
;
Chuan ;
5.6 If then ;
6. Độ dài của là ;
7. Giá trị dấu của = (giá tri dấu của ).(giá trị dấu của y)
8. z = dao( ); // đảo ngược lại số ;
9. return ;
2.6 Lũy thừa
Input:
Output:
Algorithm:
1. Đưa về dạng biểu diễn nhị phân
2. Xét và nếu thì là kết quả
3. Xét
4. Nếu thì
5. For
5.1.
5.2. Nếu thì
6. Return ;
2.7 Ước chung lớn nhất
Sử dụng thuật toán Euclidean mở rộng tìm ước chung lớn nhất của 2 số.
79
Input: Hai số lớn
Output: và 2 số nguyên thỏa mãn
Algorithm:
1. if then
2.
; 3.
4. While
4.1. ;
4.2. ;
4.3.
5. If then
6.
7. return ;
2.8. Phép nhân theo module p
Để tính , ta biểu diễn dưới dạng nhị phân trong đó
Áp dụng thuật toán Horner
Input: Ba số lớn
Output:
Algorithm:
; 1.
2. ;
3. For
80
;
If then ;
4. return ;
2.9 Tính căn của số nguyên lớn
Ta thực hiện tính căn của số nguyên có số phần tử chẵn. Để
ta thực hiện:
1. Chia thành cặp
2. Tìm một số nguyên dương // là số nguyên dương gần
nhất có thể được.
3. Tính
4. Ghép
5. Tính
6. Tìm một số nguyên dương sao cho
7. Tính
8. Đặt và lặp lại bước 5 // tức
9. Nếu thì dừng và số nguyên là số phải tìm.
2.10 Tìm phần từ nghịch đảo theo module p
Để tính nghịch đảo, chúng ta sẽ sử dụng thuật toán Euclidean mở rộng.
Algorithm:
Input: với
Output:
1. Sử dụng giải thuật Euclidean mở rộng tìm thỏa mãn điều kiện
và .
2. Nếu thì không tồn tại,
Ngược lại thì là giá trị cần tìm
2.11 Phép cộng có dấu
81
Phép cộng hai số có dấu được thực hiện dựa trên phép so sánh, phép cộng
và phép trừ hai số không âm đã trình bày; dấu của số lớn được lưu bít cao nhất
của số lớn.
Thuật toán cộng hai số lớn có dấu được thực hiện như sau:
Input: Hai số lớn
Output:
Algorithm:
1. If ( cùng dấu)
1.1. ;
1.2. Đặt cùng dấu với ;
1.3.Return ;
2. if ( dương) // âm
2.1. If(s = Sosanh !=0)
Retum ;
2.2. If(s==0)
;
Đặt cùng dấu với ;
return ;
3. if ( âm) // dương
3.1.if((s = Sosanh )==0)
Retum ;
3.2 if(sl==0)
;
Đặt cùng dấu với ;
Retum
2.12 Phép trừ có dấu
Phép trừ hai số có dấu được thực hiện dựa trên phép cộng hai số có dấu
82
Input: Hai số lớn
Output:
Algorithm:
1. Đổi dấu của ;
2. Cộng có dấu ;
3. Return ;
2.13 Phép nhân có dấu
Phép nhân hai số có dấu được thực hiện dựa trên phép nhân hai số không
âm đã được trình bày ở trên.
Input: Hai số lớn
Output: ;
Algorithm:
1. If ( cùng dấu) return ;
2. If( khác dấu)
;
Đổi dấu ;
3. Return ;