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

Bài tiểu luận an ninh mạng viễn thông giải thuật rsa

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

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA VIỄN THƠNG 1

BÀI TIỂU LUẬN AN NINH MẠNG VIỄN THÔNG
GIẢI THUẬT RSA


Giải thuật RSA

MỤC LỤC
LÝ DO CHỌN ĐỀ TÀI ................................................................................................. 1
MỤC ĐÍCH VÀ PHẠM VI TIỂU LUẬN ................................................................... 2
PHÂN CƠNG LÀM VIỆC ........................................................................................... 2
1. GIỚI THIỆU .............................................................................................................. 2
2 .GIẢI THUẬT RSA .................................................................................................... 3
2.1 Mơ tả giải thuật .......................................................................................... 3
2.2 Các khía cạnh tính tốn ............................................................................. 7
2.2.1 Mã hóa và giải mã ................................................................................ 7
2.2.2 Tạo khóa .............................................................................................. 9
3. VẤN ĐỀ BẢO MẬT VỀ RSA ................................................................................ 10
3.1 Tấn công cưỡng bức ................................................................................. 11
3.2 Tấn cơng tốn học .................................................................................... 12
3.3 Tấn cơng thời gian ................................................................................... 13
3.4 Tấn công dựa trên lỗi phần cứng .............................................................. 14
3.5 Tấn cơng bản mã lựa chọn thích ứng và đệm mật mã ............................... 15
4. ỨNG DỤNG ............................................................................................................. 16
4.1 Bảo mật dữ liệu ........................................................................................ 16
4.2 Chữ kỹ số (Digital Signature) ................................................................... 18
5. KẾT LUẬN .............................................................................................................. 20
II. MÔ PHỎNG GIẢI THUẬT RSA BẰNG LẬP TRÌNH PYTHON ................... 20
1. Đầu tiên ta xây dựng các hàm dưới đây ...................................................... 20


2. Chạy thực thi mã hóa giải thuật RSA với nội dung mã hóa như trên .......... 29
TÀI LIỆU THAM KHẢO........................................................................................... 31

LÝ DO CHỌN ĐỀ TÀI
Đây là một giải thuật mã hóa khóa công khai được sử dụng rất phổ biến trong
internet hiện nay và được giới thiệu trong môn An ninh mạng viễn thơng, vì sự tị mị
và ham học hỏi nên chúng em đã quyết định tìm hiểu thêm về giải thuật này để hiểu rõ
hơn cách nó hoạt động cũng như ứng dụng của nó một cách chi tiết hơn.

1


Giải thuật RSA

MỤC ĐÍCH VÀ PHẠM VI TIỂU LUẬN
Mục đích của bài tập này là trình bày lịch sử ra đời của giải thuật mã hóa khóa cơng
khai RSA rồi đến giải thuật của nó. Tiếp theo là những điểm yếu của nó và ứng dụng
của nó trong internet hiện nay.

PHÂN CƠNG LÀM VIỆC
Trần Quang Thành : Trình bày về giải thuật, một số vấn đề liên quan đến mã hóa,
giải mã, tạo và phân phối khóa,...
Nguyễn Hữu Huy: Trình bày về các vấn đề bảo mật liên quan đến RSA, cũng như
một số chứng minh, minh họa…..
Lưu Thị Nguyệt Anh: Trình bày về ứng dụng của RSA , ví dụ thực tế,....
Trên đây chỉ là nội dung chính của từng cá nhân cịn thực tế thì phần nào cũng có
những đóng góp của tất cả các thành viên.

1. GIỚI THIỆU
Ý tưởng về hệ thống mật mã khóa cơng khai-riêng tư không đối xứng là do

Whitfield Diffie và Martin Hellman , những người đã công bố khái niệm này vào
năm 1976. Họ cũng đưa ra chữ ký số và cố gắng áp dụng lý thuyết số. Công thức
của họ sử dụng khóa bí mật dùng chung được tạo ra từ phép lũy thừa của một số,
môđun một số nguyên tố. Tuy nhiên, họ bỏ ngỏ vấn đề nhận ra một hàm một
chiều, có thể là do khó khăn nên chưa được nghiên cứu kỹ lưỡng vào thời điểm đó.
Ron Rivest , Adi Shamir và Leonard Adleman tại Viện Công nghệ Massachusetts ,
đã thực hiện nhiều nỗ lực trong suốt một năm để tạo ra một hàm một chiều mà khó
có thể đảo ngược được.
Trong mật mã học, RSA (Rivest – Shamir – Adleman) là một thuật tốn mật mã
hóa khóa cơng khai. Đây là thuật tốn đầu tiên phù hợp với việc tạo ra chữ ký điện
tử đồng thời với việc mã hóa. Nó đánh dấu một sự tiến bộ vượt bậc của lĩnh vực
mật mã học trong việc sử dụng khóa cơng cộng. RSA đang được sử dụng phổ biến
2


Giải thuật RSA

trong thương mại điện tử và được cho là đảm bảo an tồn với điều kiện độ dài
khóa đủ lớn. Từ viết tắt RSA xuất phát từ họ của Ron Rivest , Adi Shamir và
Leonard Adleman , những người đã cơng khai mơ tả thuật tốn vào năm 1977.

2 .GIẢI THUẬT RSA
2.1 Mơ tả giải thuật
Các khóa cho thuật toán RSA được tạo theo cách sau:
1. Chọn hai số nguyên tố phân biệt p và q .


Vì mục đích bảo mật, các số nguyên p và q nên được chọn ngẫu nhiên và
phải có độ lớn tương tự nhau nhưng độ dài khác nhau một vài chữ số để làm
cho việc tính tốn khó hơn.



2.

p và q được giữ bí mật.

Tính n = pq.


n được sử dụng làm mơđun cho cả khóa cơng khai và khóa riêng. Độ dài
của nó, thường được biểu thị bằng bit, là độ dài khóa .


3.

n được phát hành như một phần của khóa cơng khai.

Tính λ ( n ) (λ là hàm trọng tâm của Carmichael) .
Vì n = pq nên λ ( n ) = lcm ( λ ( p ), λ ( q ))

(lcm: bội chung nhỏ nhất)

Vì p và q là số nguyên tố nên:
λ(p)=φ(p)=p-1
λ(q)=q-1
=> λ( n ) = lcm (p - 1, q - 1)


λ ( n ) được giữ bí mật.




Lcm có thể được tính thơng qua thuật tốn Euclide (thuật tốn này dùng để
tính ước chung lớn nhất của hai số nguyên)
Vì: lcm (a, b) =

4.

| 𝑎𝑏 |
𝑔𝑐𝑑 (𝑎 ,𝑏)

Chọn số nguyên e sao cho 1 < e < λ ( n ) và gcd (e , λ ( n )) = 1, nghĩa là e và λ
( n ) là 2 số nguyên tố cùng nhau.

3


Giải thuật RSA


