Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét,đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trongphần tài liệu tham khảo.Ngoài ra, trong
Trang 1TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN
BÀI BÁO CÁO MÔN CẤU TRÚC RỜI RẠC
Người hướng dẫn: Thầy TRẦN LƯƠNG QUỐC ĐẠI Người thực hiện: ĐỖ ANH KHOA – 52100968
Lớp: 21050401 Khoá: 25 THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023
Trang 2LỜI CẢM ƠN
Em xin cảm ơn thầy Đại rất nhiều vì đã cống hiến hết sức mình cho công cuộc dạy học ở trường đại học Tôn Đức Thắng Nhờ có sự hướng dẫn chi tiết và tận tình của thầy mà em có thể hoàn thành được bài báo cáo giữa kì, em chân thành cảm ơn thầy rất nhiều
Trang 3ĐỒ ÁN ĐƯỢC HOÀN THÀNH
TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi / chúng tôi và được sự hướng dẫn của TS Nguyễn Văn A; Các nội dung nghiên cứu, kết quả trong đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như
số liệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không
liên quan đến những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có)
TP Hồ Chí Minh, ngày 02 tháng 04 năm 2023
Tác giả (ký tên và ghi rõ họ tên)
Đỗ Anh Khoa
Trang 4PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Trang 5TÓM TẮT
Bài báo cáo này đầu tiên khái quát các khái niệm về nghịch đảo modulo, thuật toán Euclid mở rộng và hệ thống RSA cryptosystem Sau đó có code minh họa bằng python cho từng thuật toán
Trang 6CHƯƠNG 1 - FINDING AN INVERSE MODULO 8
1.1 Khái niệm: 8
1.2 Cơ sở lý thuyết giải thuật: 9
1.3 Ví dụ: 9
1.4 Code và kết quả: 10
CHƯƠNG 2 - RSA CRYPTOSYSTEM 11
2.1 Khái niệm: 11
2.2 Mô tả thuật toán: 12
2.3 Ví dụ: 12
2.4 Code và kết quả: 13
TÀI LIỆU THAM KHẢO 14
CHƯƠNG 1 - FINDING AN INVERSE MODULO
1.1 Khái niệm:
- Nghịch đảo modulo cho số b là số nguyên, x , m là các số nguyên dương(x <
m), nếu x*b mod m = 1 thì x là nghịch đảo b mod n, ký hiệu là b^-1 mod m
- Giải thuật Euclid: Trong toán học, giải thuật Euclid (hay thuật toán Euclid) là một giải thuật để tính ước chung lớn nhất (ƯCLN) của hai số
nguyên, là số lớn nhất có thể chia được bởi hai số nguyên đó với số dư bằng không Giải thuật này được đặt tên theo nhà toán học người Hy Lạp cổ
Trang 7đại Euclid, người đã viết nó trong bộ Cơ sở của ông (khoảng năm 300 TCN)
định và là một trong số những thuật toán lâu đời nhất được sử dụng rộng rãi
- Giải thuật Euclid mở rộng được sử dụng để giải một phương trình vô định
đó a,b,c là các hệ số nguyên, x, y là các ẩn nhận giá trị nguyên Điều kiện cần
và đủ để phương trình này có nghiệm (nguyên) là UCLN(a,b) là ước của c Khẳng định này dựa trên một mệnh đề sau:
Nếu d = UCLN(a,b) thì tồn tại các số nguyên x, y sao cho ax + by = d
1.2 Cơ sở lý thuyết giải thuật:
Euclid với việc tìm một cặp số x, y thoả mãn phương trình Đi-ô-phăng Giả sử
Bảng thuật toán Euclid công thức mở rộng
1.3 Ví dụ:
Modulo nghịch đảo 1759 của 550:
Trang 8Dựa vào bảng công thức ở trên đã cung cấp, ta có:
i
Ta có kết quả bài toán là -111 Tuy nhiên điều kiện kết quả của bài toán phải là một số dương (từ định nghĩa) Nên :
(1759^-1) mod 550 = -111 mod 550
= (-111 + 550) mod 550
= 439
Vậy đáp án cuối cùng của bài toán là 439
1.4 Code và kết quả:
Code:
Trang 9Kết quả:
Như vậy ta thấy kết quả chạy đúng theo đáp án ở ví dụ đã nêu trên
CHƯƠNG 2 - RSA CRYPTOSYSTEM
2.1 Khái niệm:
thuật toá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
mại điện tử và được cho là đảm bảo an toàn với điều kiện độ dài khóa đủ lớn
- Số học mô đun là một hệ thống số học dành cho số nguyên Trong số học mô đun, các con số được viết bao quanh lấy nhau thành nhiều vòng tròn cho đến
Trang 10khi chạm đến giá trị đích, gọi là mô đun (tiếng Anh: modulus, số
tên Disquisitiones Arithmeticae, xuất bản năm 1801
- Phân tích thừa số nguyên tố:
+ Số nguyên tố là số tự nhiên chỉ có hai ước số dương phân biệt là 1 và chính
nó Các số có nhiều hơn 2 ước số dương được gọi là hợp số
+ Định lý: "Mọi số tự nhiên lớn hơn 1 đều phân tích được thành tích những thừa số nguyên tố, và sự phân tích này là duy nhất nếu không kể đến thứ tự của các thừa số"
+ Để phân tích một số ra thừa số nguyên tố, ta thử chia lần lượt số đó cho các
số nguyên tố như 2, 3, 5, 7,
2.2 Mô tả thuật toán:
mã hóa và giải mã Khóa công khai được công bố rộng rãi cho mọi người và
có thể được giải mã bằng khóa bí mật tương ứng Nói cách khác, mọi người đều có thể mã hóa nhưng chỉ có người biết khóa cá nhân (bí mật) mới có thể giải mã được
2.3 Ví dụ:
đọc được Để làm được điều này, An gửi cho Bình một chiếc hộp có khóa đã
mở sẵn và giữ lại chìa khóa Bình nhận chiếc hộp, cho vào đó một tờ giấy viết thư bình thường và khóa lại (như loại khoá thông thường chỉ cần sập chốt lại, sau khi sập chốt khóa ngay cả Bình cũng không thể mở lại được-không đọc lại hay sửa thông tin trong thư được nữa) Sau đó Bình gửi chiếc hộp lại cho An
An mở hộp với chìa khóa của mình và đọc thông tin trong thư Trong ví dụ này,
Trang 11chiếc hộp với khóa mở đóng vai trò khóa công khai, chiếc chìa khóa chính là khóa bí mật Sau đây là giải thích thuật toán RSA cryptosystem:
+ Bước 1: Khởi tạo chìa khóa (key generation)
Khoa tạo một chìa khóa bao gồm một cặp khóa công khai và một khóa riêng tư Chìa khóa công khai bao gồm một modulus N và một encryption exponent (Lũy thừa giải mã), kí hiệu là e Quá trình khởi tạo chìa khóa được tiến hành theo các bước sau đây
a) Chọn 2 số nguyên tố kí hiệu là p và q Trong ví dụ này ta chọn ngẫu nhiên 2 số 61 và 53
b) Tính modulus N = p * q = 61 * 53 = 3233
c) Tính hàm phi Euler của N as phi(N) = (p-1)*(q-1) Trong trường hợp này
là 60*52 = 3120
d) Chọn lũy thừa mã hóa e(e là 1 số nguyên tố) Trong trường hợp này ta chọn số 17
e) Tính lũy thừa giải mã d theo công thức e * d trùng 1(mod phi(N)) Nói cách khác, d là nghịch đảo nhân của e modulo phi(N) Trong trường hợp này, ta dùng thuật toán euclid mở rộng để tính d = 2753 ( vì 17 * 2753 =
1 (mod 3120))
f) An có 1 chìa khóa công khai (N, e) = (3233, 17) và 1 chìa khóa riêng tư (N, d) = 3233, 2753
+ Bước 2: Mã hóa tin nhắn: Khoa muốn gửi tin nhắn "HELLO" đến An một cách an toàn Trước tiên, anh ta chuyển đổi tin nhắn thành biểu diễn số bằng bảng ASCII Trong ví dụ này, giả sử "HELLO" ánh xạ đến số 0725112115 Sau
đó, Khoa mã hóa tin nhắn bằng khóa công khai của An như sau:
Khoa nâng biểu diễn số của thông điệp lên lũy thừa của số mũ mã hóa,
e, modulo mô đun, N: 0725112115^17 mod 3233 = 2723
Bản mật mã mà Khoa gửi cho An là 2723
Trang 12Bước 3: Giải mã tin nhắn: An nhận được bản mã và sử dụng khóa riêng của mình để giải mã tin nhắn An tính toán biểu diễn số của thông điệp văn bản thuần bằng cách nâng bản mã lên lũy thừa của số mũ giải mã d, modulo mô đun, N: 2723^2753 mod 3233 = 0725112115 Kết quả biểu diễn số là tin nhắn gốc mà Khoa đã gửi
Bước 4: Giải mã thư: An chuyển đổi biểu diễn số trở lại thư gốc bằng cách sử dụng bảng ASCII được sử dụng trong bước 2 Trong ví dụ này, An ánh xạ mỗi
số có hai chữ số trong biểu diễn số với ký tự ASCII tương ứng của nó để nhận thông báo "HELLO"
2.4 Code và kết quả:
import random
import math
def is_prime( ) n :
"""Check if a number is prime"""
n <= if 1 :
return False
elif n <= 3 :
return True
elif n % == n % == 2 0 or 3 0 :
return False
i = 5
while i * i <= n :
n % i == if 0 or n % ( i + 2 ) == 0 :
return False
i += 6
return True
def generate_key_pair( p ) :
"""Generate a key pair"""
if not ( is_prime p ( ) and is_prime ( )): q
raise ValueError ( "Both numbers must be prime." )
elif p == q :
raise ValueError ( "p and q cannot be equal." )
n = p * q
phi = p - * q - ( 1 ) ( 1 )
# Choose an integer e such that e and phi(n) are coprime
e = random.randrange ( , 1 phi )
while True :
math.gcd phi == if ( , e ) 1 :
break
e = random.randrange phi ( , 1 )
# Compute the private key
d = mod_inverse phi ( , e )
# Return public and private key pair
Trang 13"""Compute modular inverse"""
gcd x y = extended_euclidean_algorithm m , , ( , a )
gcd != if 1 :
raise ValueError ( "Modular inverse does not exist." )
return x % m
def extended_euclidean_algorithm( a , ) :
"""Extended Euclidean algorithm"""
a == if 0 :
return ( , b , 1 )
else :
gcd x y = extended_euclidean_algorithm b % a a , , ( , )
return ( gcd , y - b // a * x x ( ) , )
def encrypt( public_key , message ) :
"""Encrypt a message using the public key"""
n e = public_key ,
cipher = [ pow ord ( ( char ), e n , ) for char in message ]
return cipher
def decrypt( private_key , cipher ) :
"""Decrypt a message using the private key"""
n d = private_key ,
message = [ chr pow ( ( char , d n , )) for char cipher in ]
return ''.join message ( )
# Generate a key pair
p = 61
q = 53
public_key , private_key = generate_key_pair ( , p q )
# Encrypt a message
message = "HELLO "
cipher = encrypt ( public_key , message )
print ( cipher )
# Decrypt the message
message = decrypt ( private_key , cipher )
print ( message )
Kết quả:
Trang 14TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Wikipedia Giải thuật Euclid mở rộng
[2] https://www.youtube.com/watch?v=oEHF5ET0OZg Tiếng Anh