e có độ dài bit ngắn và trọng lượng Hamming nhỏ dẫn đến mã hóa hiệu quả
hơn , giá trị được chọn phổ biến nhất cho e là 2 16 + 1 = 65537 . Giá trị nhỏ
nhất (và nhanh nhất) có thể có đối với e là 3, nhưng giá trị nhỏ như vậy đối
với e đã được chứng minh là kém an toàn hơn trong một số cài đặt.

5.



e được phát hành như một phần của khóa cơng khai.




e được gọi là số mũ cơng khai hoặc số mũ mã hóa hoặc chỉ số mũ .

Xác định d là d ≡ e −1 (mod λ ( n )), nghĩa là, d và e là nhân nghịch đảo của
modulo λ ( n ).


Điều này có nghĩa là tìm d khi cho phương trình d ⋅ e ≡ 1 (mod λ(n)) , d có
thể được tính tốn một cách hiệu quả bằng cách sử dụng thuật toán Euclid
mở rộng , vì nhờ e và λ ( n ) là cùng chuẩn, phương trình đã nói là một dạng
đồng nhất của Bézout , trong đó d là một trong các hệ số.



d được giữ bí mật dưới dạng số mũ của khóa riêng .



d được gọi là số mũ bí mật hoặc số mũ giải mã.

Khóa cơng khai bao gồm mơđun n và số mũ cơng khai e. Khóa riêng tư bao gồm số
mũ d riêng tư, phải được giữ bí mật. Và p , q , và λ ( n ) cũng phải được giữ bí mật vì
chúng có thể được sử dụng để tính d. Trên thực tế, tất cả chúng đều có thể bị loại bỏ
sau khi tính tốn d.

Trong phiên bản RSA ban đầu, các hàm Euler φ ( n ) = ( p - 1).( q - 1) được sử dụng
thay cho λ(n) để tính số mũ riêng d . Vì φ ( n ) luôn chia hết cho λ ( n ) nên thuật toán
cũng hoạt động tương tự. Việc sử dụng hàm Euler totient cũng có thể được coi là hệ

quả của định lý Lagrange áp dụng cho nhóm nhân các số nguyên modulo pq . Vì vậy,
bất kỳ d thỏa mãn d.e ≡ 1 (mod φ ( n )) cũng thỏa mãn d.e ≡ 1 (mod λ(n)) . Tuy nhiên,
tính tốn d modulo φ (n) đôi khi sẽ mang lại kết quả lớn hơn mức cần thiết (tức là d >
λ(n)). Hầu hết các triển khai của RSA sẽ chấp nhận số mũ được tạo bằng một trong hai
phương pháp (nếu chúng sử dụng số mũ riêng d , thay vì sử dụng phương pháp giải mã
tối ưu hóa dựa trên định lý phần dư Trung Quốc (CRT) ), nhưng một số tiêu chuẩn như
FIPS 186-4 có thể yêu cầu d < λ ( n ) . Bất kỳ số mũ riêng "q khổ" nào khơng đáp
ứng tiêu chí đó ln có thể bị giảm modulo λ ( n ) để thu được số mũ tương đương nhỏ
hơn.
4


Giải thuật RSA

Vì bất kỳ thừa số chung nào của (p - 1) và (q - 1) đều có trong phân tích nhân tử của n
- 1 = pq - 1 = (p - 1) (q - 1) + (p - 1) + (q - 1) , khuyến nghị rằng (p - 1) và (q - 1) chỉ
có những yếu tố chung rất nhỏ, nếu có bên cạnh những yếu tố cần thiết 2.
➢ Tóm lại các bước trong RSA ban đầu:
1. Chọn hai số nguyên tố lớn p và q (p ≠ q), lựa chọn ngẫu nhiên và độc lập
2. Tính n = p.q
3. Tính giá trị φ(n) = (p -1).(q - 1)
4. Chọn một số tự nhiên e sao cho 1< e <φ(n) và là số nguyên tố cùng nhau với
φ(n)
5. Tính d sao cho: d.e ≡ 1 mod (φ(n))
Lưu ý: Một số bài báo các tác giả thực hiện việc tạo khóa bằng cách chọn d và sau
đó tính tốn e, trong khi hầu hết các triển khai hiện tại của RSA, chẳng hạn như những
triển khai sau PKCS # 1 thì làm ngược lại (chọn e và tính d ). Vì khóa được chọn có
thể nhỏ trong khi khóa được tính tốn thơng thường thì khơng, thuật tốn của giấy
RSA tối ưu hóa việc giải mã so với mã hóa, trong khi thuật tốn hiện đại tối ưu hóa mã
hóa thay thế.


Giả sử rằng Bob muốn gửi thông tin cho Alice . Nếu họ quyết định sử dụng RSA,
Bob phải biết khóa cơng khai của Alice để mã hóa thơng điệp và Alice phải sử dụng
khóa riêng của mình để giải mã thơng điệp.
Để cho phép Bob gửi các tin nhắn được mã hóa của mình, Alice truyền khóa cơng khai
của cơ ấy ( n , e ) cho Bob thông qua một tuyến đường đáng tin cậy, nhưng khơng nhất
thiết phải bí mật. Khóa riêng của Alice ( d ) không bao giờ được phân phối.
Sau khi Bob lấy được khóa cơng khai của Alice, anh ta có thể gửi một tin nhắn M cho
Alice.
Để làm điều đó, trước tiên anh ta biến M (bản rõ khơng đệm) thành một số ngun m
(bản rõ có đệm) sao cho 0 ≤ m < n bằng cách sử dụng một giao thức có thể đảo ngược
được thỏa thuận. Sau đó, anh ta tính tốn bản mã c , sử dụng khóa cơng khai e của
Alice :
𝑚𝑒 ≡ 𝑐 𝑚𝑜𝑑(𝑛)
5


Giải thuật RSA

Alice có thể khơi phục m từ c bằng cách sử dụng số mũ d khóa riêng của cơ ấy bằng
tính tốn:
𝑐 𝑑 ≡ (𝑚𝑒 )𝑑 ≡ 𝑚 𝑚𝑜𝑑(𝑛)
Với m , cơ ấy có thể khơi phục thơng điệp ban đầu M bằng cách đảo ngược sơ đồ đệm.

Sơ đồ mơ tả mã hóa theo PKCS#1 v1.

❖ Ví dụ 1 (Lấy ví dụ theo PKCS#1 v2.1) :
Chọn hai số nguyên tố khác nhau, chẳng hạn như p = 61, q = 53.
n = p.q = 61.53 = 3233
λ(3233) = lcm((p-1), (q-1)) = lcm(60,52) = 780

Chọn một số e bất kỳ, 1< e < 780 và là số nguyên tố cùng nhau của λ(n).
Chọn e = 17
Tính được d= 413
6


Giải thuật RSA

(Hay là 1=17.413 mod(780))
Khóa cơng khai là ( n = 3233 , e = 17 ). Đối với bản rõ có đệm m , phần mã hóa là:
c(m) = 𝑚𝑒 𝑚𝑜𝑑 (𝑛) = 𝑚17 𝑚𝑜𝑑 (3233)
Khóa riêng là ( n = 3233 , d = 413 ). Đối với bản mã được mã hóa c , phần giải mã là:
m(c) = 𝑐 𝑑 𝑚𝑜𝑑 (𝑛) = 𝑐 413 𝑚𝑜𝑑 (3233)

Lấy m = 65 thì c= 6517 𝑚𝑜𝑑 (3233) = 2790 và ta giải được m =
2790413 𝑚𝑜𝑑 (3233) = 65.

2.2 Các khía cạnh tính tốn

2.2.1 Mã hóa và giải mã
Trước khi thực hiện mã hóa, ta phải thực hiện việc chuyển đổi văn bản rõ (chuyển đổi
từ M sang m) sao cho khơng có giá trị nào của M tạo ra văn bản mã khơng an tồn.
Nếu khơng có q trình này, RSA sẽ gặp phải một số vấn đề sau:
1.

Nếu m = 0 hoặc m = 1 sẽ tạo ra các bản mã có giá trị là 0 và 1 tương ứng

2.

Khi mã hóa với số mũ nhỏ (chẳng hạn e = 3) và m cũng có giá trị nhỏ, giá trị

𝑚𝑒 cũng nhận giá trị nhỏ (so với n). Như vậy phép mơđun khơng có tác
dụng và có thể dễ dàng tìm được m bằng cách khai căn bậc e của c .

3.

RSA là phương pháp mã hóa xác định (khơng có thành phần ngẫu nhiên)
nên kẻ tấn cơng có thể thực hiện tấn cơng lựa chọn bản rõ bằng cách tạo ra
một bảng tra giữa bản rõ và bản mã. Khi gặp một bản mã, kẻ tấn cơng sử
dụng bảng tra để tìm ra bản rõ tương ứng.

Để tránh gặp phải những vấn đề trên, RSA trên thực tế thường bao gồm một hình thức
chuyển đổi ngẫu nhiên hóa m trước khi mã hóa. Quá trình chuyển đổi này phải đảm
bảo rằng m khơng rơi vào các giá trị khơng an tồn. Sau khi chuyển đổi, mỗi bản rõ
khi mã hóa sẽ cho ra một trong số khả năng trong tập hợp bản mã. Điều này làm giảm
tính khả thi của phương pháp tấn cơng lựa chọn bản rõ.
7


Giải thuật RSA

Một số tiêu chuẩn, chẳng hạn như PKCS, đã được thiết kế để chuyển đổi bản rõ trước
khi mã hóa bằng RSA. Các phương pháp chuyển đổi này bổ sung thêm bít vào M. Các
phương pháp chuyển đổi cần được thiết kế cẩn thận để tránh những dạng tấn công
phức tạp tận dụng khả năng biết trước được cấu trúc của bản rõ. Phiên bản ban đầu của
PKCS dùng một phương pháp đặc ứng (ad-hoc) mà về sau được biết là khơng an tồn
trước tấn cơng lựa chọn bản rõ thích ứng (adaptive chosen ciphertext attack). Các
phương pháp chuyển đổi hiện đại sử dụng các kỹ thuật như chuyển đổi mã hóa bất đối
xứng tối ưu (Optimal Asymmetric Encryption Padding - OAEP) để chống lại tấn công
dạng này. Tiêu chuẩn PKCS cịn được bổ sung các tính năng khác để đảm bảo an toàn
cho chữ ký RSA (Probabilistic Signature Scheme for RSA - RSA-PSS).


Trong các tình huống thực tế, các số nguyên tố được chọn sẽ lớn hơn nhiều.
Việc triển khai thực tế sử dụng định lý phần dư Trung Quốc (CRT) để tăng tốc độ tính
tốn bằng cách sử dụng môđun của các thừa số (mod pq sử dụng mod p và mod q ).
Các giá trị d p , d p và q inv , là một phần của khóa cá nhân được tính như sau:
𝑑𝑝 = 𝑑 𝑚𝑜𝑑 (𝑝 − 1)
𝑑𝑞 = 𝑑 𝑚𝑜𝑑 (𝑞 − 1)
𝑞𝑖𝑛𝑣 = 𝑞−1 𝑚𝑜𝑑 (𝑝)
=> (𝑞𝑖𝑛𝑣 . 𝑞) 𝑚𝑜𝑑 (𝑝) = 1
𝑚1 = 𝑐 𝑑𝑝 𝑚𝑜𝑑 (𝑝)
𝑚2 = 𝑐 𝑑𝑞 𝑚𝑜𝑑 (𝑞)
h= (𝑞𝑖𝑛𝑣 . (𝑚1 - 𝑚2 ) mod (p)
=> m = 𝑚2 + h.q

❖ Áp dụng cho ví dụ 1:
𝑑𝑝 = 𝑑 𝑚𝑜𝑑 (𝑝 − 1) = 413 𝑚𝑜𝑑 (61 − 1) = 53
𝑑𝑞 = 𝑑 𝑚𝑜𝑑 (𝑞 − 1) = 413 𝑚𝑜𝑑 (53 − 1) = 49
8


Giải thuật RSA

𝑞𝑖𝑛𝑣 = 𝑞 −1 𝑚𝑜𝑑 (𝑝) = 53−1 𝑚𝑜𝑑 61 = 38
=> (𝑞𝑖𝑛𝑣 . 𝑞) 𝑚𝑜𝑑 (𝑝) = (38.53)𝑚𝑜𝑑 61 = 1
𝑚1 = 𝑐 𝑑𝑝 𝑚𝑜𝑑 (𝑝) = 279053 𝑚𝑜𝑑 61 = 4
𝑚2 = 𝑐 𝑑𝑞 𝑚𝑜𝑑 (𝑞) = 279049 𝑚𝑜𝑑 53 = 12
h= (𝑞𝑖𝑛𝑣 . (𝑚1 - 𝑚2 ) mod (p) = (38.(12 - 4)) mod 61 = 1
=> m = 𝑚2 + h.q = 12 + 1.53 = 65
2.2.2 Tạo khóa
Việc tìm ra 2 số ngun tố đủ lớn p và q thường được thực hiện bằng cách thử xác suất

các số ngẫu nhiên có độ lớn phù hợp (dùng phép kiểm tra nguyên tố cho phép loại bỏ
hầu hết các hợp số).
p và q còn cần được chọn khơng q gần nhau để phịng trường hợp phân tích n bằng
phương pháp phân tích Fermat. Ngồi ra, nếu p-1 hoặc q-1 có thừa số nguyên tố nhỏ
thì n cũng có thể dễ dàng bị phân tích và vì thế p và q cũng cần được thử để tránh khả
năng này.
Bên cạnh đó, cần tránh sử dụng các phương pháp tìm số ngẫu nhiên mà kẻ tấn cơng có
thể lợi dụng để biết thêm thơng tin về việc lựa chọn (cần dùng các bộ tạo số ngẫu
nhiên tốt). Yêu cầu ở đây là các số được lựa chọn cần đồng thời ngẫu nhiên và khơng
dự đốn được. Đây là các yêu cầu khác nhau: một số có thể được lựa chọn ngẫu nhiên
(khơng có kiểu mẫu trong kết quả) nhưng nếu có thể dự đốn được dù chỉ một phần thì
an ninh của thuật tốn cũng khơng được đảm bảo.
Một ví dụ là bảng các số ngẫu nhiên do tập đoàn Rand xuất bản vào những năm 1950
có thể rất thực sự ngẫu nhiên nhưng kẻ tấn cơng cũng có bảng này. Nếu kẻ tấn cơng
đốn được một nửa chữ số của p hay q thì chúng có thể dễ dàng tìm ra nửa cịn lại
(theo nghiên cứu của Donald Coppersmith vào năm 1997)
Một điểm nữa cần nhấn mạnh là khóa bí mật d phải đủ lớn. Năm 1990, Wiener chỉ ra
rằng nếu giá trị của p nằm trong khoảng q và 2q (khá phổ biến) và d < n1/4/3 thì có thể
tìm ra được d từ n và e.
Mặc dù e đã từng có giá trị là 3 nhưng hiện nay các số mũ nhỏ không cịn được sử
dụng do có thể tạo nên những lỗ hổng. Giá trị thường dùng hiện nay là 65537 vì giá trị
9


Giải thuật RSA

này có thể được coi là sự thỏa hiệp giữa việc tránh các cuộc tấn công lũy thừa nhỏ tiềm
ẩn và vẫn cho phép mã hóa hiệu quả (hoặc xác minh chữ ký). Các bản NIST đặc biệt
về bảo mật máy tính (SP 800-78 Rev 1 tháng 8 năm 2007) không cho phép số mũ nào
e nhỏ hơn 65.537.

● Tầm quan trọng của việc tạo số ngẫu nhiên mạnh.
Phải sử dụng một trình tạo số ngẫu nhiên mạnh về mặt mật mã để tạo ra các số nguyên
tố p và q . Một phân tích so sánh hàng triệu khóa cơng khai được thu thập từ Internet
được thực hiện vào đầu năm 2012 bởi Arjen K. Lenstra , James P. Hughes, Maxime
Augier, Joppe W. Bos, Thorsten Kleinjung và Christophe Wachter. Họ có thể tính đến
0,2% số khóa chỉ bằng thuật toán Euclid. Họ đã khai thác một điểm yếu duy nhất đối
với các hệ thống mật mã dựa trên việc phân tích nhân tử số nguyên. Nếu n = pq là một
khóa cơng khai và n ′ = p ′ q ′ là khóa khác, thì nếu tình cờ p = p ′ (nhưng q không
bằng q ′), thì một phép tính đơn giản của p = gcd (n, n ′) là thừa số cả n và n′. Hồn
tồn thỏa hiệp cả hai chìa khóa. Họ lưu ý rằng vấn đề này có thể được giảm thiểu bằng
cách sử dụng một hạt ngẫu nhiên mạnh có độ dài bit gấp đôi mức bảo mật dự định
hoặc bằng cách sử dụng một hàm xác định để chọn q cho trước p , thay vì chọn p và q
một cách độc lập.
Tạo số ngẫu nhiên mạnh là giai đoạn quan trọng của mật mã khóa cơng khai. Ví dụ:
nếu một bộ tạo yếu được sử dụng cho các khóa đối xứng đang được RSA phân phối,
thì kẻ nghe trộm có thể bỏ qua RSA và đốn trực tiếp các khóa đối xứng.

3. VẤN ĐỀ BẢO MẬT VỀ RSA
Về khía cạnh an tồn, các thuật tốn mật mã hóa khóa bất đối xứng cũng khơng
khác nhiều với các thuật tốn mã hóa khóa đối xứng. Có những thuật tốn được dùng
rộng rãi, có thuật tốn chủ yếu trên lý thuyết, có thuật tốn vẫn được xem là an tồn,
có thuật tốn đã bị phá vỡ... Cũng cần lưu ý là những thuật tốn được dùng rộng rãi
khơng phải lúc nào cũng đảm bảo an tồn. Một số thuật tốn có những chứng minh về
10


Giải thuật RSA

độ an toàn với những tiêu chuẩn khác nhau. Nhiều chứng minh gắn việc phá vỡ thuật
toán với những bài tốn nổi tiếng vẫn được cho là khơng có lời giải trong đa thức thời

gian. Nhìn chung, chưa có thuật tốn nào được chứng minh là an tồn tuyệt đối. Vì
vậy, cũng giống như tất cả các thuật tốn mật mã nói chung, các thuật tốn mã hóa
khóa công khai cần phải được sử dụng một cách thận trọng.

3.1 Tấn cơng cưỡng bức
Đó là việc cố gắng tìm ra khóa riêng. Việc chống lại tấn cơng cưỡng bức thì đối
với thuật tốn RSA hay các hệ thống mật mã khác đều bằng cách sử dụng khơng
gian khóa đủ lớn. Tức là số lượng bit trong d càng lớn càng tốt. Tuy nhiên việc
tính tốn trong cả việc tạo khóa và việc mật mã hóa/giải mã đều phức tạp nên kích
thước khóa càng lớn thì hệ thống hoạt động càng chậm.
❖ Ví dụ:

ROCA: Tấn cơng khơi phục khóa riêng tư RSA

Tấn cơng khơi phục khóa được các nhà nghiên cứu đặt tên ROCA (Return of
Coppersmith’s Attack), (Sự trở lại của tấn cơng Coppersmith), hình thức tấn cơng
này có thể cho phép kẻ tấn cơng từ xa tính tốn ngược một khố mã hóa riêng
bằng khóa cơng khai của đối tượng. Điều này có thể cho phép kẻ tấn cơng giả mạo
chủ sở hữu, giải mã dữ liệu nhạy cảm của nạn nhân, chèn mã độc hại vào phần
mềm được ký số và vượt qua các cơ chế bảo vệ ngăn chặn việc truy cập hoặc giả
mạo máy tính mục tiêu. Tấn công ROCA ảnh hưởng tới hàng tỷ thiết bị, ảnh
hưởng đến các chip do Infineon sản xuất vào đầu năm 2012 bao gồm 1024 và
2048 bit, được sử dụng phổ biến nhất trên các thẻ căn cước quốc gia, trên bo mạch
chủ PC để lưu trữ các mật khẩu, trong các token xác thực, trong duyệt web an
toàn, trong quá trình ký kết ứng dụng và phần mềm, cùng với chức năng bảo vệ tin
nhắn như PGP. Lỗ hổng này cũng làm suy yếu khả năng bảo mật của chính phủ và
các máy tính của những cơng ty được bảo vệ bằng thư viện mã hóa và chip của
Infineon. Phần lớn các thiết bị Windows và Google Chromebook được phát triển
bởi HP, Lenovo và Fujitsu nằm trong danh sách bị ảnh hưởng bởi cuộc tấn công
ROCA. Số lượng khóa mã hóa được xác định bị ảnh hưởng khoảng 760,000 nhưng

có khả năng cao hơn nhiều lần.
11


Giải thuật RSA

3.2 Tấn cơng tốn học
Mục đích tìm ra tích của 2 số nguyên tố tạo ra n
Đây là cách tiếp cận tấn cơng tốn học vào RSA
1. Tìm thừa số n từ 2 thừa số nguyên tố của nó. Điều này cho phép tính tốn được
φ(n) = (p -1).(q - 1) và từ đó xác định được d ≡ e-1 mod (φ(n))
2. Xác định một cách trực tiếp φ(n) mà không cần xác định p và q. Một lần nữa
nó cũng cho phép tính được d ≡ e-1 mod (φ(n))
3. Tìm ra d một cách trực tiếp mà không cần xác định φ(n)
Tất cả các thảo luận về giải mật mã RSA đều tập trung vào nhiệm vụ tìm ra n từ 2 thừa
số nguyên tố. Với thuật toán đã biết việc xác định với e và n đã cho ít nhất cũng tiêu
tốn thời gian như bài tốn phân tích thừa số. Vì vậy chúng ta có thể dùng cách này như
một điểm chốt trong tính bảo mật của RSA.
Bảng dưới đây chỉ ra kết quả về mặt thời gian. Bộ xử lý hàng triệu phép tính/giây chạy
trong 1 năm tức là khoảng 3x1013 phép tính được thực hiện. Cho đến giữa những năm
1990 việc tấn công tìm thừa số được thực hiện với tiếp cận sàng lọc bậc hai. Việc tấn
công vào RSA-130 sử dụng một thuật tốn mới GNFS cho phép tìm được thừa số của
số lớn hơn RSA-129 mà chỉ mất 20% nỗ lực tính tốn.

12


Giải thuật RSA

Việc đe dọa vào kích thước khóa lớn đã tăng lên gấp đơi bởi năng lực tính tốn của

máy tính đang ngày càng tăng và các thuật tốn tìm thừa số tiếp tục được hồn chỉnh.
Như vậy chúng ta cần cẩn thận trong việc lựa chọn kích thước khóa cho RSA.
Một số giải pháp một số nhà nghiên cứu đưa ra để xác định n như sau:
1. p và q nên khác nhau về độ dài trong vài con số. Như vậy đối với khóa 1024- bit
(309 số thập phân) cả p và q có thể ở độ lớn tầm 1075 đến 10100
2. Cả (p-1) và (q-1) đều là số nguyên tố lớn.
3. Gcd(p-1, q-1) có thể nhỏ.

3.3 Tấn công thời gian
Vào năm 1995, Paul Kocher mô tả một dạng tấn công mới lên RSA: nếu kẻ tấn công
nắm đủ thông tin về phần cứng thực hiện mã hóa và xác định được thời gian giải mã
đối với một số bản mã lựa chọn thì có thể nhanh chóng tìm ra khóa d.
Dạng tấn cơng này có thể áp dụng đối với hệ thống chữ ký điện tử sử dụng RSA. Năm
2003, Dan Boneh và David Brumley chứng minh một dạng tấn cơng thực tế hơn: phân
tích thừa số RSA dùng mạng máy tính (Máy chủ web dùng SSL). Tấn cơng đã khai
thác thơng tin rị rỉ của việc tối ưu hóa định lý số dư Trung quốc mà nhiều ứng dụng đã
thực hiện.
Để chống lại tấn công dựa trên thời gian là đảm bảo quá trình giải mã luôn diễn ra
trong thời gian không đổi bất kể văn bản mã. Tuy nhiên, cách này có thể làm giảm
hiệu suất tính tốn.
Thay vào đó, hầu hết các ứng dụng RSA sử dụng một kỹ thuật gọi là che mắt. Kỹ thuật
này dựa trên tính nhân của RSA: thay vì tính cd mod n, đầu tiên ta chọn một số ngẫu
nhiên r và tính (rec)d mod n. Kết quả của phép tính này là rm mod n và tác động của r
sẽ được loại bỏ bằng cách nhân kết quả với nghịch đảo của r. Đối với mỗi văn bản mã,
người ta chọn một giá trị của r. Với tính năng làm mờ được áp dụng, thời gian giải mã
khơng cịn tương quan với giá trị của bản mã đầu vào, và do đó, cuộc tấn cơng định
thời khơng thành công.

13



Giải thuật RSA

3.4 Tấn công dựa trên lỗi phần cứng
Các thiết bị phần cứng thực hiện chức năng mã hóa để bảo mật thơng tin chính là
phần quan trọng nhất trong toàn bộ hệ thống và cần được quan tâm nhiều nhất.
Sự phát triển nhanh chóng của cơng nghệ phần cứng tính tốn đã tạo ra các thiết bị
ngày càng nhỏ hơn, nhanh hơn, rẻ hơn và phổ biến hơn. Với các thành tựu đó, thiết
bị phần cứng mật mã ngày nay đã được sử dụng rộng rãi trong mọi lĩnh vực, từ
việc ứng dụng cho thiết bị Tivi đến điện thoại di động hay thẻ thanh toán, thẻ kiểm
soát ra vào (smartcard). Các thiết bị này thường lưu trữ khóa bí mật hoặc các dữ
liệu nhạy cảm. Do vậy, các tổn hại lên các thiết bị phần cứng bảo vệ hay lên các
dữ liệu riêng tư này có thể kéo theo những tổn thất như mất thông tin cá nhân, bị
truy cập trái phép, hoặc bị lấy trộm tiền qua tài khoản ngân hàng,…
Do các thiết bị mật mã có thể dễ dàng tiếp cận nên kẻ tấn cơng có thể biết được
cấu trúc bên trong của thiết bị phần cứng và tìm ra các chi tiết đặc biệt trong quá
trình thực thi. Từ những hiểu biết về hoạt động của thiết bị, kẻ tấn cơng có thể lấy
được các thông tin cần thiết mà không cần tấn công vào các thuật tốn mã hóa.
Nói một cách khác, ngay cả khi tất cả các thuật toán cũng như giao thức mật mã
được thực hiện một cách an toàn nhất thì kẻ tấn cơng vẫn có thể lấy được các
thơng tin bí mật trong q trình làm việc của phần cứng mã hóa. Thậm chí, khi
khơng thể lấy được các thơng tin bí mật thì kẻ tấn cơng vẫn có thể phá hỏng phần
cứng, tấn công từ chối dịch vụ hay tạo ra các lỗi khác trên hệ thống an tồn.
Có nhiều kiểu tấn cơng phần cứng khác nhau, nhưng chúng được chia thành 3 kiểu
cơ bản bao gồm: tấn công kênh kề (side channel attacks), tấn công điểm yếu (fault
attacks) và can thiệp vật lý (physical tempering). Phổ biến nhất tấn cơng kênh kề
nên chúng ta sẽ chỉ nói về kiểu tấn công này. Kênh kề là khu vực thơng tin được
tạo ra do q trình hoạt động của thiết bị phần cứng mật mã. Ví dụ như tiếng ồn
(sound), bức xạ tia hồng ngoại (infrared radiation), độ trễ thời gian (time delays),
nguồn tiêu thụ (power consumption) và bức xạ điện từ (electromagnetic radiation).

Thơng tin rị rỉ này có thể được phân tích thống kê để tìm ra các mối liên quan đến
những phép tính cơ bản được cài đặt trong thiết bị mật mã hoặc là khóa mật mã,
đó là đầu mối thơng tin quan trọng cho kẻ tấn công.
Các công nghệ tấn công can thiệp trực tiếp vào phần cứng cần có sự che đậy hay
xóa dấu vết sau đó, cịn tấn cơng kênh kề có thể lấy ra các thơng tin quan trọng
14
Nhóm 02


Giải thuật RSA

trong khi hệ thống vẫn hoạt động bình thường mà không hề làm thay đổi phần
cứng. Nhiều tham số có thể được ứng dụng trong tấn cơng kênh kề, nhưng phổ
biến là 3 tham số chính: thời gian, nguồn điện tiêu thụ và tín hiệu bức xạ.
Một tiếp cận tấn cơng RSA khơng chính thống nữa là tấn công vào bộ xử lý tạo ra
chữ ký số RSA .Việc tấn công này không tạo ra lỗi trong việc tính tốn chữ ký số
bằng việc giảm năng lực của bộ vi xử lý. Thuật tốn tấn cơng gây ra lỗi các bit đơn
và thu kết quả. Kiểu tấn công này có vẻ khơng gây nguy hiểm nghiêm trọng cho
RSA . Nó u cầu kẻ tấn cơng phải truy cập vật lý tới thiết bị và kẻ tấn cơng phải
có khả năng điều khiển trực tiếp công suất đầu vào của vi xử lý.

3.5 Tấn công bản mã lựa chọn thích ứng và đệm mật mã
Thuật tốn RSA cơ sở có thể bị tấn cơng gọi là tấn cơng bảng mã lựa chọn (CCA)
CCA : kẻ tấn công chọn ra một số bản mã rồi tìm ra bản rõ tương ứng ,giải mã với
khóa riêng
Kẻ quan sát có thể lựa chọn một bản rõ, mật mã hóa với khóa cơng khai của đích
và nó có khả năng biết được bản rõ bằng việc giải mã với mã hóa riêng.Vì nó được
bảo mật nên không đem lại thông tin mới cho kẻ theo dõi.
Kẻ theo dõi khám phá ra đặc tính của RSA và lựa chọn khối dữ liệu và trong tiến
trình xử lý với mã riêng của đích sẽ thu thập thơng tin cần thiết cho việc phân tích

mã.
CCA tấn cơng RSA dựa trên đặc tính của RSA
E(PU,M1) x E(PU,M2) = E(PU,[M1 x M2])
Ta giải mã C=Me mod n
1.Tính tốn X = (C x 2e)mod n
2. Đề xuất như một bản mã và nhận về Y = Xd mod n
X = (C mod n) x (2e mod n)
= (Me mod n) x (2e mod n)
=(2M)e mod n
=> Y= (2M) mod n. Từ đây ta có thể suy ra M

15
Nhóm 02


Giải thuật RSA

Có 1 cách giải quyết việc tấn cơng đó là đệm thêm bản rõ trước khi mật mã hóa.
Tuy nhiên các CCA tinh vi vẫn có thể thực hiện được và chèn thêm một giá trị
ngẫu nhiên đơn giản khơng đủ cung cấp tính an tồn như mong muốn. Để chống
lại tấn công này ta thay đổi bản rõ sử dụng thủ tục đệm mật mã bất đối xứng tối ưu
(OAEP).
Năm 1998, Daniel Bleichenbacher đã mô tả cuộc tấn cơng bản mã được chọn thích
ứng thực tế đầu tiên , chống lại các thơng điệp được mã hóa RSA bằng cách sử
dụng sơ đồ đệm PKCS #1 v1 (một sơ đồ đệm ngẫu nhiên hóa và thêm cấu trúc vào
một thơng điệp được mã hóa RSA, vì vậy có thể xác định liệu một tin nhắn được
giải mã là hợp lệ). Do các sai sót với lược đồ PKCS #1, Bleichenbacher đã có thể
thực hiện một cuộc tấn công thực tế chống lại việc triển khai RSA của giao thức
lớp cổng bảo mật (SSL) và để khôi phục các khóa phiên. Vì điều này nên các nhà
mật mã học giờ đây khuyên bạn nên sử dụng các sơ đồ đệm an tồn có thể chứng

minh được.

4. ỨNG DỤNG

4.1 Bảo mật dữ liệu
Chắc hẳn các bạn đã từng truy cập tài khoản cá nhân vào hệ thống nào đó ví dụ như
Gmail, Facebook,.. và được hệ thống gửi về mã xác nhận tài khoản. Đây là một trong
những phương pháp sử dụng giải thuật RSA.
Truyền tải an toàn là phương pháp để truyền đi những thông tin cần bảo mật cao như
thông tin ngân hàng. Hiện nay, chúng ta đều sử dụng nó hằng ngày dưới giao thức
HTTPS, kể cả Facebook và trang WordPress này mà các bạn đang theo dõi. Truyền tải
an tồn ngăn chặn kiểu tấn cơng nghe lén bằng cách mã hóa thơng tin được truyền đi.

Thơng thường, thơng tin được mã hóa sử dụng một phương pháp mã hóa khóa đối
xứng (symmetric-key encryption). Mã hóa khóa đối xứng tốn ít tài ngun hơn mã hóa
RSA, do đó thích hợp để mã hóa lương thơng tin lớn. Tuy nhiên, vấn đề với mã hóa
khóa đối xứng là việc mã hóa và giải mã sử dụng chung một khóa (gọi là khóa phiên),
16
Nhóm 02


Giải thuật RSA

và do đó, khóa này cần phải được truyền đi một cách bảo mật. Nếu khóa đó bị lộ, việc
mã hóa là vơ nghĩa. Trong q khứ, khóa này có thể được truyền đi trực tiếp (bưu
điện) hay qua điện thoại. Hiện nay, khóa này được truyền đi sử dụng mã hóa RSA.
Như vậy ta có thể thấy giải thuật này ngồi để mã hóa dữ liệu trực tiếp nó cịn dùng để
phục vụ cho các giải thuật mã hóa khác.

Để thiết lập một đường truyền tải an tồn, ví dụ giữa Alice và Bob, các bước sau đâu

được thực hiện:

1.

Alice tạo ra một bộ khóa cơng khai và khóa bí mật theo RSA.

2.

Alice gửi khóa cơng khai cho Bob.

3.

Bob tạo ra một khóa phiên a ngẫu nhiên.

4.

Bob mã hóa a sẽ dụng khóa cơng khai để cho ra bản mã b và gửi cho Alice.

5.

Alice nhận bản mã b, dùng khóa bí mật để giải mã ra a.

6.

Alice và Bob cùng sử dụng a làm khóa phiên cho một thuật tốn mã hóa khóa
đối xứng khác.

Nếu kẻ tấn công nghe lén được cuộc hội thoại, tất cả thứ hắn nghe được chỉ là: Khóa
cơng khai từ Alice, mật văn b, tất cả thơng tin sau đó bị mã hóa bởi a (mà chỉ có Alice
và Bob biết).


Kẻ tấn công không thể tái tạo a từ mật văn b và khóa cơng khai, do đó hắn khơng thể
giải mã những gói tin sau đó. Đường truyền giữa Alice và Bob đã được bảo mật.

Tuy nhiên, kẻ tấn công (ví dụ tên là Charlie) vẫn có thể đánh chặn được những gói tin
của Alice và Bob (man-in-the-middle attack). Charlie có thể giả mạo là Bob trước mặt
Alice, và giả làm Alice trước mặt Bob (OK, hắn lưỡng tính). Alice và Bob không
truyền trực tiếp với nhau, nhưng thông qua Charlie. Giữa Alice và Charlie, và giữa
Charlie và Bob vẫn là những “đường truyền an toàn”, nhưng truyền tải an tồn chỉ bảo
vệ thơng tin khỏi những kẻ nghe lén bên ngồi, chứ khơng bảo vệ khỏi những kẻ mạo
danh như Charlie. Để xác thực được phần tiếp theo sẽ cung cấp điều đó.
17
Nhóm 02


Giải thuật RSA

4.2 Chữ kỹ số (Digital Signature)
Giả sử Alice sử dụng khóa cơng khai của Bob để gửi cho anh ấy một tin nhắn được mã
hóa. Trong tin nhắn, cơ ấy có thể tự xưng là Alice, nhưng Bob khơng có cách nào để
xác minh rằng tin nhắn đó là của Alice vì bất kỳ ai cũng có thể sử dụng khóa cơng khai
của Bob để gửi cho anh ấy các tin nhắn được mã hóa. Để xác minh nguồn gốc của một
tin nhắn, RSA cũng có thể được sử dụng để làm chữ ký số.
Giả sử Alice muốn gửi một tin nhắn đã ký cho Bob. Cô ấy sử dụng khóa riêng của
mình vào chữ kỹ số (vì khóa riêng này chỉ Alice có mà khơng ai khác có). Cơ ấy tạo ra
một giá trị băm của tin nhắn, nâng nó lên thành lũy thừa d (modulo n), và gắn nó như
một "chữ ký" vào tin nhắn. Khi Bob nhận được tin nhắn đã ký, anh ta sử dụng cùng
một thuật tốn băm kết hợp với khóa cơng khai của Alice. Anh ta nâng chữ ký lên
thành lũy thừa e (modulo n), và so sánh giá trị băm kết quả với giá trị băm của tin
nhắn. Nếu hai giá trị này bằng nhau, anh ấy biết rằng đó có phải là Alice hay là kẻ giả

mạo. Thuật tốn mô tả như sau :
Alice :
h = hash(m)
H = ℎ𝑑 𝑚𝑜𝑑 𝑛
Bob:
H’ = ℎ𝑑.𝑒 𝑚𝑜𝑑 𝑛
Xác thực khi: H = H’

18
Nhóm 02


Giải thuật RSA

Do đó, các khóa có thể được hốn đổi mà khơng làm mất tính tổng qt, đó là khóa
riêng của một cặp khóa có thể được sử dụng để:
1.

Giải mã một tin nhắn chỉ dành cho người nhận, tin nhắn này có thể được
mã hóa bởi bất kỳ ai có khóa cơng khai.

2.

Mã hóa một tin nhắn có thể được giải mã bởi bất kỳ ai, nhưng chỉ có thể
được mã hóa bởi một người, điều này cung cấp một chữ ký điện tử.

19
Nhóm 02



Giải thuật RSA

5. KẾT LUẬN
Như đã phân tích trong nội dung này chúng ta đã thấy được những ưu nhược điểm của
thuật tốn này. Mặc dù nó là giải thuật được đưa ra từ vài chục năm rồi nhưng nó vẫn
được dùng rất phổ biến hiện nay trên internet vì nó vẫn cung cấp được tính bảo mật,
xác thực cần thiết hoặc ứng dụng trong chữ ký số,.. kể cả tốc độ thực hiện của hệ RSA
là một trong những điểm yếu so với các hệ mật mã khóa đối xứng. Theo ước tính, thực
hiện mã hóa và giải mã bằng hệ mật mã RSA chậm hơn 100 lần so với hệ mã khóa đối
xứng DES (Khi thực hiện bằng phần mềm). Và chậm hơn 1000 lần so với DES (Khi
thực hiện bằng phần cứng). Ngồi ra thuật tốn RSA phần lớn tốn chi phí thực hiện các
phép tính cơ bản như : Tạo khóa, mã hóa, giải mã. Quá trình mã hóa, giải mã tương
được với chi phí thực hiện các phép tính lũy thừa module n.
II. MƠ PHỎNG GIẢI THUẬT RSA BẰNG LẬP TRÌNH PYTHON

1. Đầu tiên ta xây dựng các hàm dưới đây
MyMath : hàm toán học
MyBase: hàm chuyển đổi cơ số
Primetest: hàm kiểm tra tính nguyên tố
CreateKey : tạo khóa cơng khai và khóa riêng
encode : hàm mã hóa
decode : giải mã
GenePrime : Hàm sinh số nguyên tố xác xuất
Tạo thư mục tên “ Data “ trong cùng thư mục với các file .py trên ( tức là trong
cùng một project). Trong thư mục “Data” tạo một file text tên:”
NoiDungMaHoa” để nhập dữ liệu muốn mã hóa.
❖ Dưới đây là code của các hàm trên:

MyMath : hàm tốn học
20

Nhóm 02


Giải thuật RSA

#powMod(a, b, m): Trả về kết quả phép tính a^b mod m
def powMod(a, b, m):
x = []
while b != 0:
x.append(b & 1)
b = b >> 1
sz = len(x)
po = [a%m]
for i in range(1,sz):
p = (po[i-1]*po[i-1])%m
po.append(p)
r = 1
for i in range(sz):
if(x[i] != 0):
r*= po[i]
r%= m
return r
#GCD(a, b):Trả về UCLN(a, b)
def GCD(a, b):
if b == 0:
return a
return GCD(b, a%b)
#GCD_extended(a, b): Trả về 3 số x,y,z thỏa mãn xa + yb = z = UCLN(a, b)
# a*x + b*y = z
def GCD_extended(a, b):

u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, b
while v3 != 0:
q = u3//v3
t1, t2, t3 = u1 - q*v1, u2 - q*v2, u3 - q*v3
u1, u2, u3 = v1, v2, v3
v1, v2, v3 = t1, t2, t3
return u1, u2, u3

MyBase: hàm chuyển đổi cơ số
dig ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+"
def getId(ch):
if ch == '-':
return 62
if ch == '+':
return 63
if ch <= '9':
return int(ch)
if ch <= 'Z':
return ord(ch) - ord('A') + 10
return ord(ch) - ord('a') + 36
#toBase(a, base): Đổi từ số a cơ 10 sang cơ base
def toBase(a, base):
r = ""
while a != 0:
r+=dig[a % base]
a //= base
r = r[::-1]
return r;


21
Nhóm 02


Giải thuật RSA
#toInt(r, base): Đổi từ số r cơ base sang cơ 10
def toInt(r, base):
a = 0;
for i in r:
a*= base
a+= getId(i)
return a

Primetest: hàm kiểm tra tính nguyên tố
import math
import MyMath
sprime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103,\
107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223,\
227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
293, 307, 311, 313, 317, 331, 337, 347,\
349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421,
431, 433, 439, 443, 449, 457, 461, 463,\
467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563,
569, 571, 577, 587, 593, 599, 601, 607, \
613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
691, 701, 709, 719, 727, 733, 739, 743, \
751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829,
839, 853, 857, 859, 863, 877, 881, 883, \

887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
991, 997, 1009, 1013, 1019, 1021, 1031, \
1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
1103, 1109, 1117, 1123, 1129, 1151, 1153,\
1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231,
1237, 1249, 1259, 1277, 1279, 1283, 1289,\
1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373,
1381, 1399, 1409, 1423, 1427, 1429, 1433,\
1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
1499, 1511, 1523, 1531, 1543, 1549, 1553, \
1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619,
1621, 1627, 1637, 1657, 1663, 1667, 1669, \
1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759,
1777, 1783, 1787, 1789, 1801, 1811, 1823, \
1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907,
1913, 1931, 1933, 1949, 1951, 1973, 1979, \
1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
2063, 2069, 2081, 2083, 2087, 2089, 2099, \
2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203,
2207, 2213, 2221, 2237, 2239, 2243, 2251, \
2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339,
2341, 2347, 2351, 2357, 2371, 2377, 2381,\
2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459,
2467, 2473, 2477, 2503, 2521, 2531, 2539, \
2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633,
2647, 2657, 2659, 2663, 2671, 2677, 2683, \
2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
2749, 2753, 2767, 2777, 2789, 2791, 2797,\
2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887,
2897, 2903, 2909, 2917, 2927, 2939, 2953,\

2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041,
3049, 3061, 3067, 3079, 3083, 3089, 3109,\
3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
3217, 3221, 3229, 3251, 3253, 3257, 3259, \

22
Nhóm 02


Giải thuật RSA
3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347,
3359, 3361, 3371, 3373, 3389, 3391, 3407, \
3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
3517, 3527, 3529, 3533, 3539, 3541, 3547,\
3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631,
3637, 3643, 3659, 3671, 3673, 3677, 3691,\
3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779,
3793, 3797, 3803, 3821, 3823, 3833, 3847, \
3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923,
3929, 3931, 3943, 3947, 3967, 3989, 4001, \
4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079,
4091, 4093, 4099, 4111, 4127, 4129, 4133,\
4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231,
4241, 4243, 4253, 4259, 4261, 4271, 4273, \
4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391,
4397, 4409, 4421, 4423, 4441, 4447, 4451,\
4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547,
4549, 4561, 4567, 4583, 4591, 4597, 4603,\
4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691,
4703, 4721, 4723, 4729, 4733, 4751, 4759,\

4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871,
4877, 4889, 4903, 4909, 4919, 4931, 4933,\
4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003,
5009, 5011, 5021, 5023, 5039, 5051, 5059,\
5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167,
5171, 5179, 5189, 5197, 5209, 5227, 5231,\
5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333,
5347, 5351, 5381, 5387, 5393, 5399, 5407,\
5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479,
5483, 5501, 5503, 5507, 5519, 5521, 5527, \
5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647,
5651, 5653, 5657, 5659, 5669, 5683, 5689,\
5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
5801, 5807, 5813, 5821, 5827, 5839, 5843, \
5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923,
5927, 5939, 5953, 5981, 5987, 6007, 6011,\
6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101,
6113, 6121, 6131, 6133, 6143, 6151, 6163, \
6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263,
6269, 6271, 6277, 6287, 6299, 6301, 6311,\
6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379,
6389, 6397, 6421, 6427, 6449, 6451, 6469,\
6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571,
6577, 6581, 6599, 6607, 6619, 6637, 6653,\
6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733,
6737, 6761, 6763, 6779, 6781, 6791, 6793,\
6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883,
6899, 6907, 6911, 6917, 6947, 6949, 6959,\
6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027,
7039, 7043, 7057, 7069, 7079, 7103, 7109, \

7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213,
7219, 7229, 7237, 7243, 7247, 7253, 7283,\
7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411,
7417, 7433, 7451, 7457, 7459, 7477, 7481,\
7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549,
7559, 7561, 7573, 7577, 7583, 7589, 7591,\
7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691,
7699, 7703, 7717, 7723, 7727, 7741, 7753, \
7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873,
7877, 7879, 7883, 7901, 7907, 7919]
#Preprocessor(a): Kiểm tra loại bỏ các số chia hết cho 1000 số nguyên tố
đầu tiên (Tiền xử lý)
def Preprocessor(a):
for i in sprime:

23
Nhóm 02


Giải thuật RSA
if a == i:
return True
if a % i == 0:
return False
return True
# Fermat's little theorem
#Fermat(p,x): Kiểm tra số p sử dụng định lý Fermat nhỏ với x cơ sở
def Fermat(p,x):
for i in range(x): #check x base
a = sprime[i]

if MyMath.powMod(a,p-1,p) != 1:
return False
return True
# Miller–Rabin primality test
# Q(a,p,m,s) = 1 nếu p trải qua Miller-Rabin cơ sở a
def Q(a, p, m, s):
x = MyMath.powMod(a,m,p)
if x == 1:
return True
for i in range(0,s+1):
if x == p - 1:
return True
x *= x
x %= p
return False
#Miller_Rabin(p, x): Kiểm tra Miller- Rabin với x cơ sở
def Miller_Rabin(p, x):
# x : the number of bases
# p - 1 = m*2^s (m is odd)
n = p - 1
s = 0
while n & 1 == 0:
n = n >> 1
s+= 1
m = n
for i in range(x):
a = sprime[i]
if Q(a,p,m,s) == False:
return False
return True


GenePrime :Hàm sinh số nguyên tố xác xuất
import random
import PrimeTest
#Random (b): Hàm trả về số lẻ ngẫu nhiên b bits
def Random (b):
a = random.getrandbits(b)
a = a | (1 << (b-1))
a = a | 1
return a;
#getPrime(b): Hàm trả về số nguyên tố xác suất b bits
def getPrime(b):
p = Random(b)
d1 = d2 = d3 = 0
while True:

24
Nhóm 02


×